diff --git a/plugins/org.eclipse.wst.common.emf/.classpath b/plugins/org.eclipse.wst.common.emf/.classpath
deleted file mode 100644
index de9605d..0000000
--- a/plugins/org.eclipse.wst.common.emf/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="wtpemf/"/>
-	<classpathentry kind="src" path="workbench/"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/plugins/org.eclipse.wst.common.emf/.cvsignore b/plugins/org.eclipse.wst.common.emf/.cvsignore
deleted file mode 100644
index 2a090b6..0000000
--- a/plugins/org.eclipse.wst.common.emf/.cvsignore
+++ /dev/null
@@ -1,7 +0,0 @@
-bin
-runtime
-temp.folder
-build.xml
-org.eclipse.wst.common.emf_1.0.0.zip
-src.zip
-@dot
diff --git a/plugins/org.eclipse.wst.common.emf/.project b/plugins/org.eclipse.wst.common.emf/.project
deleted file mode 100644
index 5b5f0fe..0000000
--- a/plugins/org.eclipse.wst.common.emf/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.common.emf</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.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/plugins/org.eclipse.wst.common.emf/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.common.emf/META-INF/MANIFEST.MF
deleted file mode 100644
index 472cff0..0000000
--- a/plugins/org.eclipse.wst.common.emf/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,18 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: EMF Utilities
-Bundle-SymbolicName: org.eclipse.wst.common.emf; singleton:=true
-Bundle-Version: 1.0.1.qualifier
-Bundle-Activator: org.eclipse.wst.common.internal.emf.plugin.EcoreUtilitiesPlugin
-Bundle-Vendor: Eclipse.org
-Bundle-Localization: plugin
-Export-Package: .,
- org.eclipse.wst.common.internal.emf.plugin,
- org.eclipse.wst.common.internal.emf.resource,
- org.eclipse.wst.common.internal.emf.utilities
-Require-Bundle: org.eclipse.emf.ecore.xmi,
- org.eclipse.wst.common.frameworks,
- org.eclipse.core.runtime,
- org.eclipse.core.resources,
- org.eclipse.jem.util
-Eclipse-AutoStart: true
diff --git a/plugins/org.eclipse.wst.common.emf/about.html b/plugins/org.eclipse.wst.common.emf/about.html
deleted file mode 100644
index 6f6b96c..0000000
--- a/plugins/org.eclipse.wst.common.emf/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>February 24, 2005</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/plugins/org.eclipse.wst.common.emf/build.properties b/plugins/org.eclipse.wst.common.emf/build.properties
deleted file mode 100644
index b37b0c5..0000000
--- a/plugins/org.eclipse.wst.common.emf/build.properties
+++ /dev/null
@@ -1,22 +0,0 @@
-###############################################################################
-# Copyright (c) 2003, 2004 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-# IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes = plugin.xml,\
-               META-INF/,\
-               about.html,\
-               plugin.properties,\
-               .,\
-               schema/
-jars.compile.order = .
-src.includes = component.xml,\
-               schema/
-output.. = bin/
-source.. = wtpemf/,\
-           workbench/
diff --git a/plugins/org.eclipse.wst.common.emf/component.xml b/plugins/org.eclipse.wst.common.emf/component.xml
deleted file mode 100644
index 9530d33..0000000
--- a/plugins/org.eclipse.wst.common.emf/component.xml
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><component  xmlns="http://eclipse.org/wtp/releng/tools/component-model" name="org.eclipse.wst.common.emf"><component-depends unrestricted="true"></component-depends><plugin id="org.eclipse.wst.common.emf" fragment="false"/><plugin id="org.eclipse.wst.common.emfworkbench.integration" fragment="false"/></component>
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/plugin.properties b/plugins/org.eclipse.wst.common.emf/plugin.properties
deleted file mode 100644
index dda8cb4..0000000
--- a/plugins/org.eclipse.wst.common.emf/plugin.properties
+++ /dev/null
@@ -1 +0,0 @@
-PackageURIMap=PackageURIMap
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/plugin.xml b/plugins/org.eclipse.wst.common.emf/plugin.xml
deleted file mode 100644
index f74b398..0000000
--- a/plugins/org.eclipse.wst.common.emf/plugin.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-     <extension-point id="packageURIMap" name="%PackageURIMap" schema="schema/packageURIMap.exsd"/>
-
-<!-- Need to register the Ecore specific package mappings -->
-   <extension
-         point="org.eclipse.wst.common.emf.packageURIMap">
-      <map
-            uri="http://www.eclipse.org/emf/2002/Ecore"
-            prefix="ecore">
-      </map>
-      <map
-            uri="http://www.eclipse.org/emf/2002/Mapping"
-            prefix="mapping">
-      </map>
-<!-- Trick to get Mapping.xmi for MOF5 serialization -->
-      <map
-            uri="http://www.eclipse.org/emf/2002/Mapping"
-            prefix="Mapping">
-      </map>
-   </extension>
-   
-      <extension
-         point="org.eclipse.jem.util.uiContextSensitiveClass">
-      <uiContextSensitiveClass
-            context="Headless"
-            key="rendererFactory"
-            className="org.eclipse.wst.common.internal.emf.resource.EMF2DOMRendererFactory">
-      </uiContextSensitiveClass>
-   </extension>
-
-</plugin>
diff --git a/plugins/org.eclipse.wst.common.emf/prepareforpii.xml b/plugins/org.eclipse.wst.common.emf/prepareforpii.xml
deleted file mode 100644
index 8007604..0000000
--- a/plugins/org.eclipse.wst.common.emf/prepareforpii.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<project name="PrepareForPII" default="main" basedir=".">
-		
-	<!-- Setup temp variables -->
-	<target name="init">
-		<property name="nlsDir" value="d:/NLS/Corona/0526"/>
-		<property name="plugin" value="com.ibm.wtp.emf"/>
-		<property name="plugindir" value="d:/workspaceCorona/${plugin}"/>
-		<property name="outputDir" value="${nlsDir}/${plugin}"/>
-		
-	
-	</target>
-
-	<!-- Create the destination dir -->
-	<target name="nlsDir" depends="init">
-		<mkdir dir="${nlsDir}"/>
-	</target>
-	
-	<!-- Create the destination dir -->
-	<target name="plugindir" depends="nlsDir">
-		<delete dir="${outputDir}"/>
-		<mkdir dir="${outputDir}"/>
-	</target>
-
-	<!-- Move the files to the correct locations in the workspace. -->
-	<target name="main" depends="plugindir">
-	
-		<messageIdGen folderPath = "${plugindir}" componentId = "E" />
-		
-		<copy todir = "${outputDir}/wtpemf" >
-			 <fileset dir="${plugindir}/wtpemf">
-           	  <include name="**/*.properties"/>
-  			 </fileset>
-  		</copy>
-  		
-  		
-	</target>
-</project>
diff --git a/plugins/org.eclipse.wst.common.emf/schema/packageURIMap.exsd b/plugins/org.eclipse.wst.common.emf/schema/packageURIMap.exsd
deleted file mode 100644
index 4f9d955..0000000
--- a/plugins/org.eclipse.wst.common.emf/schema/packageURIMap.exsd
+++ /dev/null
@@ -1,113 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.common.emf">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.common.emf" id="packageURIMap" name="%PackageURIMap"/>
-      </appInfo>
-      <documentation>
-         This extension point is used to register package mappings.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="map" 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="map">
-      <complexType>
-         <attribute name="uri" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="prefix" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;This extension point is part of an interim API that is still under development and expected to change significantly before reaching stability. It is being made available at this early stage to solicit feedback from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken (repeatedly) as the API evolves.&lt;/b&gt;
-      </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) 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/plugins/org.eclipse.wst.common.emf/workbench/org/eclipse/wst/common/internal/emf/plugin/EcoreUtilitiesPlugin.java b/plugins/org.eclipse.wst.common.emf/workbench/org/eclipse/wst/common/internal/emf/plugin/EcoreUtilitiesPlugin.java
deleted file mode 100644
index 0f04416..0000000
--- a/plugins/org.eclipse.wst.common.emf/workbench/org/eclipse/wst/common/internal/emf/plugin/EcoreUtilitiesPlugin.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Jun 9, 2003
- *
- * To change the template for this generated file go to
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
-package org.eclipse.wst.common.internal.emf.plugin;
-
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.wst.common.internal.emf.resource.RendererFactory;
-import org.osgi.framework.BundleContext;
-
-/**
- * @author DABERG
- * 
- * To change the template for this generated type comment go to Window>Preferences>Java>Code
- * Generation>Code and Comments
- */
-public class EcoreUtilitiesPlugin extends Plugin {
-	public static final String ID = "org.eclipse.wst.common.emf"; //$NON-NLS-1$
-
-	/**
-	 * @param descriptor
-	 */
-	public EcoreUtilitiesPlugin() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.Plugin#startup()
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		RendererFactory.setDefaultHandler(PluginRendererFactoryDefaultHandler.INSTANCE);
-		PackageURIMapReader reader = new PackageURIMapReader();
-		reader.processExtensions();
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/workbench/org/eclipse/wst/common/internal/emf/plugin/PackageURIMapReader.java b/plugins/org.eclipse.wst.common.emf/workbench/org/eclipse/wst/common/internal/emf/plugin/PackageURIMapReader.java
deleted file mode 100644
index 68b9fe4..0000000
--- a/plugins/org.eclipse.wst.common.emf/workbench/org/eclipse/wst/common/internal/emf/plugin/PackageURIMapReader.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.plugin;
-
-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.wst.common.internal.emf.resource.CompatibilityPackageMappingRegistry;
-
-/**
- * This reader will read the packageURIMap extension point and populate the
- * CompatibilityPackageMappingRegistry.
- * 
- * The packageURIMap will have the following configuration element.
- * 
- * <map prefix="somePackagePrefix" uri="somePackageURI"/>
- *  
- */
-public class PackageURIMapReader {
-	private static final String URI_ATT_NAME = "uri"; //$NON-NLS-1$
-	private static final String PREFIX_ATT_NAME = "prefix"; //$NON-NLS-1$
-	private static final String EXTENSION_POINT_NAME = "packageURIMap"; //$NON-NLS-1$
-
-	/**
-	 *  
-	 */
-	public PackageURIMapReader() {
-		super();
-	}
-
-	private IExtensionPoint getExtensionPoint() {
-		return Platform.getExtensionRegistry().getExtensionPoint(EcoreUtilitiesPlugin.ID, EXTENSION_POINT_NAME);
-	}
-
-	/**
-	 * Call this method to read and process all of the packageURIMap extensions. *
-	 */
-	public void processExtensions() {
-		CompatibilityPackageMappingRegistry reg = CompatibilityPackageMappingRegistry.INSTANCE;
-		IExtension[] extensions = getExtensionPoint().getExtensions();
-		for (int i = 0; i < extensions.length; i++)
-			processExtension(extensions[i], reg);
-	}
-
-	/**
-	 * @param extension
-	 */
-	private void processExtension(IExtension extension, CompatibilityPackageMappingRegistry reg) {
-		IConfigurationElement[] configs = extension.getConfigurationElements();
-		for (int i = 0; i < configs.length; i++)
-			processConfiguration(configs[i], reg);
-	}
-
-	/**
-	 * @param element
-	 */
-	private void processConfiguration(IConfigurationElement element, CompatibilityPackageMappingRegistry reg) {
-		String prefix = element.getAttribute(PREFIX_ATT_NAME);
-		String uri = element.getAttribute(URI_ATT_NAME);
-		reg.registerPrefixToPackageURI(prefix, uri);
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/workbench/org/eclipse/wst/common/internal/emf/plugin/PluginRendererFactoryDefaultHandler.java b/plugins/org.eclipse.wst.common.emf/workbench/org/eclipse/wst/common/internal/emf/plugin/PluginRendererFactoryDefaultHandler.java
deleted file mode 100644
index c24392a..0000000
--- a/plugins/org.eclipse.wst.common.emf/workbench/org/eclipse/wst/common/internal/emf/plugin/PluginRendererFactoryDefaultHandler.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Dec 1, 2003
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.wst.common.internal.emf.plugin;
-
-import org.eclipse.jem.util.UIContextDetermination;
-import org.eclipse.wst.common.internal.emf.resource.EMF2DOMRendererFactoryDefaultHandler;
-import org.eclipse.wst.common.internal.emf.resource.RendererFactory;
-
-/**
- * @author schacher
- * 
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public class PluginRendererFactoryDefaultHandler extends EMF2DOMRendererFactoryDefaultHandler {
-
-	static final PluginRendererFactoryDefaultHandler INSTANCE = new PluginRendererFactoryDefaultHandler();
-	static final String EXT_POINT_NAME = "rendererFactory"; //$NON-NLS-1$
-
-	/**
-	 *  
-	 */
-	protected PluginRendererFactoryDefaultHandler() {
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.EMF2DOMRendererFactoryDefaultHandler#getDefaultRendererFactory()
-	 */
-	public RendererFactory getDefaultRendererFactory() {
-		RendererFactory aFactory = (RendererFactory) UIContextDetermination.createInstance(EXT_POINT_NAME);
-		return aFactory == null ? super.getDefaultRendererFactory() : aFactory;
-	}
-
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/AbstractRendererImpl.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/AbstractRendererImpl.java
deleted file mode 100644
index 9112aef..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/AbstractRendererImpl.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.resource;
-
-
-public abstract class AbstractRendererImpl implements Renderer {
-
-
-	protected TranslatorResource resource;
-	private int versionId;
-	private boolean validating = true;
-
-	/**
-	 * Constructor for AbstractRendererImpl.
-	 */
-	public AbstractRendererImpl() {
-		super();
-	}
-
-	/**
-	 * @see com.ibm.etools.emf2xml.Renderer#setResource(TranslatorResource)
-	 */
-	public void setResource(TranslatorResource aResource) {
-		resource = aResource;
-	}
-
-	/**
-	 * @see com.ibm.etools.emf2xml.Renderer#getResource()
-	 */
-	public TranslatorResource getResource() {
-		return resource;
-	}
-
-	public int getVersionId() {
-		return this.versionId;
-	}
-
-	public void setVersionId(int versionId) {
-		this.versionId = versionId;
-	}
-
-	/**
-	 * @return
-	 */
-	public boolean isValidating() {
-		return validating;
-	}
-
-	/**
-	 * @param b
-	 */
-	public void setValidating(boolean b) {
-		validating = b;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.Renderer#accessForRead()
-	 */
-	public void accessForRead() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.Renderer#accessForWrite()
-	 */
-	public void accessForWrite() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.Renderer#isModified()
-	 */
-	public boolean isModified() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.Renderer#isShared()
-	 */
-	public boolean isShared() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.Renderer#isSharedForWrite()
-	 */
-	public boolean isSharedForWrite() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.Renderer#preDelete()
-	 */
-	public void preDelete() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.Renderer#preUnload()
-	 */
-	public void preUnload() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.Renderer#releaseFromRead()
-	 */
-	public void releaseFromRead() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.Renderer#releaseFromWrite()
-	 */
-	public void releaseFromWrite() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.Renderer#setBatchMode(boolean)
-	 */
-	public void setBatchMode(boolean isBatch) {
-	}
-
-	public boolean useStreamsForIO() {
-		return true;
-	}
-
-	public boolean isBatchMode() {
-		return false;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/AttributeTranslatorFilter.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/AttributeTranslatorFilter.java
deleted file mode 100644
index b0d0869..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/AttributeTranslatorFilter.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- **************************************************************************************************/
-/*
- * Created on Sep 21, 2003
- *  
- */
-package org.eclipse.wst.common.internal.emf.resource;
-
-
-public final class AttributeTranslatorFilter extends TranslatorFilter {
-
-	public AttributeTranslatorFilter() {
-		super(null, -1);
-	}
-
-	public AttributeTranslatorFilter(Translator trans, int version) {
-		super(trans, version);
-	}
-
-	public final int scanNextTranslator(Translator[] children, int start) {
-		int found = start + 1;
-		for (; found < children.length; ++found) {
-			if (children[found].isDOMAttribute())
-				break;
-		}
-		found = (found < children.length) ? found : -1;
-		return found;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CacheEventNode.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CacheEventNode.java
deleted file mode 100644
index e575833..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CacheEventNode.java
+++ /dev/null
@@ -1,585 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.resource;
-
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.ecore.EObject;
-import org.xml.sax.Attributes;
-
-
-/**
- * CacheEventNodes (CENOs) store information collected from SAX Events. This information can then be
- * used once all necessary SAX Events have been generated to create and/or set values on EMF model
- * objects.
- * 
- * CacheEventNodes (CENOs) have a simple lifecycle: initialize, collect data, commit, discard. When
- * initialized, CENOs will attempt to find the appropriate translator for a given XML element name,
- * and also create/set any necessary EMF model values. Data is collected as SAX character() events
- * are generated. On the SAX endElement event, the CENO is committed(), which is where it will
- * complete its processing to create EMF model features. In those cases where it cannot complete its
- * processing, it will defer its processing to the updateEMF() method of its parent. Defered
- * processing is necessary to handle EMF features that require read ahead cues from the XML. CENOs
- * will add themselves to their parents as children in a tree data structure. When an CENO
- * determines it is the golden piece of information required to instantiate its parent feature, it
- * will trigger its parent CENO to process the rest of the cached CENO tree. As mentioned, the
- * building of a CENO tree will only occur for nodes with read ahead cues.
- * 
- * discard() is invoked by init() to ensure that no junk state is left from a previous use of the
- * CENO. commit() will call discard as needed. Because of the use of discard, CENOs can be pooled
- * and reused. If a CENO determines that it is contained in a pool, it will manage its own release
- * from that pool. Self- management is necessary because of the way in which CENOs might cache
- * certain children while waiting to create the parent EMF feature.
- * 
- * @author mdelder
- */
-public class CacheEventNode {
-
-	public static final String ROOT_NODE = "EMF_ROOT_NODE"; //$NON-NLS-1$
-
-	private String nodeName = null;
-	private Translator translator = null;
-	private Notifier emfOwner = null;
-	private StringBuffer buffer = null;
-	private List children = null;
-	private int versionID;
-
-	/*
-	 * The internal data structure used to store the attributes is a String[]. The choice was made
-	 * to use an array to avoid the creation of another object (probably a Hashtable) and to exploit
-	 * array-access times to get the name and value of the attributes (opposed to full fledged
-	 * method invocations).
-	 *  
-	 */
-	private String[] attributes = null;
-	private CacheEventNode parent = null;
-	private CacheEventPool containingPool = null;
-	private Boolean ignorable = null;
-
-	public CacheEventNode(CacheEventPool containingPool) {
-		this.containingPool = containingPool;
-	}
-
-	/**
-	 * Lifecycle method. init(TranslatorResource) will configure this Adapter as a ROOT node.
-	 * 
-	 * This method will invoke discard() before completing its tasks.
-	 */
-	public void init(TranslatorResource resource) {
-		this.discard();
-		this.setEmfOwner(resource);
-		this.setTranslator(resource.getRootTranslator());
-		this.setVersionID(resource.getVersionID());
-		this.nodeName = CacheEventNode.ROOT_NODE;
-	}
-
-	/**
-	 * Lifecycle method. init(CacheEventNode, String, Attributes) will configure this Adapter to be
-	 * a non-ROOT node of the Adapter data structure
-	 * 
-	 * This method will invoke discard() before completing its tasks.
-	 */
-	public void init(CacheEventNode parentArg, String nodeNameArg, Attributes attributesArg) {
-		this.discard();
-		this.nodeName = nodeNameArg;
-		init(parentArg, attributesArg);
-	}
-
-	private void init(CacheEventNode parentRecord, Attributes attributesArg) {
-		setParent(parentRecord);
-
-		setAttributes(attributesArg);
-		if (parent != null) {
-			/* I am not the root */
-
-			/*
-			 * If the parent is part of the DOM Path, then we ignore it and interact with the grand
-			 * parent
-			 */
-			if (parent.translator != null && parent.isInDOMPath()) {
-				setParent(parent.getParent());
-			}
-
-			setVersionID(parent.getVersionID());
-			if (parent.getEmfOwner() != null && parent.getTranslator() != null) {
-
-				/* My parent had enough information to create themself */
-
-				if (parent.getParent() != null) {
-					setTranslator(parent.getTranslator().findChild(nodeName, parent.getEmfOwner(), getVersionID()));
-
-				} else {
-					setTranslator(parent.getTranslator());
-				}
-
-				if (this.translator == null) {
-					/* Our translator is null! Ahh! Run! */
-					throw new IllegalStateException("Parent Translator (" + parent.getTranslator() + //$NON-NLS-1$
-								") did not find a Child Translator for \"" + //$NON-NLS-1$ 
-								nodeName + "\"."); //$NON-NLS-1$
-				}
-
-				if (this.translator.getReadAheadHelper(nodeName) == null && !this.translator.isManagedByParent()) {
-					/*
-					 * I do not require a read ahead cue, and I am not managed by my parent so I can
-					 * create an instance of my EMF object
-					 */
-
-					Notifier myEmfOwner = this.translator.createEMFObject(getNodeName(), null);
-					setEmfOwner(myEmfOwner);
-					this.translator.setMOFValue(parent.getEmfOwner(), myEmfOwner);
-				}
-				/*
-				 * Else I require a read ahead value or I am being managed by my parent, so I have
-				 * no need to create an EMF object
-				 */
-			}
-			/*
-			 * Else I am not mapped to the EMF stack (XML Elements found in the DOMPath are ignored)
-			 */
-		}
-		/* processAttributes is guarded and will not execute unless ready */
-		processAttributes();
-
-	}
-
-	/**
-	 * commit() is invoked only if the CacheEventNode (CENO) has all the information they need and
-	 * should be able to determine what to do to the EMF feature.
-	 * 
-	 * The commit() method will invoke discard() when it has completed its tasks, if needed. Thus,
-	 * after invoking this method, the CENO may have no meaningful state. If discard() is invoked,
-	 * all previously held reference will be released in order to be made eligible for Garbage
-	 * Collection.
-	 *  
-	 */
-	public void commit() {
-
-		if (parent == null || this.isIgnorable()) {
-			discard();
-			releaseFromContainingPool();
-			return;
-		}
-
-		ReadAheadHelper helper = null;
-		Translator activeTranslator = getTranslator();
-		Translator parentTranslator = getParent().getTranslator();
-
-		if (parent != null && parent.getEmfOwner() == null) {
-
-			/*
-			 * Not enough information yet, add the CacheEventNode to the DOM Cache tree
-			 */
-
-			parent.appendToBuffer(this);
-			if ((helper = getParent().getReadAheadHelper()) != null) {
-				/*
-				 * If the parentRecord's emfOwner is null, then it must not be initialized therefore
-				 * it or one of its ancestors must require read ahead clues
-				 * 
-				 * The following if statement checks if the parent is the node waiting for a
-				 * readAhead cue
-				 */
-				EObject parentOwner = null;
-				if (helper.nodeValueIsReadAheadName(getNodeName())) {
-					/* The readAheadName is the value of the qName child node */
-
-					/* We have enough information to create the EmfOwner in the parent! */
-					parentOwner = parentTranslator.createEMFObject(getParent().getNodeName(), getBuffer());
-
-					/*
-					 * Now we need to parse the cached DOM tree and update the emfOwner of the
-					 * parent
-					 */
-					getParent().updateEMF(parentOwner);
-
-				} else if (helper.nodeNameIsReadAheadName(getNodeName())) {
-					/* The readAheadName is the actual name of the child node (qName) */
-
-					/* We have enough information to create the EmfOwner in the parent! */
-					parentOwner = parentTranslator.createEMFObject(getParent().getNodeName(), getNodeName());
-
-					/*
-					 * Now we need to parse the cached DOM tree and update the emfOwner of the
-					 * parent
-					 */
-					getParent().updateEMF(parentOwner);
-				}
-
-			} /* Else an ancestor of the parent is waiting */
-
-		} else {
-			if (activeTranslator != null) {
-				if (activeTranslator.isManagedByParent()) {
-
-					Object value = activeTranslator.convertStringToValue(getNodeName(), null, getBuffer(), getParent().getEmfOwner());
-					activeTranslator.setMOFValue(getParent().getEmfOwner(), value);
-					processAttributes();
-				} else {
-
-					activeTranslator.setTextValueIfNecessary(getBuffer(), getEmfOwner(), getVersionID());
-				}
-
-			}
-			discard();
-			releaseFromContainingPool();
-		}
-	}
-
-	/**
-	 * Instruct the CacheEventNode to discard all references to make everything eligible for garbage
-	 * collection. This should ONLY be called after commit has succeeded. In the case of EMF
-	 * features that require a readAheadName, process not be completed in commit(), but rather will
-	 * be defered to the updateEMF() method. This method was made private specifically because it
-	 * could erase all information contained in the CacheEventNode before it has been processed.
-	 *  
-	 */
-	private void discard() {
-		translator = null;
-		emfOwner = null;
-		buffer = null;
-		if (children != null)
-			children.clear();
-		children = null;
-		attributes = null;
-		parent = null;
-	}
-
-	private void releaseFromContainingPool() {
-		if (containingPool != null)
-			containingPool.releaseNode(this);
-	}
-
-	public boolean isIgnorable() {
-		if (ignorable == null) {
-			boolean result = false;
-			if (this.translator != null) {
-				if (this.translator.isEmptyContentSignificant()) {
-					result = false;
-				} else {
-					String domPath = this.translator.getDOMPath();
-					result = (domPath != null) ? domPath.indexOf(this.nodeName) >= 0 : false;
-				}
-			}
-			ignorable = result ? Boolean.TRUE : Boolean.FALSE;
-		}
-		return ignorable.booleanValue();
-	}
-
-	/**
-	 * Determines if a given child has a translator.
-	 * 
-	 * @param childNodeName
-	 *            the name of the current XML child node
-	 * @return true only if the childNodeName can be ignored (e.g. it is part of the DOM Path)
-	 */
-	public boolean isChildIgnorable(String childNodeName) {
-		boolean result = false;
-
-		Translator childTranslator = null;
-		if (this.getTranslator() != null) {
-			childTranslator = this.getTranslator().findChild(childNodeName, this.getEmfOwner(), this.getVersionID());
-
-			if (childTranslator != null) {
-				if (childTranslator.isEmptyContentSignificant()) {
-					result = false;
-				} else {
-					String temp = null;
-					result = ((temp = childTranslator.getDOMPath()) != null) ? temp.indexOf(childNodeName) >= 0 : false;
-				}
-			}
-		}
-
-		return result;
-	}
-
-	public boolean isInDOMPath() {
-		boolean result = false;
-
-		if (this.getTranslator() != null) {
-
-			result = this.getNodeName().equals(this.getTranslator().getDOMPath());
-		}
-
-		return result;
-	}
-
-	public String toString() {
-		StringBuffer output = new StringBuffer("CacheEventNode[");//$NON-NLS-1$
-		output.append("nodeName=");//$NON-NLS-1$
-		output.append(nodeName);
-		output.append("; translator=");//$NON-NLS-1$
-		output.append(translator);
-		output.append("; emfOwner=");//$NON-NLS-1$
-		try {
-			output.append(emfOwner);
-		} catch (RuntimeException re) {
-			output.append("Could not render as string!");//$NON-NLS-1$
-		}
-		output.append("; buffer=");//$NON-NLS-1$
-		output.append(this.buffer);
-		output.append("; hasChildren=");//$NON-NLS-1$
-		output.append((children != null && children.size() > 0));
-		if (children != null) {
-			for (int i = 0; i < this.children.size(); i++) {
-				output.append("\n\tchildren(");//$NON-NLS-1$
-				output.append(i);
-				output.append("): ");//$NON-NLS-1$
-				output.append(this.children.get(i));
-			}
-		}
-		output.append("]");//$NON-NLS-1$
-		return output.toString();
-	}
-
-	/**
-	 * Updates the EMF model by creating EMF Features as necessary from the DOM Tree Cache
-	 * 
-	 * @param owner
-	 */
-	public void updateEMF(EObject owner) {
-		this.setEmfOwner(owner);
-		if (this.parent != null) {
-			this.translator.setMOFValue((EObject) this.parent.getEmfOwner(), owner);
-			this.processAttributes();
-		}
-
-		this.updateEMF();
-	}
-
-	/**
-	 * The translator and the owner of the parent CENO passed to this method should be nonnull
-	 */
-	public void updateEMF() {
-		if (this.children == null)
-			return;
-
-		CacheEventNode child = null;
-		Translator childTranslator = null;
-		Object value = null;
-		if (this.getEmfOwner() != null) {
-			Notifier parentOwner = this.getEmfOwner();
-			Translator parentTranslator = this.getTranslator();
-			for (int i = 0; i < this.children.size(); i++) {
-
-				child = (CacheEventNode) this.children.get(i); /* Create the EMF feature */
-				if (this.isChildIgnorable(child.getNodeName())) {
-					this.addChildren(child.getChildren());
-				} else {
-					childTranslator = parentTranslator.findChild(child.getNodeName(), parentOwner, child.getVersionID());
-					child.setTranslator(childTranslator);
-
-					value = childTranslator.convertStringToValue(child.getNodeName(), null, child.getBuffer(), parentOwner);
-					childTranslator.setMOFValue(parentOwner, value);
-
-					if (childTranslator.isObjectMap()) {
-						child.setEmfOwner((Notifier) value);
-						childTranslator.setTextValueIfNecessary(child.getBuffer(), child.getEmfOwner(), getVersionID());
-					}
-
-					child.processAttributes();
-					child.updateEMF(); /* update the EMF of the child */
-
-				}
-				child.discard();
-				child.releaseFromContainingPool();
-			}
-			this.children = null;
-		}
-	}
-
-	public void addChild(CacheEventNode child) {
-		if (this.children == null) {
-			this.children = new ArrayList();
-		}
-		if (parent != null && this.isIgnorable()) {
-			parent.addChild(child);
-		} else {
-			this.children.add(child);
-		}
-	}
-
-	protected void addChildren(List childrenArg) {
-		if (this.children == null) {
-			this.children = new ArrayList();
-		}
-		this.children.addAll(childrenArg);
-	}
-
-	public boolean removeChild(CacheEventNode child) {
-		if (this.children == null) {
-			return false;
-		}
-		return this.children.remove(child);
-	}
-
-	public List getChildren() {
-		return this.children;
-	}
-
-	public ReadAheadHelper getReadAheadHelper() {
-		if (this.translator != null && this.translator.hasReadAheadNames()) {
-			return translator.getReadAheadHelper(nodeName);
-		}
-		return null;
-	}
-
-
-	/* See the documentation for the attributes field for info on how it is structured */
-	public void setAttributes(Attributes attr) {
-
-		/*
-		 * The attributes returned from the parser may be stored by reference, so we must copy them
-		 * over to a local data store
-		 */
-		if (attr != null && attr.getLength() > 0) {
-
-			if (this.attributes == null) {
-				this.attributes = new String[attr.getLength() * 2];
-			}
-			for (int i = 0; i < attr.getLength(); i++) {
-				this.attributes[i] = attr.getQName(i);
-				this.attributes[i + attr.getLength()] = attr.getValue(i);
-			}
-
-		}
-	}
-
-	/**
-	 * processAttributes may be invoked multiple times. It is configured to only carry out the
-	 * processing one time. After it successfully completes the construction of Translators and
-	 * values it will discard the value of the attributes field by setting it to null.
-	 *  
-	 */
-	public void processAttributes() {
-		/* See the documentation for the attributes field for info on how it is structured */
-		if (this.attributes != null && this.attributes.length > 0) {
-
-			if (this.emfOwner != null && this.translator != null) {
-				Translator attrTranslator = null;
-				final int limit = this.attributes.length / 2;
-				Object value = null;
-				for (int i = 0; i < limit; i++) {
-
-					/* Find the attribute translator by using the attribute name (attributes[i]) */
-					attrTranslator = this.translator.findChild(this.attributes[i], this.emfOwner, this.versionID);
-
-					if (attrTranslator != null) {
-
-						/*
-						 * Convert the value of corresponding attribute value (attributes[i+limit])
-						 * to a meaningful value
-						 */
-						value = attrTranslator.convertStringToValue(this.attributes[i + limit], (EObject) this.emfOwner);
-						attrTranslator.setMOFValue((EObject) this.emfOwner, value);
-					}
-				}
-
-				/* Forget the attributes so we do not process them again */
-				this.attributes = null;
-			}
-		}
-	}
-
-	/**
-	 * Appends data to the buffer stored by this CENO. Text will be extracted from the data array
-	 * begining at positiong <i>start </i> and ending at position <i>start+length </i>.
-	 * 
-	 * @param data
-	 * @param start
-	 * @param length
-	 */
-	public void appendToBuffer(char[] data, int start, int length) {
-
-		if (parent != null && this.isIgnorable()) {
-			parent.appendToBuffer(data, start, length);
-			return;
-		}
-
-		if (buffer == null) {
-			this.buffer = new StringBuffer();
-		}
-
-		/*
-		 * acts as a more efficient form of "append". Using this method avoids the need to copy the
-		 * data into its own data structure (e.g. String) before being added to the buffer
-		 */
-		this.buffer.insert(buffer.length(), data, start, length);
-
-	}
-
-	/**
-	 * Add the given CENO as a child of this CENO.
-	 * 
-	 * @param record
-	 */
-	public void appendToBuffer(CacheEventNode record) {
-
-		this.addChild(record);
-	}
-
-	public String getBuffer() {
-		if (this.buffer == null) {
-			return null;
-		}
-		return this.buffer.toString();
-	}
-
-	public Notifier getEmfOwner() {
-		return emfOwner;
-	}
-
-	public CacheEventNode getParent() {
-		return parent;
-	}
-
-	private void setParent(CacheEventNode record) {
-		this.parent = record;
-	}
-
-	public Translator getTranslator() {
-		return this.translator;
-	}
-
-	public void setEmfOwner(Notifier notifier) {
-
-		this.emfOwner = notifier;
-	}
-
-	public void setTranslator(Translator translator) {
-		this.translator = translator;
-	}
-
-	public String getNodeName() {
-		return nodeName;
-	}
-
-	public int getVersionID() {
-
-		if (this.parent == null) {
-			try {
-				return ((TranslatorResource) this.getEmfOwner()).getVersionID();
-
-			} catch (RuntimeException re) {
-			}
-		}
-		return this.versionID;
-	}
-
-	public void setVersionID(int i) {
-		versionID = i;
-	}
-
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CacheEventPool.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CacheEventPool.java
deleted file mode 100644
index 55799e2..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CacheEventPool.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.resource;
-
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.xml.sax.Attributes;
-
-/**
- * Provides an instance pool of reusable CacheEventNodes. The pool will default to 10 live
- * instances. When its available instances reach five times its initial capacity, it will shrink
- * itself down to the initial capacity.
- * 
- * @author mdelder
- */
-public class CacheEventPool {
-
-	public static final int DEFAULT_CAPACITY = 10;
-	public static final int DEFAULT_CAPACITY_INCREMENT = 25;
-
-	private int poolCapacity = DEFAULT_CAPACITY;
-	private CacheEventStack availablePool = null;
-	private Collection inusePool = null;
-
-	public CacheEventPool() {
-		this(DEFAULT_CAPACITY);
-	}
-
-	/**
-	 * Create a CacheEventPOol with the given initial capacity
-	 * 
-	 * @param initialCapacity
-	 *            The number of available instances to create.
-	 */
-	public CacheEventPool(int initialCapacity) {
-		poolCapacity = (initialCapacity > 0) ? initialCapacity : DEFAULT_CAPACITY;
-		availablePool = new CacheEventStack();
-		inusePool = new ArrayList(poolCapacity);
-	}
-
-	/**
-	 * Create a CacheEventNode (CENO) initialized to use the given resource as its EMF Owner.
-	 * 
-	 * THIS METHOD SHOULD ONLY BE USED TO CREATE ROOT NODES.
-	 * 
-	 * @param resource
-	 *            the resource that will be populated
-	 * @return a CacheEventNode to serve as the root.
-	 */
-	public CacheEventNode createCacheEventNode(TranslatorResource resource) {
-		CacheEventNode adapter = fetchFreeNode();
-		adapter.init(resource);
-		return adapter;
-	}
-
-	/**
-	 * Create child CacheEventNodes (CENOs) that will branch from the given parent.
-	 * 
-	 * @param parent
-	 *            the containing CENO
-	 * @param nodeName
-	 *            The value of the XML element node name
-	 * @param attributes
-	 *            The attributes that were part of the given XML element
-	 * @return A CENO that has been properly initialized.
-	 */
-	public CacheEventNode createCacheEventNode(CacheEventNode parent, String nodeName, Attributes attributes) {
-		CacheEventNode adapter = fetchFreeNode();
-		adapter.init(parent, nodeName, attributes);
-		return adapter;
-	}
-
-	/**
-	 * Release the CacheEventNode CENO back to the pool of availabe instances. This method should
-	 * not be invoked directly. CENOs which are acquired from a given pool will automatically
-	 * release themselves when necessary.
-	 * 
-	 * @param adapter
-	 */
-	public void releaseNode(CacheEventNode adapter) {
-		freeNode(adapter);
-	}
-
-	/**
-	 * freezePool() should be invoked to free any unused resources. After freezePool has been
-	 * invoked, warmPool() will need to be invoked before the pool can be used again.
-	 *  
-	 */
-	public void freezePool() {
-		availablePool.clear();
-		availablePool = null;
-	}
-
-	/**
-	 * warmPool() must be invoked to notify the pool it is about to be used. This should occur only
-	 * once per document rendering. Until the pool is in use, it contains no available
-	 * CacheEventNodes (CENOs) in order to limit the size of the in-memory footprint of the
-	 * EMF2SAXWriter.
-	 *  
-	 */
-	public void warmPool() {
-		ensureMinimumCapacity();
-	}
-
-	private CacheEventNode fetchFreeNode() {
-		CacheEventNode result = null;
-
-		if (availablePool == null || availablePool.isEmpty())
-			warmPool();
-
-		result = availablePool.pop();
-		inusePool.add(result);
-
-		return result;
-	}
-
-	private void freeNode(CacheEventNode adapter) {
-		if (inusePool.remove(adapter))
-			availablePool.push(adapter);
-		//else
-		//	throw new IllegalStateException("Adapter not contained in pool!");
-		if (availablePool.size() > (5 * poolCapacity)) {
-			availablePool.clear();
-			ensureMinimumCapacity();
-		}
-	}
-
-	private void ensureMinimumCapacity() {
-		if (availablePool == null) {
-			availablePool = new CacheEventStack();
-		}
-		if (availablePool.size() < poolCapacity) {
-			final int minimumCapacity = poolCapacity - availablePool.size();
-			for (int i = 0; i < minimumCapacity; i++)
-				availablePool.push(new CacheEventNode(this));
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CacheEventStack.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CacheEventStack.java
deleted file mode 100644
index 03f4198..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CacheEventStack.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Sep 24, 2003
- *
- */
-package org.eclipse.wst.common.internal.emf.resource;
-
-import java.util.ArrayList;
-import java.util.EmptyStackException;
-
-/**
- * An unsynchronized implementation of a Stack (LIFO) data structure. No casting is required when
- * using this data structure.
- * 
- * @author mdelder
- */
-public class CacheEventStack extends ArrayList {
-
-	/**
-	 * 
-	 * @return the top of the stack without removing it
-	 */
-	public CacheEventNode peek() {
-		if (size() == 0)
-			throw new EmptyStackException();
-
-		return (CacheEventNode) get(size() - 1);
-	}
-
-	/**
-	 * 
-	 * @return the top of the stack and removing it
-	 */
-	public CacheEventNode pop() {
-		if (size() == 0)
-			throw new EmptyStackException();
-
-		return (CacheEventNode) remove(size() - 1);
-	}
-
-	/**
-	 * 
-	 * @param adapter
-	 *            A CENO to push onto the top of the stack
-	 */
-	public void push(CacheEventNode adapter) {
-		add(adapter);
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityPackageMappingRegistry.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityPackageMappingRegistry.java
deleted file mode 100644
index 25367c8..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityPackageMappingRegistry.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.resource;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * This class is used to register mappings for a package prefix to its current namespace URI. Also,
- * this registry is used to map the package
- */
-public class CompatibilityPackageMappingRegistry {
-	public static CompatibilityPackageMappingRegistry INSTANCE = new CompatibilityPackageMappingRegistry();
-	private Map prefixToPackageURIs = new HashMap();
-	private Map packageURIsToPrefixes = new HashMap();
-
-	/**
-	 *  
-	 */
-	private CompatibilityPackageMappingRegistry() {
-		super();
-	}
-
-	/**
-	 * @return
-	 */
-	public Map getPackageURIsToPrefixes() {
-		return packageURIsToPrefixes;
-	}
-
-	/**
-	 * @return
-	 */
-	public Map getPrefixToPackageURIs() {
-		return prefixToPackageURIs;
-	}
-
-	public void registerPrefixToPackageURI(String prefix, String uri) {
-		if (prefix != null && uri != null) {
-			prefixToPackageURIs.put(prefix, uri);
-			packageURIsToPrefixes.put(uri, prefix);
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityResourceFactory.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityResourceFactory.java
deleted file mode 100644
index f824de3..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityResourceFactory.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Apr 23, 2003
- *
- * To change the template for this generated file go to
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
-package org.eclipse.wst.common.internal.emf.resource;
-
-import java.util.Map;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
-
-/**
- * @author DABERG
- * 
- * To change the template for this generated type comment go to Window>Preferences>Java>Code
- * Generation>Code and Comments
- */
-public class CompatibilityResourceFactory extends XMIResourceFactoryImpl {
-	/**
-	 *  
-	 */
-	public CompatibilityResourceFactory() {
-		super();
-	}
-
-	protected Map prefixToPackageURIs;
-
-	protected Map packageURIsToPrefixes;
-
-	public Map getPrefixToPackageURI() {
-		return CompatibilityPackageMappingRegistry.INSTANCE.getPrefixToPackageURIs();
-	}
-
-	public Map getPackageURIsToPrefixes() {
-		return CompatibilityPackageMappingRegistry.INSTANCE.getPackageURIsToPrefixes();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl#createResource(org.eclipse.emf.common.util.URI)
-	 */
-	public Resource createResource(URI uri) {
-		return new CompatibilityXMIResourceImpl(uri);
-	}
-
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilitySAXXMIHandler.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilitySAXXMIHandler.java
deleted file mode 100644
index ee6ff3e..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilitySAXXMIHandler.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Apr 30, 2003
- *
- * To change the template for this generated file go to
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
-package org.eclipse.wst.common.internal.emf.resource;
-
-import java.util.Map;
-
-import org.eclipse.emf.ecore.xmi.XMLHelper;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.emf.ecore.xmi.impl.SAXXMIHandler;
-
-/**
- * @author DABERG
- * 
- * To change the template for this generated type comment go to Window>Preferences>Java>Code
- * Generation>Code and Comments
- */
-public class CompatibilitySAXXMIHandler extends SAXXMIHandler {
-	protected final static String NULL_ATTRIB = XMLResource.XSI_NS + ":null"; //$NON-NLS-1$
-
-	/**
-	 * @param xmiResource
-	 * @param helper
-	 * @param options
-	 */
-	public CompatibilitySAXXMIHandler(XMLResource xmiResource, XMLHelper helper, Map options) {
-		super(xmiResource, helper, options);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.ecore.xmi.impl.XMLHandler#isNull()
-	 */
-	protected boolean isNull() {
-		boolean isnull = super.isNull();
-		if (!isnull)
-			isnull = attribs.getValue(NULL_ATTRIB) != null;
-		return isnull;
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityURIConverter.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityURIConverter.java
deleted file mode 100644
index ba135f5..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityURIConverter.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.resource;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.URIConverter;
-
-public interface CompatibilityURIConverter extends URIConverter {
-	URI deNormalize(URI uri);
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMILoadImpl.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMILoadImpl.java
deleted file mode 100644
index 5f17a46..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMILoadImpl.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Apr 30, 2003
- *
- * To change the template for this generated file go to
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
-package org.eclipse.wst.common.internal.emf.resource;
-
-import org.eclipse.emf.ecore.xmi.XMLHelper;
-import org.eclipse.emf.ecore.xmi.impl.SAXWrapper;
-import org.eclipse.emf.ecore.xmi.impl.XMILoadImpl;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * @author DABERG
- * 
- * To change the template for this generated type comment go to Window>Preferences>Java>Code
- * Generation>Code and Comments
- */
-public class CompatibilityXMILoadImpl extends XMILoadImpl {
-
-	/**
-	 * @param helper
-	 */
-	public CompatibilityXMILoadImpl(XMLHelper helper) {
-		super(helper);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.ecore.xmi.impl.XMLLoadImpl#makeDefaultHandler()
-	 */
-	protected DefaultHandler makeDefaultHandler() {
-		return new SAXWrapper(new CompatibilitySAXXMIHandler(resource, helper, options));
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMIResource.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMIResource.java
deleted file mode 100644
index a954f5f..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMIResource.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.resource;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.xmi.XMIResource;
-
-public interface CompatibilityXMIResource extends XMIResource {
-	int FORMAT_EMF1 = 0;
-	/**
-	 * format for MOF5 compatibility; note that this can NOT be used with resources usings the
-	 * "platform:/plugin" protocol"
-	 */
-	int FORMAT_MOF5 = 1;
-
-	void addOriginalPackageURI(String packageUri, String originalUri);
-
-	int getFormat();
-
-	/**
-	 * Set the serialization format. By default it is FORMAT_EMF1.
-	 * 
-	 * @see CompatibilityXMIResource#FORMAT_EMF1
-	 * @see CompatibilityXMIResource#FORMAT_MOF5
-	 */
-	void setFormat(int format);
-
-	boolean usesDefaultFormat();
-
-	/**
-	 * @param rootObject
-	 */
-	void removePreservingIds(EObject rootObject);
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMIResourceImpl.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMIResourceImpl.java
deleted file mode 100644
index adc44b2..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMIResourceImpl.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.resource;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.xmi.XMLHelper;
-import org.eclipse.emf.ecore.xmi.XMLLoad;
-import org.eclipse.emf.ecore.xmi.XMLSave;
-import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
-import org.eclipse.wst.common.internal.emf.utilities.ExtendedEcoreUtil;
-import org.eclipse.wst.common.internal.emf.utilities.IDUtil;
-
-
-public class CompatibilityXMIResourceImpl extends XMIResourceImpl implements CompatibilityXMIResource {
-	protected static final String DEFAULT_ENCODING = "UTF-8"; //$NON-NLS-1$
-	protected int format = FORMAT_EMF1;
-	protected Map originalPackageURIs = new HashMap();
-	private boolean preserveIDs = false;
-
-	private static final String PLATFORM_PROTOCOL = "platform"; //$NON-NLS-1$
-	private static final String PLATFORM_PLUGIN = "plugin"; //$NON-NLS-1$
-
-	/**
-	 * Constructor for MappableXMIResourceImpl.
-	 */
-	public CompatibilityXMIResourceImpl() {
-		super();
-		initDefaultSaveOptions();
-	}
-
-	public CompatibilityXMIResourceImpl(URI uri) {
-		super(uri);
-		initDefaultSaveOptions();
-	}
-
-	/**
-	 * @see org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl#createXMLHelper()
-	 */
-	protected final XMLHelper createXMLHelper() {
-		MappedXMIHelper helper = doCreateXMLHelper();
-		helper.setPackageURIsToPrefixes(getPackageURIsToPrefixes());
-		return helper;
-	}
-
-	protected MappedXMIHelper doCreateXMLHelper() {
-		return new MappedXMIHelper(this, getPrefixToPackageURIs());
-	}
-
-	/**
-	 * Subclasses should not need to override this method.
-	 * 
-	 * @see CompatibilityPackageMappingRegistry#getPrefixToPackageURIs()
-	 */
-	protected Map getPrefixToPackageURIs() {
-		return CompatibilityPackageMappingRegistry.INSTANCE.getPrefixToPackageURIs();
-	}
-
-	/**
-	 * Subclasses should not need to override this method.
-	 * 
-	 * @see CompatibilityPackageMappingRegistry#getPrefixToPackageURIs()
-	 */
-	protected Map getPackageURIsToPrefixes() {
-		return CompatibilityPackageMappingRegistry.INSTANCE.getPackageURIsToPrefixes();
-	}
-
-	public void addOriginalPackageURI(String packageUri, String originalUri) {
-		originalPackageURIs.put(packageUri, originalUri);
-	}
-
-	public int getFormat() {
-		return format;
-	}
-
-	public void setFormat(int format) {
-		if (!isPlatformPluginResourceURI())
-			this.format = format;
-	}
-
-	private boolean isPlatformPluginResourceURI() {
-		URI aURI = getURI();
-
-		return aURI != null && PLATFORM_PROTOCOL.equals(uri.scheme()) && PLATFORM_PLUGIN.equals(uri.segment(0));
-	}
-
-	/**
-	 * @see org.eclipse.emf.ecore.resource.Resource#getURIFragment(EObject)
-	 */
-	public String getURIFragment(EObject eObject) {
-		if (usesDefaultFormat())
-			return super.getURIFragment(eObject);
-		return IDUtil.getOrAssignID(eObject, this);
-	}
-
-	public boolean usesDefaultFormat() {
-		return format == CompatibilityXMIResource.FORMAT_EMF1;
-	}
-
-	/**
-	 * @see org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl#createXMLSave()
-	 */
-	protected XMLSave createXMLSave() {
-		if (usesDefaultFormat())
-			return super.createXMLSave();
-		return new CompatibilityXMISaveImpl(createXMLHelper());
-	}
-
-	/**
-	 * @see org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl#doSave(OutputStream, Map)
-	 */
-	public void doSave(OutputStream outputStream, Map options) throws IOException {
-		super.doSave(outputStream, options);
-	}
-
-	/**
-	 * Method initDefaultOptions.
-	 */
-	protected void initDefaultSaveOptions() {
-		if (defaultSaveOptions == null) {
-			getDefaultSaveOptions();
-		}
-	}
-
-	/**
-	 * @see org.eclipse.emf.ecore.resource.impl.ResourceImpl#getEObjectByID(String)
-	 */
-	protected EObject getEObjectByID(String id) {
-		if (idToEObjectMap != null) {
-			EObject eObject = (EObject) idToEObjectMap.get(id);
-			if (eObject != null) {
-				return eObject;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Called when the object is unloaded. This implementation
-	 * {@link InternalEObject#eSetProxyURI sets}the object to be a proxy and clears the
-	 * {@link #eAdapters adapters}.
-	 */
-	protected void unloaded(InternalEObject internalEObject) {
-		//overridden from the super class; call super.getURIFragment instead of the implementation
-		//at this level, to avoid ID generation during unload
-		//internalEObject.eSetProxyURI(uri.appendFragment(getURIFragment(internalEObject)));
-		internalEObject.eSetProxyURI(uri.appendFragment(super.getURIFragment(internalEObject)));
-		internalEObject.eAdapters().clear();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl#doLoad(java.io.InputStream,
-	 *      java.util.Map)
-	 */
-	public final void doLoad(InputStream inputStream, Map options) throws IOException {
-		ExtendedEcoreUtil.addLoadingTag(this);
-		try {
-			basicDoLoad(inputStream, options);
-		} finally {
-			ExtendedEcoreUtil.removeLoadingTag(this);
-		}
-	}
-
-	protected void basicDoLoad(InputStream inputStream, Map options) throws IOException {
-		super.doLoad(inputStream, options);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl#init()
-	 */
-	protected void init() {
-		super.init();
-		setEncoding(DEFAULT_ENCODING);
-	}
-
-	protected XMLLoad createXMLLoad() {
-		return new CompatibilityXMILoadImpl(createXMLHelper());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.internal.emf.resource.CompatibilityXMIResource#removePreservingIds(org.eclipse.emf.ecore.EObject)
-	 */
-	public void removePreservingIds(EObject rootObject) {
-		setPreserveIDs(true);
-		getContents().remove(rootObject);
-	}
-
-	/**
-	 * @return Returns the preserveIDs.
-	 */
-	public boolean isPreserveIDs() {
-		return preserveIDs;
-	}
-
-	/**
-	 * @param preserveIDs
-	 *            The preserveIDs to set.
-	 */
-	public void setPreserveIDs(boolean preserveIDs) {
-		this.preserveIDs = preserveIDs;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl#detachedHelper(org.eclipse.emf.ecore.EObject)
-	 */
-	protected void detachedHelper(EObject eObject) {
-		if (modificationTrackingAdapter != null) {
-			eObject.eAdapters().remove(modificationTrackingAdapter);
-		}
-
-		if (useUUIDs()) {
-			DETACHED_EOBJECT_TO_ID_MAP.put(eObject, getID(eObject));
-		}
-
-		if (!isPreserveIDs() && idToEObjectMap != null && eObjectToIDMap != null) {
-			idToEObjectMap.remove(eObjectToIDMap.remove(eObject));
-		}
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMISaveImpl.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMISaveImpl.java
deleted file mode 100644
index c1a7bf2..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMISaveImpl.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.resource;
-
-import java.util.Map;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.ecore.xmi.XMIResource;
-import org.eclipse.emf.ecore.xmi.XMLHelper;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.emf.ecore.xmi.impl.XMISaveImpl;
-
-public class CompatibilityXMISaveImpl extends XMISaveImpl {
-
-	/**
-	 * Constructor for CompatibilityXMISaveImpl.
-	 * 
-	 * @param helper
-	 */
-	public CompatibilityXMISaveImpl(XMLHelper helper) {
-		super(helper);
-	}
-
-	/**
-	 * Constructor for CompatibilityXMISaveImpl.
-	 * 
-	 * @param options
-	 * @param helper
-	 * @param encoding
-	 */
-	public CompatibilityXMISaveImpl(Map options, XMLHelper helper, String encoding) {
-		super(options, helper, encoding);
-	}
-
-	/**
-	 * @see org.eclipse.emf.ecore.xmi.impl.XMISaveImpl#init(XMLResource, Map)
-	 */
-	protected void init(XMLResource resource, Map options) {
-		super.init(resource, options);
-		xmiType = true;
-	}
-
-	/**
-	 * @see org.eclipse.emf.ecore.xmi.impl.XMISaveImpl#addNamespaceDeclarations()
-	 */
-	public void addNamespaceDeclarations() {
-		doc.addAttribute(XMI_VER_NS, XMIResource.VERSION_VALUE);
-		doc.addAttribute(XMI_XMLNS, XMIResource.XMI_URI);
-		EPackage[] packages = helper.packages();
-		StringBuffer xsiSchemaLocation = null;
-		if (declareSchemaLocation) {
-			for (int i = 0; i < packages.length; i++) {
-				EPackage ePackage = packages[i];
-
-				EObject root = EcoreUtil.getRootContainer(ePackage);
-				if (root instanceof EPackage) {
-					EPackage rootEPackage = (EPackage) root;
-					Resource resource = rootEPackage.eResource();
-					if (resource != null) {
-						URI uri = resource.getURI();
-						String rootNsURI = rootEPackage.getNsURI();
-						if (uri == null ? rootNsURI != null : !uri.toString().equals(rootNsURI)) {
-							declareXSI = true;
-							if (xsiSchemaLocation == null) {
-								xsiSchemaLocation = new StringBuffer();
-							} else {
-								xsiSchemaLocation.append(' ');
-							}
-							xsiSchemaLocation.append(rootNsURI);
-							xsiSchemaLocation.append(' ');
-							xsiSchemaLocation.append(helper.getHREF(rootEPackage));
-						}
-					}
-				}
-			}
-		}
-
-		if (declareXSI) {
-			doc.addAttribute(XSI_XMLNS, XMLResource.XSI_URI);
-		}
-
-		for (int i = 0; i < packages.length; i++) {
-			EPackage ePackage = packages[i];
-			//Modified from superclass - dispatch back to helper for compatibility
-			//String nsURI = ePackage.getNsURI();
-			//String nsPrefix = ePackage.getNsPrefix();
-			String[] nsInfo = ((MappedXMIHelper) helper).getNSInfo(ePackage);
-			doc.addAttributeNS(XMLResource.XML_NS, nsInfo[0], nsInfo[1]);
-		}
-
-		if (xsiSchemaLocation != null) {
-			doc.addAttribute(XSI_SCHEMA_LOCATION, xsiSchemaLocation.toString());
-		}
-	}
-
-	protected void saveHref(EObject remote, EStructuralFeature f) {
-		String name = helper.getQName(f);
-		String href = helper.getHREF(remote);
-		if (href != null) {
-			doc.startElement(name);
-			EClass eClass = remote.eClass();
-
-			EClass expectedType = (EClass) f.getEType();
-			//Changed next line to always write type if expectedType
-			//is different from eClass
-			if (eClass != expectedType) {
-				saveTypeAttribute(eClass);
-			}
-
-			doc.addAttribute(XMLResource.HREF, href);
-			doc.endEmptyElement();
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ConstantAttributeTranslator.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ConstantAttributeTranslator.java
deleted file mode 100644
index 356f102..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ConstantAttributeTranslator.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Apr 15, 2003
- *
- */
-package org.eclipse.wst.common.internal.emf.resource;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * @author schacher
- */
-public class ConstantAttributeTranslator extends Translator {
-
-	protected String attributeValue;
-
-	/**
-	 * @param domNameAndPath
-	 * @param eClass
-	 */
-	public ConstantAttributeTranslator(String domNameAndPath, String attributeValue) {
-		super(domNameAndPath, null, DOM_ATTRIBUTE);
-		this.attributeValue = attributeValue;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.impl.Translator#getMOFValue(org.eclipse.emf.ecore.EObject)
-	 */
-	public Object getMOFValue(EObject mofObject) {
-		return attributeValue;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.impl.Translator#isSetMOFValue(org.eclipse.emf.ecore.EObject)
-	 */
-	public boolean isSetMOFValue(EObject emfObject) {
-		return true;
-	}
-
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/DefaultTranslatorFactory.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/DefaultTranslatorFactory.java
deleted file mode 100644
index 7518472..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/DefaultTranslatorFactory.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Aug 20, 2003
- *
- */
-package org.eclipse.wst.common.internal.emf.resource;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.wst.common.internal.emf.utilities.Namespace;
-import org.eclipse.wst.common.internal.emf.utilities.NamespaceAdapter;
-
-
-/**
- * @author schacher
- */
-public class DefaultTranslatorFactory implements VariableTranslatorFactory {
-
-	public static final String XMLNS = "xmlns:"; //$NON-NLS-1$
-	public static final DefaultTranslatorFactory INSTANCE = new DefaultTranslatorFactory();
-
-	public DefaultTranslatorFactory() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.impl.VariableTranslatorFactory#accepts(java.lang.String)
-	 */
-	public boolean accepts(String domName) {
-		return domName != null && domName.startsWith(XMLNS);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.impl.VariableTranslatorFactory#accepts(org.eclipse.emf.common.notify.Notification)
-	 */
-	public boolean accepts(Notification notif) {
-		return notif.getFeature() == NamespaceAdapter.NOTIFICATION_FEATURE;
-	}
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.impl.VariableTranslatorFactory#create(java.lang.String)
-	 */
-	public Translator create(String domName) {
-		return new NamespaceTranslator(domName);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.impl.VariableTranslatorFactory#create(org.eclipse.emf.ecore.EObject)
-	 */
-	public List create(Notifier target) {
-		if (!(target instanceof EObject))
-			return null;
-		List namespaces = NamespaceAdapter.getNamespaces((EObject) target);
-		if (namespaces == null || namespaces.isEmpty())
-			return null;
-		List result = new ArrayList(namespaces.size());
-		for (int i = 0; i < namespaces.size(); i++) {
-			result.add(create((Namespace) namespaces.get(i)));
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.impl.VariableTranslatorFactory#create(org.eclipse.emf.common.notify.Notification)
-	 */
-	public Translator create(Notification notif) {
-		Namespace ns = (Namespace) notif.getNewValue();
-		return create(ns);
-	}
-
-	private Translator create(Namespace ns) {
-		return new NamespaceTranslator(XMLNS + ns.getPrefix());
-	}
-
-
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/DependencyTranslator.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/DependencyTranslator.java
deleted file mode 100644
index c7d1c62..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/DependencyTranslator.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Mar 25, 2003
- *
- */
-package org.eclipse.wst.common.internal.emf.resource;
-
-import java.util.List;
-
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * @author schacher
- */
-public class DependencyTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public DependencyTranslator(String domNameAndPath, EStructuralFeature aFeature, EStructuralFeature aDependentFeature) {
-		super(domNameAndPath, aFeature);
-		dependencyFeature = aDependentFeature;
-	}
-
-	public EObject getChild(EObject parent) {
-		EObject child = basicGetDependencyObject(parent);
-		if (child == null)
-			return createChild(parent);
-		return child;
-	}
-
-
-	protected EObject createChild(EObject parent) {
-		EObject child = createEMFObject(dependencyFeature);
-		parent.eSet(dependencyFeature, child);
-		return child;
-	}
-
-	public List getMOFChildren(EObject mofObject) {
-		//return super.getMOFChildren(getChild(mofObject));
-		return super.getMOFChildren(mofObject);
-	}
-
-	public Object getMOFValue(EObject mofObject) {
-		return super.getMOFValue(getChild(mofObject));
-	}
-
-	public void setMOFValue(EObject emfObject, Object value) {
-		//super.setMOFValue(getChild(emfObject), value);
-		super.setMOFValue(getChild(emfObject), value, -1);
-	}
-
-	public void setMOFValue(Notifier owner, Object value, int newIndex) {
-		super.setMOFValue(getChild((EObject) owner), value, newIndex);
-	}
-
-	public void removeMOFValue(Notifier owner, Object value) {
-		super.removeMOFValue(getChild((EObject) owner), value);
-	}
-
-	public boolean isSetMOFValue(EObject emfObject) {
-		return super.isSetMOFValue(getChild(emfObject));
-	}
-
-	public void unSetMOFValue(EObject emfObject) {
-		super.unSetMOFValue(getChild(emfObject));
-	}
-
-
-	public boolean isDependencyChild() {
-		return true;
-	}
-
-	public boolean featureExists(EObject emfObject) {
-		return super.featureExists(getChild(emfObject));
-	}
-
-	public void clearList(EObject mofObject) {
-		super.clearList(getChild(mofObject));
-	}
-
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2DOMAdapter.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2DOMAdapter.java
deleted file mode 100644
index 9782ea1..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2DOMAdapter.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.resource;
-
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.ecore.EObject;
-import org.w3c.dom.Node;
-
-public interface EMF2DOMAdapter extends Adapter {
-
-
-	Class ADAPTER_CLASS = EMF2DOMAdapter.class;
-
-	/**
-	 * Return the DOM node that the target of this adapter maps to. If the target MOF object maps to
-	 * more than one DOM node, this node is the top-most node.
-	 */
-	Node getNode();
-
-	void setNode(Node aNode);
-
-	/**
-	 * Set to false and notification of changes from both the DOM node and the MOF object will be
-	 * ignored.
-	 */
-	boolean isNotificationEnabled();
-
-	/**
-	 * Set to false and notification of changes from both the DOM node and the MOF object will be
-	 * ignored.
-	 */
-	void setNotificationEnabled(boolean isEnabled);
-
-	/**
-	 * Updates the DOM tree for this adapter from the current values of the MOF Object. This method
-	 * updates ALL the DOM nodes from all the MOF attributes.
-	 */
-	void updateDOM();
-
-	/**
-	 * Updates the MOF Object from the DOM tree. All the children of the DOM tree are updated into
-	 * the MOF object.
-	 */
-	void updateMOF();
-
-	public void updateDOMFeature(Translator map, Node node, EObject mofObject);
-
-	public void updateMOFFeature(Translator map, Node node, EObject mofObject);
-
-	EObject getEObject();
-
-	/**
-	 * Return true if MOF object is a proxy.
-	 */
-	boolean isMOFProxy();
-
-	/**
-	 * Remove the DOM adapters from the node AND all its child nodes, recursively.
-	 */
-	void removeAdapters(Node node);
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2DOMAdapterImpl.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2DOMAdapterImpl.java
deleted file mode 100644
index c5c7287..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2DOMAdapterImpl.java
+++ /dev/null
@@ -1,1745 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.resource;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.List;
-
-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.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.wst.common.internal.emf.utilities.Assert;
-import org.eclipse.wst.common.internal.emf.utilities.DOMUtilities;
-import org.eclipse.wst.common.internal.emf.utilities.EtoolsCopySession;
-import org.eclipse.wst.common.internal.emf.utilities.ExtendedEcoreUtil;
-import org.eclipse.wst.common.internal.emf.utilities.FeatureValueConversionException;
-import org.eclipse.wst.common.internal.emf.utilities.Revisit;
-import org.eclipse.wst.common.internal.emf.utilities.StringUtil;
-import org.eclipse.wst.common.internal.emf.utilities.WFTUtilsResourceHandler;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.DocumentType;
-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;
-
-
-public class EMF2DOMAdapterImpl extends AdapterImpl implements EMF2DOMAdapter {
-
-	final protected static boolean fDebug = false;
-
-	protected boolean fNotificationEnabled = true;
-
-	protected Node fNode;
-
-	protected Translator fTranslator;
-
-	protected EMF2DOMRenderer fRenderer;
-
-	protected Translator[] childTranslators;
-
-	protected boolean isRoot = false;
-
-	private class DependencyAdapter extends org.eclipse.emf.common.notify.impl.AdapterImpl {
-
-		static final String KEY = "EMF2DOMDependencyAdapter"; //$NON-NLS-1$
-
-		public void notifyChanged(Notification msg) {
-			EMF2DOMAdapterImpl.this.notifyChanged(msg);
-		}
-
-		/**
-		 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#isAdapterForType(Object)
-		 */
-		public boolean isAdapterForType(Object type) {
-			return KEY.equals(type);
-		}
-	}
-
-	/**
-	 * Constructor for root adapters.
-	 */
-	public EMF2DOMAdapterImpl(TranslatorResource resource, Document document, EMF2DOMRenderer renderer, Translator translator) {
-		this((Notifier) resource, (Node) document, renderer, translator);
-		isRoot = true;
-	}
-
-	/**
-	 * Construct an Adapter given an EObject and a node
-	 */
-	public EMF2DOMAdapterImpl(Notifier object, Node node, EMF2DOMRenderer renderer, Translator translator) {
-		super();
-		setTarget(object);
-		fNode = node;
-		fRenderer = renderer;
-		fTranslator = translator;
-		initChildTranslators();
-		addEMFAdapter();
-		addDOMAdapter();
-		addDependencyAdapterIfNecessary();
-	}
-
-	/**
-	 * Construct an adapter from a DOM Node. The EObject will be created
-	 */
-	public EMF2DOMAdapterImpl(Node node, EMF2DOMRenderer renderer, Translator translator) {
-		fNode = node;
-		fRenderer = renderer;
-		fTranslator = translator;
-		setTargetFromNode();
-		initChildTranslators();
-		addEMFAdapter();
-		addDOMAdapter();
-		addDependencyAdapterIfNecessary();
-
-	}
-
-	protected void addDependencyAdapterIfNecessary() {
-		if (!fTranslator.isDependencyParent())
-			return;
-		EObject child = fTranslator.basicGetDependencyObject(getEObject());
-		if (child != null)
-			addDependencyAdapter(child);
-	}
-
-	protected void initChildTranslators() {
-
-		List children = new ArrayList();
-		// TODO come up with translator extension mechanism
-		//children.add(AnnotationsTranslator.INSTANCE);
-		children.addAll(Arrays.asList(fTranslator.getChildren(getTarget(), fRenderer.getVersionID())));
-
-		VariableTranslatorFactory factory = fTranslator.getVariableTranslatorFactory();
-		if (factory != null) {
-			String domName = null;
-			NamedNodeMap map = fNode.getAttributes();
-
-			if (map != null) {
-				int length = map.getLength();
-				for (int i = 0; i < length; i++) {
-					Node attrNode = map.item(i);
-					domName = attrNode.getNodeName();
-					//Handle variable translators
-					Translator t = fTranslator.findChild(domName, getTarget(), fRenderer.getVersionID());
-					if (t != null && !children.contains(t))
-						children.add(t);
-				}
-			}
-			List childrenFromEMF = factory.create(getTarget());
-			if (childrenFromEMF != null)
-				children.addAll(childrenFromEMF);
-		}
-
-		childTranslators = (Translator[]) children.toArray(new Translator[children.size()]);
-	}
-
-	/**
-	 * Set to false and notification of changes from both the DOM node and the MOF object will be
-	 * ignored.
-	 */
-	public boolean isNotificationEnabled() {
-		return fNotificationEnabled;
-	}
-
-	/**
-	 * Set to false and notification of changes from both the DOM node and the MOF object will be
-	 * ignored.
-	 */
-	public void setNotificationEnabled(boolean isEnabled) {
-		fNotificationEnabled = isEnabled;
-	}
-
-	public boolean isAdapterForType(Object type) {
-		return EMF2DOMAdapter.ADAPTER_CLASS == type;
-	}
-
-	protected void addEMFAdapter() {
-		target.eAdapters().add(this);
-	}
-
-	public String toString() {
-		StringBuffer sb = new StringBuffer();
-		sb.append(shortClassName(this));
-		sb.append('(');
-		sb.append(getNode().getNodeName());
-		sb.append(',');
-		sb.append(shortClassName(getTarget()));
-		sb.append(')');
-		return sb.toString();
-	}
-
-	protected String shortClassName(Object o) {
-		String cn = o.getClass().getName();
-		int i = cn.lastIndexOf('.');
-		return cn.substring(i + 1, cn.length());
-	}
-
-	/*
-	 * Prints out a MOF notification for debugging
-	 */
-	protected void debugMOFNotify(Notification msg) {
-		if (fDebug) {
-			String notifType = ""; //$NON-NLS-1$
-			switch (msg.getEventType()) {
-				case Notification.ADD :
-					notifType = "ADD"; //$NON-NLS-1$
-					break;
-				case Notification.REMOVE :
-					notifType = "REMOVE"; //$NON-NLS-1$
-					break;
-				case Notification.ADD_MANY :
-					notifType = "ADD_MANY"; //$NON-NLS-1$
-					break;
-				case Notification.REMOVE_MANY :
-					notifType = "REMOVE_MANY"; //$NON-NLS-1$
-					break;
-				case Notification.SET : {
-					if (msg.getPosition() == Notification.NO_INDEX)
-						notifType = "REPLACE"; //$NON-NLS-1$
-					else
-						notifType = "SET"; //$NON-NLS-1$
-					break;
-				}
-				case Notification.UNSET :
-					notifType = "UNSET"; //$NON-NLS-1$
-					break;
-			}
-
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("MOF Change: " + notifType); //$NON-NLS-1$
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tnotifier      : " + msg.getNotifier()); //$NON-NLS-1$
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tchangedFeature: " + msg.getFeature()); //$NON-NLS-1$
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\toldValue      : " + msg.getOldValue()); //$NON-NLS-1$
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tnewValue      : " + msg.getNewValue()); //$NON-NLS-1$
-		}
-	}
-
-	/*
-	 * Override this method to create the feature maps for the adapter.
-	 */
-	protected Translator[] getChildTranslators() {
-		return childTranslators;
-	}
-
-	protected Translator findTranslator(Notification not) {
-		if (not.getFeature() == null)
-			return null;
-		Translator[] maps = getChildTranslators();
-		for (int i = 0; i < maps.length; i++) {
-			if (maps[i].isMapFor(not.getFeature(), not.getOldValue(), not.getNewValue()))
-				return maps[i];
-		}
-		return null;
-	}
-
-	/**
-	 * Update all the children of the target MOF object in the relationship described by
-	 * 
-	 * @map.
-	 * 
-	 * @param map
-	 *            com.ibm.etools.mof2dom.AttributeTranslator Describes the mapping from the MOF
-	 *            attribute name to the DOM node name
-	 */
-	protected void primUpdateDOMMultiFeature(Translator map, Node node, List mofChildren, List domChildren, Notifier owner) {
-
-		//Used for inserting primitives
-		List inorderDOMChildren = null;
-		if (!map.isObjectMap() || map.isManagedByParent()) {
-			inorderDOMChildren = new ArrayList();
-			inorderDOMChildren.addAll(domChildren);
-		}
-		Node parent = findDOMPath(node, map, false);
-
-		// Go though the MOF children checking to see if the corresponding
-		// MOF Adapter children exists. If not, create the adapter.
-		// Also handles reordering children that have moved.
-		int i = 0;
-		for (; i < mofChildren.size(); i++) {
-			Object child = mofChildren.get(i);
-			EObject mofChild = null;
-
-			EMF2DOMAdapter adapter = null;
-
-			// Check to see if the child is a MOF Object.
-			if (!map.isManagedByParent() && child instanceof EObject) {
-				mofChild = (EObject) mofChildren.get(i);
-				adapter = getExistingAdapter(mofChild);
-			}
-
-			if (adapter != null && i < domChildren.size() && domChildren.get(i) == adapter.getNode())
-				continue;
-			if (adapter != null) {
-				if (domChildren.isEmpty())
-					continue;
-				// A node has been reordered in the list
-				Node reorderNode = adapter.getNode();
-				Node insertBeforeNode = (Node) domChildren.get(i);
-				domChildren.remove(reorderNode);
-				domChildren.add(i, reorderNode);
-				if (reorderNode != insertBeforeNode) {
-					reorderDOMChild(parent, reorderNode, insertBeforeNode, map);
-				}
-			} else {
-				// A new node has been added, create it
-				parent = createDOMPath(node, map);
-				if (mofChild != null) {
-					adapter = createAdapter(mofChild, map);
-					Node newNode = adapter.getNode();
-					Node insertBeforeNode = findInsertBeforeNode(parent, map, mofChildren, i, domChildren);
-					DOMUtilities.insertBeforeNodeAndWhitespace(parent, newNode, insertBeforeNode);
-					domChildren.add(i, newNode);
-					boolean notificationFlag = adapter.isNotificationEnabled();
-					adapter.setNotificationEnabled(false);
-					try {
-						indent(newNode, map);
-					} finally {
-						adapter.setNotificationEnabled(notificationFlag);
-					}
-					adapter.updateDOM();
-				} else {
-					// The mof feature is a collection of primitives.
-					// create a new dom node and listen to it.
-					Element newNode = createNewNode(null, map);
-					Node insertBeforeNode = findInsertBeforeNode(parent, map, mofChildren, i, inorderDOMChildren);
-					DOMUtilities.insertBeforeNodeAndWhitespace(parent, newNode, insertBeforeNode);
-					indent(newNode, map);
-					addDOMAdapter(newNode); // Hook up listeners
-					domChildren.add(i, newNode);
-					inorderDOMChildren.add(newNode);
-					Text newText = parent.getOwnerDocument().createTextNode(map.convertValueToString(child, (EObject) owner));
-					DOMUtilities.insertBeforeNode(newNode, newText, null);
-				}
-			}
-		}
-
-		// Remove any remaining adapters.
-		for (; i < domChildren.size(); i++) {
-			removeDOMChild(parent, (Element) domChildren.get(i));
-		}
-
-		// If there are no MOF children, remove any unnecessary DOM node paths
-		if (mofChildren.size() == 0 && map.hasDOMPath()) {
-			if (map.shouldRenderEmptyDOMPath((EObject) owner))
-				createDOMPath(node, map);
-			else
-				removeDOMPath(node, map);
-		}
-
-	}
-
-	/**
-	 * Update all the children of the target MOF object in the relationship described by
-	 * 
-	 * @map.
-	 * 
-	 * @param map
-	 *            com.ibm.etools.mof2dom.AttributeTranslator Describes the mapping from the MOF
-	 *            attribute name to the DOM node name
-	 */
-	protected void primUpdateMOFMultiFeature(Translator map, Node node, List mofChildren, List domChilren) {
-
-		Hashtable nodeToAdapter = new Hashtable();
-
-		for (int i = 0; i < mofChildren.size(); i++) {
-			EMF2DOMAdapter adapter = getExistingAdapter((EObject) mofChildren.get(i));
-			if (adapter != null)
-				nodeToAdapter.put(adapter.getNode(), adapter);
-		}
-
-		// Go though the DOM children checking to see if the corresponding
-		// MOF Adapter children exists. If not, create the adapter.
-		// Also handles reordering children that have moved.
-		int i = 0;
-		int mofIndex = 0;
-		List adaptersToUpdate = new ArrayList();
-		for (; i < domChilren.size(); i++) {
-			Element childNode = (Element) domChilren.get(i);
-			EMF2DOMAdapter adapter = i < mofChildren.size() ? getExistingAdapter((EObject) mofChildren.get(i)) : null;
-			if (adapter != null && !adapter.isMOFProxy() && adapter.getNode() == childNode) {
-				// Because the adapter is processing STRUCTURE_CHANGED from the
-				// DOM, we
-				// must update all the way down the tree since anything under
-				// the notifying
-				// DOM node could have changed.
-				adapter.updateMOF();
-				mofIndex++;
-				continue;
-			}
-
-			adapter = (EMF2DOMAdapter) nodeToAdapter.get(childNode);
-			if (adapter != null) {
-				reorderIfNecessary((EList) mofChildren, adapter.getEObject(), mofIndex);
-				mofIndex++;
-			} else {
-				adapter = createAdapter(childNode, map);
-				if (adapter != null) {
-					try {
-						//We don't want to push anything back to the child dom
-						adapter.setNotificationEnabled(false);
-						map.setMOFValue(getTarget(), adapter.getTarget(), mofIndex);
-					} finally {
-						adapter.setNotificationEnabled(true);
-					}
-
-					adaptersToUpdate.add(adapter);
-					mofIndex++;
-				}
-			}
-		}
-
-		// Remove any remaining adapters.
-		for (; i < mofChildren.size();) {
-			removeMOFValue((EObject) mofChildren.get(i), map);
-		}
-
-		// The adapters cannot be updated as they created. We must wait until
-		// all of the adapters are created and removed before updating,
-		// otherwise
-		// we can get in a state where there are adapters fighting with
-		// eachother
-		// (one for the old node and one for the new node).
-		for (int j = 0; j < adaptersToUpdate.size(); j++) {
-			((EMF2DOMAdapter) adaptersToUpdate.get(j)).updateMOF();
-		}
-	}
-
-	/**
-	 * Removes a feature's value.
-	 * 
-	 * @param childAdapter
-	 *            com.ibm.etools.mof2dom.EMF2DOMAdapter The child to remove
-	 * @param mofAttributeName
-	 *            String The name of the mofAttribute to remove the child from.
-	 */
-	protected void removeMOFValue(EObject value, Translator translator) {
-
-		if (value == null)
-			return;
-
-		EMF2DOMAdapter adapter = (EMF2DOMAdapter) EcoreUtil.getExistingAdapter(value, EMF2DOMAdapter.ADAPTER_CLASS);
-		if (adapter != null) {
-			// Remove the adapter from BOTH the MOF Object and the DOM Nodes
-			value.eAdapters().remove(adapter);
-			removeAdapters(adapter.getNode());
-		}
-
-		EStructuralFeature feature = translator.getFeature();
-		boolean doUnload = feature == null || (translator.isObjectMap() && ((EReference) feature).isContainment());
-
-		// translator.removeMOFValue() was here originally
-
-		// Unload the objects.
-		if (doUnload)
-			ExtendedEcoreUtil.unload(value);
-
-		// Remove the MOF value
-		translator.removeMOFValue(getTarget(), value);
-	}
-
-	protected void reorderIfNecessary(EList emfChildren, EObject eObj, int emfIndex) {
-		int currIndex = emfChildren.indexOf(eObj);
-		if (currIndex > -1 && currIndex != emfIndex)
-			emfChildren.move(emfIndex, eObj);
-	}
-
-	/**
-	 * default is to do nothing; subclasses can override
-	 */
-	protected void indent(Node newNode, Translator map) {
-
-	}
-
-	protected Node findInsertBeforeNode(Node parentNode, Translator map, List mofList, int mofInx, List domList) {
-		Node insertBeforeNode = null;
-
-		// If there are no current dom children for this map, find the initial
-		// insert pos.
-		if (domList.size() == 0)
-			return findInitialInsertBeforeNode(parentNode, map);
-
-		// If some dom nodes then find the correct one to insert before.
-		int i = mofInx + 1;
-		while (i < mofList.size() && insertBeforeNode == null) {
-			// Start at the mofInx passed in and look forward for the first
-			// adapted
-			// MOF object. Use that node as the insert before node.
-			Object o = mofList.get(i);
-			if (!map.isObjectMap() || map.isManagedByParent())
-				break;
-			EObject tMOFObject = (EObject) o;
-			EMF2DOMAdapter tAdapter = (EMF2DOMAdapter) EcoreUtil.getExistingAdapter(tMOFObject, EMF2DOMAdapter.ADAPTER_CLASS);
-			if (tAdapter != null) {
-				insertBeforeNode = tAdapter.getNode();
-			}
-			i++;
-		}
-
-		// Handle inserting at the end of the list
-		if (insertBeforeNode == null)
-			insertBeforeNode = DOMUtilities.getNextNodeSibling((Node) domList.get(domList.size() - 1));
-		if (insertBeforeNode == null)
-			insertBeforeNode = ((Node) domList.get(domList.size() - 1)).getNextSibling();
-
-		return insertBeforeNode;
-	}
-
-	protected Node findInitialInsertBeforeNode(Node parentNode, Translator mapNode) {
-		Translator[] maps = getChildTranslators();
-
-		// First, skip past all the maps in the ordered collection
-		// of maps. We want to begin the search with this node.
-		int i = 0;
-		for (; i < maps.length; i++) {
-			if (maps[i] == mapNode)
-				break;
-		}
-
-		// Now search go through each map node until a child node matching
-		// its DOM name is found.
-		Node insertBeforeNode = null;
-		for (int j = i; j < maps.length && insertBeforeNode == null; j++) {
-			NodeList childNodes = parentNode.getChildNodes();
-			Translator nodeToFindMap = maps[j];
-			for (int k = 0; k < childNodes.getLength(); k++) {
-				Node node = childNodes.item(k);
-				if (nodeToFindMap.isMapFor(node.getNodeName())) {
-					insertBeforeNode = node;
-					break;
-				}
-			}
-		}
-		return insertBeforeNode;
-	}
-
-	/*
-	 * Traverses the path that <map> specifies. Returns the last node of the path that was able to
-	 * be traversed or null if the path could not be traversed. The <addAdapters> boolean is used to
-	 * determine if the receiver is added as an adapter to every node found on the path.
-	 */
-	protected Node findDOMPath(Node parent, Translator map, boolean addAdapters) {
-
-		String path = map.getDOMPath();
-		Node curNode = parent;
-		Iterator iter = DOMUtilities.createPathIterator(path);
-
-		while (curNode != null && iter.hasNext()) {
-			String nodeName = (String) iter.next();
-			curNode = DOMUtilities.getNodeChild(curNode, nodeName);
-			if (addAdapters && curNode != null) {
-				addDOMAdapter(curNode);
-			}
-		}
-		return curNode;
-	}
-
-	/**
-	 * Return the list of DOM node children that currently exist with the specified tagname.
-	 */
-	protected List getDOMChildren(Node node, Translator map) {
-		Node parent = findDOMPath(node, map, true);
-		if (parent != null)
-			return DOMUtilities.getNodeChildren(parent, map.getDOMNames());
-		return new ArrayList();
-	}
-
-	protected EMF2DOMAdapter getExistingAdapter(EObject refObject) {
-		EMF2DOMAdapter adapter = (EMF2DOMAdapter) EcoreUtil.getExistingAdapter(refObject, EMF2DOMAdapter.ADAPTER_CLASS);
-		if (adapter != null && adapter.isMOFProxy()) {
-			refObject.eAdapters().remove(adapter);
-			removeDOMAdapter(adapter.getNode(), adapter);
-			adapter = null;
-		}
-		return adapter;
-	}
-
-	protected void primAddDOMAdapter(Node aNode, EMF2DOMAdapter anAdapter) {
-		fRenderer.registerDOMAdapter(aNode, anAdapter);
-	}
-
-	protected EMF2DOMAdapter primGetExistingAdapter(Node aNode) {
-		return fRenderer.getExistingDOMAdapter(aNode);
-	}
-
-	protected void removeDOMAdapter(Node aNode, EMF2DOMAdapter anAdapter) {
-		fRenderer.removeDOMAdapter(aNode, anAdapter);
-	}
-
-	protected void addDOMAdapter(Node childNode) {
-
-		// Only add the adapter if this is an child node that will not be
-		// adapted. For instance a subtree that maps to a MOF attribute
-		// setting.
-		if (childNode.getNodeType() == Node.ELEMENT_NODE) {
-			EMF2DOMAdapter attrAdapter = primGetExistingAdapter(childNode);
-
-			if (attrAdapter == null || attrAdapter.getNode() != getNode()) {
-				// If the node is adapted, but not by this adapter then remove
-				// it. This happens to non-object children when the parent tag
-				// name is changed.
-				removeDOMAdapter(childNode, attrAdapter);
-
-				if (fDebug) {
-					org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tCHILD: Adding DOM adapter: " + this); //$NON-NLS-1$
-					org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\t\tto: " + childNode); //$NON-NLS-1$
-				}
-				primAddDOMAdapter(childNode, this);
-			}
-		}
-	}
-
-	/**
-	 * Reorder a child before a given node
-	 */
-	protected void reorderDOMChild(Node parentNode, Node childNode, Node insertBeforeNode, Translator map) {
-		try {
-			removeDOMChild(parentNode, childNode, false);
-			parentNode.insertBefore(childNode, insertBeforeNode);
-		} catch (Throwable e) {
-			e.printStackTrace();
-		}
-	}
-
-	protected String getNewlineString(Node node) {
-		return DOMUtilities.NEWLINE_STRING;
-	}
-
-	protected String primGetIndentString(Node node) {
-		return DOMUtilities.getIndentString(node);
-	}
-
-	/**
-	 * Remove a child node
-	 */
-	protected void removeDOMChild(Node parentNode, Node childNode) {
-		removeDOMChild(parentNode, childNode, true);
-	}
-
-	/**
-	 * Remove a child node
-	 */
-	protected void removeDOMChild(Node parentNode, Node childNode, boolean removeAdapter) {
-		try {
-			if (childNode == null)
-				return;
-			// Look for any whitespace preceeding the node being
-			// removed and remove it as well.
-			Text prevText = DOMUtilities.getPreviousTextSibling(childNode);
-			if (prevText != null && DOMUtilities.isWhitespace(prevText)) {
-				parentNode.removeChild(prevText);
-			}
-			// Remove the node.
-			if (removeAdapter)
-				removeAdapters(childNode);
-			parentNode.removeChild(childNode);
-		} catch (Throwable e) { 
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * Remove the DOM adapters from the node AND all its child nodes, recursively.
-	 */
-	public void removeAdapters(Node node) {
-		EMF2DOMAdapter adapter = primGetExistingAdapter(node);
-		if (adapter != null) {
-			// Remove the adapter from both the DOM node and the MOF Object.
-			removeDOMAdapter(node, adapter);
-			if (adapter.getNode() == node) {
-				Notifier localTarget = adapter.getTarget();
-				if (localTarget != null)
-					localTarget.eAdapters().remove(adapter);
-			}
-		}
-
-		NodeList nl = node.getChildNodes();
-		for (int i = 0; i < nl.getLength(); i++) {
-			Node n = nl.item(i);
-			removeAdapters(n);
-		}
-	}
-
-	/**
-	 * Creates the path specified by <map>under <node>. Only the portion of the path that does not
-	 * exist (if any) is created
-	 * 
-	 * @param node
-	 *            org.w3c.dom.Node
-	 * @param map
-	 *            com.ibm.etools.mof2dom.Translator
-	 */
-	protected Node createDOMPath(Node node, Translator map) {
-		Iterator i = DOMUtilities.createPathIterator(map.getDOMPath());
-		Node curNode = node;
-		while (i.hasNext()) {
-			String nodeName = (String) i.next();
-			curNode = findOrCreateNode(node, map, nodeName);
-		}
-		return curNode;
-	}
-
-	protected Element findOrCreateNode(Node parent, Translator map, String segment) {
-		Node node = DOMUtilities.getNodeChild(parent, segment);
-		if (node == null) {
-			// The node did not already exist, create it.
-			Document doc = parent.getOwnerDocument();
-			node = doc.createElement(segment);
-			if (map.isEmptyTag())
-				setEmptyTag((Element) node);
-
-			Node insertBeforeNode = findInitialInsertBeforeNode(parent, map);
-			DOMUtilities.insertBeforeNodeAndWhitespace(parent, node, insertBeforeNode);
-			indent(node, map);
-			addDOMAdapter(node); // Hook up listeners
-		}
-		return (Element) node;
-	}
-
-	/**
-	 * Remove the node passed in if it has only whitespace nodes as children
-	 * 
-	 * @param node
-	 *            org.w3c.dom.Node The node to check
-	 */
-	protected void removeIfEmpty(Node node) {
-		NodeList nl = node.getChildNodes();
-
-		// Run through all the nodes children. If a non-whitespace node
-		// pis found, bail.
-		for (int i = 0; i < nl.getLength(); i++) {
-			Node childNode = nl.item(i);
-			if (!DOMUtilities.isWhitespace(childNode))
-				return;
-		}
-
-		// We only get here if there are no non-whitespace chars, so
-		// simply remove the node.
-		removeDOMChild(node.getParentNode(), node);
-	}
-
-	/**
-	 * Remove the DOM path specified by <map>from <node>
-	 */
-	protected void removeDOMPath(Node node, Translator map) {
-		Node childNode = findDOMPath(node, map, false);
-		while (childNode != null && childNode != node) {
-			removeIfEmpty(childNode);
-			childNode = childNode.getParentNode();
-		}
-	}
-
-	/**
-	 * Create an adapter for a child DOM node
-	 * 
-	 * @param node
-	 *            org.w3c.dom.Node The node to create the adapter for.
-	 */
-	protected EMF2DOMAdapter createAdapter(EObject mofObject, Translator childMap) {
-		//	Assert.isNotNull(childMap.getChildAdapterClass());
-		Assert.isNotNull(mofObject);
-
-		EMF2DOMAdapter adapter = (EMF2DOMAdapter) EcoreUtil.getAdapter(mofObject.eAdapters(), EMF2DOMAdapter.ADAPTER_CLASS);
-
-		if (adapter != null && adapter.isMOFProxy()) {
-			mofObject.eAdapters().remove(adapter);
-			removeAdapters(adapter.getNode());
-			adapter = null;
-		}
-		if (adapter == null)
-			adapter = primCreateAdapter(mofObject, childMap);
-		return adapter;
-	}
-
-	/**
-	 * Create an adapter for a child DOM node
-	 * 
-	 * @param node
-	 *            org.w3c.dom.Node The node to create the adapter for.
-	 */
-	protected EMF2DOMAdapter primCreateAdapter(EObject mofObject, Translator childMap) {
-
-		Element newNode = createNewNode(mofObject, childMap);
-		return new EMF2DOMAdapterImpl(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 EMF2DOMAdapterImpl(node, 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 createAdapter(Node node, Translator childMap) {
-
-		//Assert.isNotNull(childMap.getChildAdapterClass());
-		Assert.isNotNull(node);
-
-		EMF2DOMAdapter adapter = primGetExistingAdapter(node);
-
-		if (adapter != null && adapter.isMOFProxy()) {
-			removeDOMAdapter(node, adapter);
-			adapter.getTarget().eAdapters().remove(adapter);
-			adapter = null;
-		}
-
-		if (adapter == null) {
-			adapter = primCreateAdapter(node, childMap);
-		}
-		return adapter;
-	}
-
-	protected Element createNewNode(EObject mofObject, Translator childMap) {
-		Node node = getNode();
-		Document doc = (node instanceof Document) ? (Document) node : node.getOwnerDocument();
-
-		Element element = doc.createElement(childMap.getDOMName(mofObject));
-		if (childMap.isEmptyTag())
-			setEmptyTag(element);
-
-		return element;
-	}
-
-	protected void setEmptyTag(Element element) {
-		Revisit.toDo();
-		//Need to figure out how to do this with pure DOM apis, if it is
-		// possible
-	}
-
-	/*
-	 * Return true if MOF object is a proxy.
-	 */
-	public boolean isMOFProxy() {
-		if (isRoot || target == null)
-			return false;
-		return ((InternalEObject) target).eIsProxy();
-	}
-
-	public EObject getEObject() {
-		if (isRoot)
-			return null;
-		return (EObject) target;
-	}
-
-	/**
-	 * Return the DOM node that the target of this adapter maps to. If the target MOF object maps to
-	 * more than one DOM node, this node is the top-most node.
-	 */
-	public Node getNode() {
-		return fNode;
-	}
-
-	public void setNode(Node aNode) {
-		fNode = aNode;
-	}
-
-	public void updateDOM() {
-		if (!isNotificationEnabled())
-			return;
-		primUpdateDOM();
-	}
-
-	public void updateMOF() {
-		if (!isNotificationEnabled())
-			return;
-		primUpdateMOF();
-	}
-
-	protected void primUpdateDOM() {
-		if (isRoot)
-			updateDOMRootFeature();
-		else {
-			Translator[] maps = getChildTranslators();
-			for (int i = 0; i < maps.length; i++) {
-				updateDOMFeature(maps[i], getNode(), getEObject());
-			}
-		}
-	}
-
-	public void primUpdateMOF() {
-		if (isRoot)
-			updateMOFRootFeature();
-		else {
-			Translator[] maps = getChildTranslators();
-			for (int i = 0; i < maps.length; i++) {
-				updateMOFFeature(maps[i], getNode(), getEObject());
-			}
-		}
-	}
-
-	protected void updateDOMRootFeature() {
-		boolean notificationFlag = isNotificationEnabled();
-		try {
-			setNotificationEnabled(false);
-			primUpdateDOMMultiFeature(fTranslator, fNode, getResourceContents(), getDOMChildren(fNode, fTranslator), null);
-			updateDOMDocumentType();
-		} finally {
-			setNotificationEnabled(notificationFlag);
-		}
-	}
-
-	protected void updateMOFRootFeature() {
-		boolean notificationFlag = isNotificationEnabled();
-		try {
-			setNotificationEnabled(false);
-			updateMOFDocumentType();
-			primUpdateMOFMultiFeature(fTranslator, fNode, getResourceContents(), getDOMChildren(fNode, fTranslator));
-		} finally {
-			setNotificationEnabled(notificationFlag);
-		}
-	}
-
-	protected DocumentType getDocumentType() {
-		return ((Document) fNode).getDoctype();
-	}
-
-	protected TranslatorResource getResource() {
-		return (TranslatorResource) getTarget();
-	}
-
-	protected EList getResourceContents() {
-		if (!isRoot)
-			throw new IllegalStateException();
-		return ((Resource) getTarget()).getContents();
-	}
-
-	protected void updateDOMDocumentType() {
-
-		DocumentType docType = getDocumentType();
-		String publicId = null, systemId = null, oldPublicId, oldSystemId;
-		oldPublicId = docType == null ? null : docType.getPublicId();
-		oldSystemId = docType == null ? null : docType.getSystemId();
-		TranslatorResource resource = getResource();
-		if (resource != null) {
-			publicId = resource.getPublicId();
-			systemId = resource.getSystemId();
-		}
-		if (!(StringUtil.stringsEqual(publicId, oldPublicId) && StringUtil.stringsEqual(systemId, oldSystemId)))
-			fRenderer.replaceDocumentType(resource.getDoctype(), publicId, systemId);
-	}
-
-	protected void updateDOMDocumentType(Notification msg) {
-		if (msg.getFeature() == TranslatorResource.DOC_TYPE_FEATURE)
-			updateDOMDocumentType();
-	}
-
-	protected void updateMOFDocumentType() {
-
-		TranslatorResource resource = getResource();
-		if (resource == null)
-			return;
-
-		String publicId = null, systemId = null;
-		DocumentType docType = getDocumentType();
-
-		if (docType != null) {
-			publicId = docType.getPublicId();
-			systemId = docType.getSystemId();
-		}
-		if (!(StringUtil.stringsEqual(publicId, resource.getPublicId()) && StringUtil.stringsEqual(systemId, resource.getSystemId())))
-			resource.setDoctypeValues(publicId, systemId);
-	}
-
-	public void notifyChanged(Notification msg) {
-
-		if (isRoot) {
-			notifyChangedForRoot(msg);
-			return;
-		}
-		if (isDependencyFeature(msg))
-			handleDependencyFeature(msg);
-
-		if (!isNotificationEnabled())
-			return;
-
-		debugMOFNotify(msg);
-
-		switch (msg.getEventType()) {
-			case Notification.ADD :
-			case Notification.REMOVE :
-			case Notification.ADD_MANY :
-			case Notification.REMOVE_MANY :
-			case Notification.SET :
-			case Notification.UNSET :
-			case Notification.MOVE :
-				Translator translator = findTranslator(msg);
-				if (translator == null)
-					translator = addVariableTranslatorIfNecessary(msg);
-				if (translator != null)
-					updateDOMFeature(translator, getNode(), getEObject());
-				break;
-		}
-	}
-
-	protected void notifyChangedForRoot(Notification msg) {
-		if (!isNotificationEnabled())
-			return;
-
-		debugMOFNotify(msg);
-
-		switch (msg.getEventType()) {
-			case Notification.ADD :
-			case Notification.REMOVE :
-			case Notification.ADD_MANY :
-			case Notification.REMOVE_MANY :
-				primUpdateDOM();
-				break;
-			case Notification.SET :
-				updateDOMDocumentType(msg);
-				break;
-			case EtoolsCopySession.RESOURCE_COPIED :
-				updateDOM();
-				break;
-		}
-	}
-
-	protected void addDependencyAdapter(EObject child) {
-		Adapter existing = EcoreUtil.getExistingAdapter(child, DependencyAdapter.KEY);
-		if (existing != null)
-			return;
-		DependencyAdapter forwarder = new DependencyAdapter();
-		child.eAdapters().add(forwarder);
-		forwarder.setTarget(child);
-	}
-
-	protected void addDOMAdapter() {
-
-		primAddDOMAdapter(fNode, this);
-		if (fDebug) {
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("Adding DOM adapter: " + this); //$NON-NLS-1$
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tto: " + fNode); //$NON-NLS-1$
-		}
-
-		// Go through the maps. All of the DOM nodes that are not listened
-		// to by another DOM Node adapter, must be listened to by this adapter.
-		NodeList childNodes = fNode.getChildNodes();
-		for (int j = 0; j < childNodes.getLength(); j++) {
-			Node childNode = childNodes.item(j);
-			int nodeType = childNode.getNodeType();
-			if (!DOMUtilities.isTextNode(childNode) && nodeType != Node.COMMENT_NODE) {
-				Translator map = findTranslator(childNode.getNodeName(), false);
-				if (map != null && map.isManagedByParent())
-					addDOMAdapter(childNode);
-			}
-		}
-	}
-
-	protected Translator addVariableTranslatorIfNecessary(Notification msg) {
-		VariableTranslatorFactory fact = fTranslator.getVariableTranslatorFactory();
-		Translator trans = null;
-		if (fact != null && fact.accepts(msg)) {
-			trans = fact.create(msg);
-			if (trans != null)
-				childTranslators = (Translator[]) Translator.concat(childTranslators, trans);
-		}
-		return trans;
-	}
-
-	protected Text createTextNode(Document doc, Translator map, String text) {
-		String nonnulltext = (text != null) ? text : ""; //$NON-NLS-1$
-		return map.isCDATAContent() ? doc.createCDATASection(nonnulltext) : doc.createTextNode(nonnulltext);
-	}
-
-	protected String extractReadAheadName() {
-		if (!fTranslator.hasReadAheadNames())
-			return null;
-		String readAheadName = null;
-
-		ReadAheadHelper helper = fTranslator.getReadAheadHelper(fNode.getNodeName());
-		if (helper == null)
-			return null;
-
-		Node child = null;
-		String[] names = helper.getValues();
-		if (helper.getChildDOMName() == null) {
-			for (int i = 0; i < names.length; i++) {
-				child = DOMUtilities.getNodeChild(fNode, names[i]);
-				if (child != null) {
-					readAheadName = names[i];
-					break;
-				}
-			}
-		} else {
-			child = DOMUtilities.getNodeChild(fNode, helper.getChildDOMName());
-			if (child != null)
-				readAheadName = DOMUtilities.getChildText(child);
-		}
-		if (readAheadName == null)
-			readAheadName = names[0];
-		return readAheadName;
-	}
-
-	/**
-	 * Extracts the text from <node>and converts it to an object suitable for setting into <feature>
-	 */
-	protected Object extractValue(Node node, Translator map, EObject emfObject) {
-
-		// Extract the value from the text child
-		Node textNode = DOMUtilities.getChildTextNode(node);
-		String trimmedValue = null;
-		if (textNode != null)
-			trimmedValue = textNode.getNodeValue();
-		try {
-			return map.convertStringToValue(trimmedValue, emfObject);
-		} catch (FeatureValueConversionException ex) {
-			handleFeatureValueConversionException(ex);
-			return null;
-		}
-	}
-
-	/**
-	 * @param ex
-	 */
-	protected void handleFeatureValueConversionException(FeatureValueConversionException ex) {
-		throw ex;
-
-	}
-
-	/*
-	 * Finds the child node that <map> specifies. If there is more than one child that satisfies
-	 * <map> then the first one is returned.
-	 * 
-	 * This method traverses past the domPath if one is specified in the <map>.
-	 */
-	protected Node findDOMNode(Node parent, Translator map) {
-		return findDOMNode(parent, map, false);
-	}
-
-	/*
-	 * Finds the child node that <map> specifies. If there is more than one child that satisfies
-	 * <map> then the first one is returned. The <addAdapters> boolean is used to determine if the
-	 * receiver is added as an adapter to every node found on the path.
-	 * 
-	 * This method traverses past the domPath if one is specified in the <map>.
-	 */
-	protected Node findDOMNode(Node parent, Translator map, boolean addAdapters) {
-
-		// First, trace down the path
-		Node curNode = findDOMPath(parent, map, addAdapters);
-		if (map.isDOMTextValue() || map.isDOMAttribute() || curNode == null)
-			return curNode;
-
-		// Now look for the first DOM name we can find
-		String[] domNames = map.getDOMNames();
-		Node node = null;
-		for (int i = 0; i < domNames.length; i++) {
-			String nodeName = domNames[i];
-			List nodes = DOMUtilities.getNodeChildren(curNode, nodeName);
-			if (nodes != null && !nodes.isEmpty()) {
-				if (nodes.size() > 1)
-					handleInvalidMultiNodes(nodeName);
-				node = (Node) nodes.get(0);
-				if (node != null) {
-					if (addAdapters && (map != null || map.isManagedByParent()))
-						addDOMAdapter(curNode);
-					break;
-				}
-			}
-		}
-		return node;
-	}
-
-	protected void handleInvalidMultiNodes(String nodeName) {
-		throw new IllegalStateException(WFTUtilsResourceHandler.getString(WFTUtilsResourceHandler.EMF2DOMAdapterImpl_ERROR_0, new Object[]{nodeName})); //$NON-NLS-1$
-	}
-
-	/**
-	 * Creates the path specified by <map>under <node>. Only the portion of the path that does not
-	 * exist (if any) is created
-	 * 
-	 * @param node
-	 *            org.w3c.dom.Node
-	 * @param map
-	 *            com.ibm.etools.mof2dom.Translator
-	 */
-	protected Text findOrCreateTextNode(Node parent, Translator map, String text) {
-		Text textNode = DOMUtilities.getChildTextNode(parent);
-		if (textNode != null) {
-			textNode.setData(text);
-		} else {
-			if (!isEmptyTag((Element) parent)) {
-				Text newNode = createTextNode(parent.getOwnerDocument(), map, text);
-				DOMUtilities.insertBeforeNode(parent, newNode, null);
-				return newNode;
-			}
-		}
-		return textNode;
-	}
-
-	protected Translator findTranslator(String tagName, boolean attributeMap) {
-		Translator[] maps = getChildTranslators();
-		for (int i = 0; i < maps.length; i++) {
-			Translator map = maps[i];
-			if (map.isMapFor(tagName) && attributeMap == map.isDOMAttribute())
-				return maps[i];
-		}
-
-		return null;
-	}
-
-	protected EMF2DOMAdapter getExistingAdapter(Node aNode) {
-		EMF2DOMAdapter adapter = primGetExistingAdapter(aNode);
-		if (adapter != null && adapter.isMOFProxy()) {
-			removeDOMAdapter(aNode, adapter);
-			adapter.getTarget().eAdapters().remove(adapter);
-			adapter = null;
-		}
-		return adapter;
-	}
-
-	protected void handleDependencyFeature(Notification msg) {
-		if (msg.getOldValue() != null)
-			removeDependencyAdapter((EObject) msg.getOldValue());
-		if (msg.getNewValue() != null)
-			addDependencyAdapter((EObject) msg.getNewValue());
-	}
-
-	protected boolean isDependencyFeature(Notification msg) {
-		switch (msg.getEventType()) {
-			case Notification.SET :
-				return fTranslator.isDependencyParent() && fTranslator.getDependencyFeature() == msg.getFeature();
-			default :
-				return false;
-		}
-	}
-
-	protected boolean isEmptyTag(Element parent) {
-		Revisit.toDo();
-		//Determine how to implement this with pure DOM apis, if possible.
-		return false;
-	}
-
-	protected void postUpdateDOMFeature(Translator map, Node node, EObject mofObject) {
-	}
-
-	protected void preUpdateDOMFeature(Translator map, Node node, EObject mofObject) {
-	}
-
-	/**
-	 * Update an attribute of the target DOM object from with the values currently stored in the MOF
-	 * object. The
-	 * 
-	 * @map specifies the name of the MOF attribute to update and the name of the DOM node.
-	 * 
-	 * @param map
-	 *            com.ibm.etools.mof2dom.AttributeTranslator
-	 */
-	protected void primUpdateDOMFeature(Translator map, Node node, EObject mofObject) {
-		Object attrValue = null;
-		boolean isSet = false;
-		if (map.isIDMap()) {
-			try {
-				attrValue = map.getMOFValue(mofObject);
-			} catch (IDTranslator.NoResourceException ex) {
-				//If the object has been removed from the resource,
-				//No need to update
-				return;
-			}
-			isSet = attrValue != null;
-		} else {
-			attrValue = map.getMOFValue(mofObject);
-			isSet = map.isSetMOFValue(mofObject);
-		}
-
-		if (map.isDOMAttribute()) {
-			// An attribute of the MOF object maps to an attribute of the
-			// DOM node. Get the value of the MOF attribute and set it
-			// into DOM node.
-			Element e = (Element) createDOMPath(node, map);
-			if (attrValue != null && isSet)
-				e.setAttribute(map.getDOMName(mofObject), map.convertValueToString(attrValue, mofObject));
-			else
-				e.removeAttribute(map.getDOMName(mofObject));
-		} else {
-			updateDOMSubtree(map, node, mofObject, attrValue);
-		}
-	}
-
-	/**
-	 * Update an attribute of the target DOM object from with the values currently stored in the MOF
-	 * object. The
-	 * 
-	 * @map specifies the name of the MOF attribute to update and the name of the DOM node.
-	 */
-	protected void primUpdateDOMLinkFeature(Translator map, Node node, EObject mofObject) {
-		LinkUpdaterTarget.INSTANCE.updateDOM(map, node, mofObject);
-
-	}
-
-	/**
-	 * Update all the children of the target MOF object in the relationship described by
-	 * 
-	 * @map.
-	 */
-	protected void primUpdateDOMMultiFeature(Translator map, Node node, EObject mofObject) {
-
-		List mofChildren = map.getMOFChildren(mofObject);
-		List domChildren = getDOMChildren(node, map);
-
-		primUpdateDOMMultiFeature(map, node, mofChildren, domChildren, mofObject);
-	}
-
-	/**
-	 * Update an attribute of the target MOF object from the DOM node subtree. The
-	 * 
-	 * @map specifies the name of the MOF attribute to update and the name of the DOM node.
-	 */
-	protected boolean primUpdateMOFFeature(Translator map, Node node, EObject mofObject) {
-		if (!map.featureExists(mofObject))
-			return false;
-		Object domValue = null;
-		boolean updateMOFAttAdapter = false;
-		boolean isUnset = false;
-		EMF2DOMAdapter attrAdapter = null;
-
-		Node child = findDOMNode(node, map, true);
-
-		if (map.isDOMAttribute() && child != null) {
-			// An attribute of the MOF object maps to an attribute of the
-			// DOM node. Get the value of the DOM attribute and set it
-			// into the MOF object.
-
-			Attr domAttr = (Attr) child.getAttributes().getNamedItem(map.getDOMName(mofObject));
-			if (domAttr != null) {
-				domValue = domAttr.getValue();
-				domValue = map.convertStringToValue((String) domValue, mofObject);
-			} else
-				isUnset = true;
-		} else {
-			// An attribute of the MOF object is actually a sub-element
-			// of the DOM node. Search for the first sub-element with
-			// the correct name to use as an attribute.
-			if (child != null) {
-				// Check to see if this is a single valued attribute that has
-				// a MOF object as its value
-				if (!map.isManagedByParent()) {
-					attrAdapter = createAdapter(child, map);
-					updateMOFAttAdapter = true;
-					domValue = attrAdapter.getTarget();
-				} else {
-					// Check to make sure the child is adapted. If not, adapt
-					// it.
-					addDOMAdapter(child);
-
-					// Extract the value from the text child
-					domValue = extractValue(child, map, mofObject);
-				}
-			} else
-				isUnset = true;
-		}
-
-		// Set the attribute extracted from the DOM to the MOF object.
-		boolean hasChanged = true;
-		try {
-			if (map.isIDMap())
-				map.setMOFValue(mofObject, domValue);
-			else {
-				Object oldValue = null;
-				oldValue = map.getMOFValue(mofObject);
-				boolean isSet = map.isSetMOFValue(mofObject);
-				//In the case of enums with default values, we need to trip
-				// the attribute from
-				//default to a set value
-				if (oldValue == domValue) {
-					if (oldValue == null || isSet)
-						hasChanged = false;
-				} else if (domValue == null && !isSet)
-					//If the domValue is null and the feature is not set, then
-					// we don't need
-					//to do anything
-					hasChanged = false;
-				else if (oldValue != null && oldValue.equals(domValue) && isSet)
-					hasChanged = false;
-				if (oldValue == null && domValue == null && map.isSetMOFValue(mofObject) == isUnset)
-					hasChanged = true;
-				if (hasChanged) {
-					if (!(map.isDataType()) && !map.isShared())
-						removeMOFValue((EObject) oldValue, map);
-					if (domValue == null)
-						map.unSetMOFValue(mofObject);
-					else
-						map.setMOFValue(mofObject, domValue);
-
-					if ((domValue == null && !(map.isEnumFeature())) || isUnset)
-						map.unSetMOFValue(mofObject); //unset
-					// null
-					// for
-					// non
-					// enum
-					// features
-
-					if (updateMOFAttAdapter)
-						attrAdapter.updateMOF();
-				}
-			}
-		} catch (FeatureValueConversionException ex) {
-			handleFeatureValueConversionException(ex);
-			map.unSetMOFValue(mofObject);
-		}
-		return hasChanged;
-	}
-
-	/**
-	 * Update an attribute of the target MOF object from the DOM node subtree. This method is only
-	 * called if the DOM node changes and the map is an object link map. The
-	 * 
-	 * @map specifies the name of the MOF attribute to update and the name of the DOM node.
-	 * 
-	 * @param map
-	 *            com.ibm.etools.mof2dom.AttributeTranslator
-	 * @return Return true if the MOF feature was updated, false if no update was done.
-	 */
-	protected void primUpdateMOFLinkFeature(Translator map, Node node, EObject mofObject) {
-		LinkUpdaterTarget.INSTANCE.updateMOF(map, node, mofObject);
-	}
-
-	/**
-	 * Update all the children of the target MOF object in the relationship described by
-	 * 
-	 * @map.
-	 * 
-	 * @param map
-	 *            com.ibm.etools.mof2dom.AttributeTranslator Describes the mapping from the MOF
-	 *            attribute name to the DOM node name
-	 */
-	protected void primUpdateMOFMultiFeature(Translator map, Node node, EObject mofObject) {
-		// If the feature is a collection of strings or ints, call a special
-		// method
-		// that handles this.
-		if (map.isManagedByParent()) {
-			updateMOFMultiPrimitiveFeature(map, node, mofObject);
-			return;
-		}
-
-		List nodeChildren = getDOMChildren(node, map);
-		List mofChildren = map.getMOFChildren(mofObject);
-
-		primUpdateMOFMultiFeature(map, node, mofChildren, nodeChildren);
-	}
-
-	protected void removeDependencyAdapter(EObject obj) {
-		Adapter existing = EcoreUtil.getExistingAdapter(obj, DependencyAdapter.KEY);
-		if (existing != null)
-			obj.eAdapters().remove(existing);
-	}
-
-	/**
-	 * Removes all the DOM children from <parent>that are represented by <map>.
-	 */
-	protected void removeDOMChildren(Node parent, Translator map) {
-		String[] domNames = map.getDOMNames();
-		HashSet domNamesSet = new HashSet(domNames.length);
-		for (int i = 0; i < domNames.length; i++)
-			domNamesSet.add(domNames[i]);
-
-		// Walk through all the children and find any that match the map.
-		NodeList nl = parent.getChildNodes();
-		List toRemove = new ArrayList();
-		for (int i = 0; i < nl.getLength(); i++) {
-			Node childNode = nl.item(i);
-			if (domNamesSet.contains(childNode.getNodeName()))
-				toRemove.add(childNode);
-		}
-
-		// Remove any children that were found.
-		for (int i = 0; i < toRemove.size(); i++) {
-			Node childNode = (Node) toRemove.get(i);
-			removeDOMChild(parent, childNode, true);
-		}
-	}
-
-	protected void setTargetFromNode() {
-		setTarget(fTranslator.createEMFObject(fNode.getNodeName(), extractReadAheadName()));
-	}
-
-	/**
-	 * Update an attribute of the target DOM object from with the values currently stored in the MOF
-	 * object. The
-	 * 
-	 * @map specifies the name of the MOF attribute to update and the name of the DOM node.
-	 * 
-	 * @param map
-	 *            com.ibm.etools.mof2dom.AttributeTranslator
-	 */
-	final public void updateDOMFeature(Translator map, Node node, EObject mofObject) {
-		if (!isNotificationEnabled())
-			return;
-		try {
-			preUpdateDOMFeature(map, node, mofObject);
-			if (map.isMultiValued()) {
-				updateDOMMultiFeature(map, node, mofObject);
-				return;
-			}
-
-			if (fDebug) {
-				org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("Updating DOM Node: " + node); //$NON-NLS-1$
-				org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tfrom: " + mofObject); //$NON-NLS-1$
-				org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tmap : " + map); //$NON-NLS-1$
-			}
-			boolean notificationFlag = isNotificationEnabled();
-			try {
-				setNotificationEnabled(false);
-				primUpdateDOMFeature(map, node, mofObject);
-			} finally {
-				setNotificationEnabled(notificationFlag);
-			}
-
-			if (map.isTargetLinkMap()) {
-				updateDOMLinkFeature(map, node, mofObject);
-			}
-		} finally {
-			postUpdateDOMFeature(map, node, mofObject);
-		}
-	}
-
-	/**
-	 * Update an attribute of the target DOM object from the values currently stored in the MOF
-	 * object. The
-	 * 
-	 * @map specifies the name of the MOF attribute to update and the name of the DOM node.
-	 * 
-	 * @param map
-	 *            com.ibm.etools.mof2dom.AttributeTranslator
-	 */
-	final protected void updateDOMLinkFeature(Translator map, Node node, EObject mofObject) {
-		if (fDebug) {
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("Updating DOM Node (link): " + node); //$NON-NLS-1$
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tfrom: " + mofObject); //$NON-NLS-1$
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tmap : " + map); //$NON-NLS-1$
-		}
-		primUpdateDOMLinkFeature(map, node, mofObject);
-	}
-
-	/**
-	 * Update all the children of the target MOF object in the relationship described by
-	 * 
-	 * @map.
-	 * 
-	 * @param map
-	 *            com.ibm.etools.mof2dom.AttributeTranslator Describes the mapping from the MOF
-	 *            attribute name to the DOM node name
-	 */
-	final protected void updateDOMMultiFeature(Translator map, Node node, EObject mofObject) {
-		if (fDebug) {
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("Updating DOM Node (multi): " + node); //$NON-NLS-1$
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tfrom: " + mofObject); //$NON-NLS-1$
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tmap : " + map); //$NON-NLS-1$
-		}
-		boolean notificationFlag = isNotificationEnabled();
-		try {
-			setNotificationEnabled(false);
-			primUpdateDOMMultiFeature(map, node, mofObject);
-		} finally {
-			setNotificationEnabled(notificationFlag);
-		}
-	}
-
-	/**
-	 * Update a DOM subtree to reflect the mofObject and map passed in. The subtree is of <node>is
-	 * updated.
-	 */
-	protected void updateDOMSubtree(Translator map, Node node, EObject mofObject, Object attrValue) {
-
-		if (map.featureExists(mofObject)) {
-			if ((map.isEnumFeature() || map.isBooleanFeature()) && (map.isUnsettable() && !map.isSetMOFValue(mofObject)))
-				attrValue = null;
-		} else
-			attrValue = map.extractStringValue(mofObject);
-
-		// Create and/or update the DOM subtree
-		if (attrValue != null) {
-			Node parent = createDOMPath(node, map);
-			if (map.isManagedByParent()) {
-				// Handle the case where the mof value is not another
-				// mof object (primitive)
-				if (map.getDOMName(mofObject) != null && map.getDOMName(mofObject).startsWith("#")) //$NON-NLS-1$
-					return;
-
-				Element child = map.isDOMTextValue() ? (Element) parent : findOrCreateNode(parent, map, map.getDOMName(mofObject));
-
-				findOrCreateTextNode(child, map, map.convertValueToString(attrValue, mofObject));
-			} else {
-				// Handle the case were the mof value is a mof object.
-				EObject mofValue = (EObject) attrValue;
-				EMF2DOMAdapter valueAdapter = (EMF2DOMAdapter) EcoreUtil.getExistingAdapter(mofValue, EMF2DOMAdapter.ADAPTER_CLASS);
-				if (valueAdapter != null)
-					valueAdapter.updateDOM();
-				else {
-					removeDOMChildren(parent, map);
-					EMF2DOMAdapter adapter = createAdapter(mofValue, map);
-					List mofChildren = map.getMOFChildren(mofObject);
-					List domChildren = getDOMChildren(parent, map);
-
-					Node insertBeforeNode = findInsertBeforeNode(parent, map, mofChildren, 0, domChildren);
-					DOMUtilities.insertBeforeNodeAndWhitespace(parent, adapter.getNode(), insertBeforeNode);
-					boolean notificationFlag = adapter.isNotificationEnabled();
-					adapter.setNotificationEnabled(false);
-					try {
-						indent(adapter.getNode(), map);
-					} finally {
-						adapter.setNotificationEnabled(notificationFlag);
-					}
-					adapter.updateDOM();
-				}
-			}
-		} else {
-			// The attribute value was set to null or unset. Remove any
-			// existing DOM nodes.
-			Node child = findDOMNode(node, map);
-			if (child != null)
-				removeDOMChild(child.getParentNode(), child);
-		}
-	}
-
-	/**
-	 * Update a feature that is set by linking to another existing object. This method is called
-	 * when the MOF object is updated in order to update DOM nodes.
-	 */
-	final protected void updateMOFLinkFeature(Translator map, Node node, EObject mofObject) {
-		if (fDebug) {
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("Updating MOFObject (link): " + mofObject); //$NON-NLS-1$
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tfrom: " + node); //$NON-NLS-1$
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tmap : " + map); //$NON-NLS-1$
-		}
-		boolean notificationFlag = isNotificationEnabled();
-		try {
-			setNotificationEnabled(false);
-			primUpdateMOFLinkFeature(map, node, mofObject);
-		} finally {
-			setNotificationEnabled(notificationFlag);
-		}
-	}
-
-	/**
-	 * Update all the children of the target MOF object in the relationship described by
-	 * 
-	 * @map.
-	 * 
-	 * @param map
-	 *            com.ibm.etools.mof2dom.AttributeTranslator Describes the mapping from the MOF
-	 *            attribute name to the DOM node name
-	 */
-	final protected void updateMOFMultiFeature(Translator map, Node node, EObject mofObject) {
-		if (fDebug) {
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("Updating MOFObject (multi): " + mofObject); //$NON-NLS-1$
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tfrom: " + node); //$NON-NLS-1$
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tmap : " + map); //$NON-NLS-1$
-		}
-		boolean notificationFlag = isNotificationEnabled();
-		try {
-			setNotificationEnabled(false);
-			primUpdateMOFMultiFeature(map, node, mofObject);
-		} finally {
-			setNotificationEnabled(notificationFlag);
-		}
-	}
-
-	/**
-	 * Update all the children of the target MOF object in the relationship described by
-	 * 
-	 * @map. The relationship MUST BE a collection of string for this method to work.
-	 */
-	protected void updateMOFMultiPrimitiveFeature(Translator map, Node node, EObject mofObject) {
-		List nodeChildren = getDOMChildren(node, map);
-
-		map.clearList(mofObject);
-
-		// Go through the list of nodes and update the MOF collection
-		for (int i = 0; i < nodeChildren.size(); i++) {
-			Node child = (Node) nodeChildren.get(i);
-			Object attributeValue = extractValue(child, map, mofObject);
-			if (attributeValue != null)
-				map.setMOFValue(mofObject, attributeValue, i);
-
-			// Adapt the node so update will occur.
-			addDOMAdapter(child);
-		}
-		if (map.hasDOMPath() && nodeChildren.isEmpty() && findDOMPath(node, map, false) != null)
-			map.setMOFValueFromEmptyDOMPath(mofObject);
-	}
-
-	/**
-	 * Update an attribute of the target MOF object from the DOM node subtree. The
-	 * 
-	 * @map specifies the name of the MOF attribute to update and the name of the DOM node.
-	 * 
-	 * @param map
-	 *            com.ibm.etools.mof2dom.AttributeTranslator
-	 */
-	public void updateMOFFeature(Translator map, Node node, EObject mofObject) {
-		if (!isNotificationEnabled())
-			return;
-		if (map.isMultiValued()) {
-			updateMOFMultiFeature(map, node, mofObject);
-			return;
-		} else if (map.isComment()) {
-			updateMOFCommentFeature(map, node, mofObject);
-			return;
-		}
-
-		// TODO MDE Add a map.isComment() and updateMOFCommentFeature(map, node, mofObject);
-
-		if (fDebug) {
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("Updating MOFObject: " + mofObject); //$NON-NLS-1$
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tfrom: " + node); //$NON-NLS-1$
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tmap : " + map); //$NON-NLS-1$
-		}
-		boolean notificationFlag = isNotificationEnabled();
-		boolean hasChanged = false;
-		try {
-			setNotificationEnabled(false);
-			hasChanged = primUpdateMOFFeature(map, node, mofObject);
-		} finally {
-			setNotificationEnabled(notificationFlag);
-		}
-
-		if (map.isTargetLinkMap() && hasChanged)
-			updateMOFLinkFeature(map, node, mofObject);
-	}
-
-	/**
-	 * @param map
-	 * @param node
-	 * @param mofObject
-	 */
-	public void updateMOFCommentFeature(Translator map, Node node, EObject mofObject) {
-		Node commentNode = node;
-		/* scan up the dom to find the first comment node before this node */
-		while ((commentNode = commentNode.getPreviousSibling()) != null && commentNode.getNodeType() != Node.COMMENT_NODE) {
-			/* no comment available */
-			if (commentNode.getNodeType() == Node.ELEMENT_NODE)
-				return;
-		}
-		if (commentNode != null)
-			map.setMOFValue(mofObject, commentNode.getNodeValue());
-
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2DOMRenderer.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2DOMRenderer.java
deleted file mode 100644
index 206860d..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2DOMRenderer.java
+++ /dev/null
@@ -1,264 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.resource;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.OutputKeys;
-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.emf.common.util.WrappedException;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.internal.emf.utilities.DOMLoadOptions;
-import org.eclipse.wst.common.internal.emf.utilities.DOMUtilities;
-import org.eclipse.wst.common.internal.emf.utilities.Revisit;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-
-
-public class EMF2DOMRenderer extends AbstractRendererImpl implements Renderer {
-
-	protected Map domAdapterRegistry;
-	protected boolean needsToCreateDOM = true;
-	protected Document document;
-
-	/**
-	 * Constructor for DOMRendererImpl.
-	 */
-	public EMF2DOMRenderer() {
-		super();
-		if (managesDOMAdapters())
-			initDOMAdapterRegistry();
-	}
-
-	/**
-	 * @see com.ibm.etools.emf2xml.Renderer#doLoad(InputStream, Map)
-	 */
-	public void doLoad(InputStream in, Map options) throws IOException {
-		if ((in != null) || !useStreamsForIO()) {
-			loadDocument(in, options);
-			EMF2DOMAdapter adapter = createRootDOMAdapter();
-			adapter.updateMOF();
-		}
-	}
-
-	protected void loadDocument(InputStream in, Map options) throws IOException {
-		try {
-			DOMLoadOptions domOpts = new DOMLoadOptions();
-			domOpts.setAllowJavaEncodings(true);
-			domOpts.setExpandEntityRefererences(true);
-			domOpts.setValidate(isValidating());
-			document = DOMUtilities.loadDocument(in, domOpts, getResource().getEntityResolver());
-			needsToCreateDOM = false;
-		} catch (RuntimeException t_rex) {
-			throw t_rex;
-		} catch (IOException iox) {
-			throw iox;
-		} catch (Exception ex) {
-			throw new WrappedException(ex);
-		}
-	}
-
-
-	/**
-	 * @see com.ibm.etools.emf2xml.Renderer#doSave(OutputStream, Map)
-	 */
-	public void doSave(OutputStream outputStream, Map options) throws IOException {
-		createDOMTreeIfNecessary();
-		serializeDocument(outputStream);
-	}
-
-	/**
-	 * Subclasses should override if adapters are not cached within this renderer, e.g., they are
-	 * stored in notifying Nodes
-	 */
-	protected boolean managesDOMAdapters() {
-		return true;
-	}
-
-	protected void initDOMAdapterRegistry() {
-		if (domAdapterRegistry == null)
-			domAdapterRegistry = new HashMap();
-	}
-
-	public void registerDOMAdapter(Node node, EMF2DOMAdapter adapter) {
-		domAdapterRegistry.put(node, adapter);
-	}
-
-	public EMF2DOMAdapter getExistingDOMAdapter(Node node) {
-		return (EMF2DOMAdapter) domAdapterRegistry.get(node);
-	}
-
-	public void removeDOMAdapter(Node aNode, EMF2DOMAdapter anAdapter) {
-		domAdapterRegistry.remove(aNode);
-	}
-
-	/**
-	 * @see com.ibm.etools.emf2xml.Renderer#prepareToAddContents()
-	 */
-	public void prepareToAddContents() {
-		// createDOMTreeIfNecessary();
-	}
-
-	protected Node createDOMTree() {
-		createDocument();
-		EMF2DOMAdapter adapter = createRootDOMAdapter();
-		adapter.updateDOM();
-		needsToCreateDOM = false;
-		return document;
-	}
-
-
-	protected EMF2DOMAdapter createRootDOMAdapter() {
-		EMF2DOMAdapter root = new EMF2DOMAdapterImpl(getResource(), document, this, getResource().getRootTranslator());
-		registerDOMAdapter(document, root);
-		return root;
-	}
-
-
-	protected void createDOMTreeIfNecessary() {
-		if (needsToCreateDOM)
-			createDOMTree();
-	}
-
-	/**
-	 * Create a new Document given
-	 * 
-	 * @aResource.
-	 */
-	protected void createDocument() {
-		TranslatorResource res = getResource();
-		res.setDefaults();
-		try {
-			document = DOMUtilities.createNewDocument(res.getDoctype(), res.getPublicId(), res.getSystemId());
-		} catch (ParserConfigurationException e) {
-			throw new WrappedException(e);
-		} catch (SAXException e) {
-			throw new WrappedException(e);
-		} catch (IOException e) {
-			throw new WrappedException(e);
-		}
-	}
-
-	public void serializeDocument(OutputStream out) throws IOException {
-		/*
-		 * OutputFormat format = createOutputFormat(); Serializer serializer =
-		 * SerializerFactory.getSerializerFactory(Method.XML).makeSerializer(out, format);
-		 * serializer.asDOMSerializer().serialize(document);
-		 */
-		try {
-			TransformerFactory factory = TransformerFactory.newInstance();
-			/*
-			 * try { factory.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA); } catch
-			 * (IllegalArgumentException x) { }
-			 */
-			Transformer transformer = factory.newTransformer();
-
-			transformer.setOutputProperty(OutputKeys.ENCODING, getResource().getEncoding());
-			transformer.setOutputProperty(OutputKeys.VERSION, getResource().getXMLVersion());
-			transformer.setOutputProperty(OutputKeys.METHOD, "xml"); //$NON-NLS-1$
-			transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); //$NON-NLS-1$
-			if (getResource().getPublicId() != null)
-				transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, getResource().getPublicId());
-			if (getResource().getSystemId() != null)
-				transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, getResource().getSystemId());
-			transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$            
-			transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); //$NON-NLS-1$ //$NON-NLS-2$
-			DOMSource source = new DOMSource(document.getDocumentElement());
-			/* source.setSystemId(getResource().getSystemId()); */
-			transformer.transform(source, new StreamResult(out));
-		} catch (TransformerConfigurationException e) {
-			Logger.getLogger().logError(e);
-		} catch (TransformerFactoryConfigurationError e) {
-			Logger.getLogger().logError(e);
-		} catch (TransformerException e) {
-			Logger.getLogger().logError(e);
-		} finally {
-		}
-	}
-
-	/*
-	 * protected OutputFormat createOutputFormat() { OutputFormat format = new OutputFormat();
-	 * format.setIndenting(true); format.setLineSeparator(DOMUtilities.NEWLINE_STRING);
-	 * //$NON-NLS-1$ format.setEncoding(getResource().getEncoding());
-	 * format.setVersion(getResource().getXMLVersion()); return format; }
-	 */
-
-	public void replaceDocumentType(String docTypeName, String publicId, String systemId) {
-		Revisit.revisit();
-		Document newDoc = null;
-		// Need be able to update the doctype directly on the existing document; right now can't
-		// because
-		// of limitations on parser neutral apis
-
-		try {
-			newDoc = DOMUtilities.createNewDocument(docTypeName, publicId, systemId);
-		} catch (ParserConfigurationException e) {
-			throw new WrappedException(e);
-		} catch (SAXException e) {
-			throw new WrappedException(e);
-		} catch (IOException e) {
-			throw new WrappedException(e);
-		}
-
-
-		replaceNode(document.getDocumentElement(), newDoc, newDoc);
-		readapt(document, newDoc);
-		document = newDoc;
-	}
-
-	protected void replaceNode(Node oldChild, Node newParent, Document newDoc) {
-		Node newChild = newDoc.importNode(oldChild, false);
-		newParent.appendChild(newChild);
-		readapt(oldChild, newChild);
-		NodeList children = oldChild.getChildNodes();
-		int length = children.getLength();
-		for (int i = 0; i < length; i++) {
-			replaceNode(children.item(i), newChild, newDoc);
-		}
-	}
-
-	public void preUnload() {
-		EMF2DOMAdapter adapter = (EMF2DOMAdapter) EcoreUtil.getAdapter(resource.eAdapters(), EMF2DOMAdapter.ADAPTER_CLASS);
-		if (adapter != null) {
-			adapter.removeAdapters(adapter.getNode());
-		}
-	}
-
-	protected void readapt(Node oldChild, Node newChild) {
-		EMF2DOMAdapter adapter = getExistingDOMAdapter(oldChild);
-		if (adapter != null) {
-			registerDOMAdapter(newChild, adapter);
-			// Some nodes are managed by the parent and thus the
-			// node should not be set on the parent adapter
-			if (adapter.getNode() == oldChild)
-				adapter.setNode(newChild);
-		}
-	}
-
-	public int getVersionID() {
-		return getResource().getVersionID();
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2DOMRendererFactory.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2DOMRendererFactory.java
deleted file mode 100644
index fce5603..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2DOMRendererFactory.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.resource;
-
-
-public class EMF2DOMRendererFactory extends RendererFactory {
-
-	public static final EMF2DOMRendererFactory INSTANCE = new EMF2DOMRendererFactory();
-
-	public EMF2DOMRendererFactory() {
-		super();
-	}
-
-	/**
-	 * @see com.ibm.etools.emf2xml.RendererFactory#createRenderer()
-	 */
-	public Renderer createRenderer() {
-		EMF2DOMRenderer renderer = new EMF2DOMRenderer();
-		renderer.setValidating(isValidating());
-		return renderer;
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2DOMRendererFactoryDefaultHandler.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2DOMRendererFactoryDefaultHandler.java
deleted file mode 100644
index 1257a06..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2DOMRendererFactoryDefaultHandler.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Dec 1, 2003
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.wst.common.internal.emf.resource;
-
-
-/**
- * @author schacher
- * 
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public class EMF2DOMRendererFactoryDefaultHandler implements RendererFactoryDefaultHandler {
-
-	public static final EMF2DOMRendererFactoryDefaultHandler INSTANCE = new EMF2DOMRendererFactoryDefaultHandler();
-
-	/**
-	 *  
-	 */
-	protected EMF2DOMRendererFactoryDefaultHandler() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.RendererFactoryDefaultHandler#getDefaultRendererFactory()
-	 */
-	public RendererFactory getDefaultRendererFactory() {
-		return EMF2DOMRendererFactory.INSTANCE;
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2SAXDocumentHandler.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2SAXDocumentHandler.java
deleted file mode 100644
index 1ec3dbe..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2SAXDocumentHandler.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.resource;
-
-
-import java.io.IOException;
-
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.xml.sax.Attributes;
-import org.xml.sax.EntityResolver;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * The EMF2SAXDocumentHandler is utilized by the SAX parser to announce XML Events, such as
- * beginning and end of XML elements and the contents of those elements.
- * 
- * @author mdelder
- */
-public class EMF2SAXDocumentHandler extends DefaultHandler {
-
-	private TranslatorResource resource = null;
-	private final CacheEventStack eventStack = new CacheEventStack();
-	private CacheEventPool availableEventPool = new CacheEventPool();
-
-	/**
-	 * Create an EMF2SAXDocumentHandler to populate the given resource.
-	 *  
-	 */
-	public EMF2SAXDocumentHandler(TranslatorResource resource) {
-		this.resource = resource;
-	}
-
-	/**
-	 * @see org.xml.sax.helpers.DefaultHandler#resolveEntity(java.lang.String, java.lang.String)
-	 */
-	public InputSource resolveEntity(String publicId, String systemId) throws SAXException {
-		InputSource result = null;
-		this.resource.setDoctypeValues(publicId, systemId);
-
-		try {
-			EntityResolver entityResolver = this.resource.getEntityResolver();
-
-			if (entityResolver != null)
-				result = entityResolver.resolveEntity(publicId, systemId);
-			else
-				result = super.resolveEntity(publicId, systemId);
-		} catch (IOException ioe) {
-			throw new SAXException(ioe);
-		}
-
-		return result;
-	}
-
-	/**
-	 * @see org.xml.sax.ContentHandler#startDocument()
-	 */
-	public void startDocument() throws SAXException {
-		/*
-		 * The endDocument() method should have frozen the pool, or it may not be warmed yet. In
-		 * either case, this method call will do as little work as necessary
-		 */
-		availableEventPool.warmPool();
-
-		/* This line should not be necessary, but is left for safty */
-		eventStack.clear();
-		this.createRoot(this.resource);
-
-	}
-
-	/**
-	 * @see org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String,
-	 *      java.lang.String, org.xml.sax.Attributes)
-	 */
-	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
-		addToStack(qName, attributes);
-	}
-
-	/**
-	 * @see org.xml.sax.ContentHandler#characters(char[], int, int)
-	 */
-	public void characters(char[] data, int start, int length) throws SAXException {
-
-		CacheEventNode currentRecord = getCurrentRecord();
-		if (currentRecord != null) {
-			currentRecord.appendToBuffer(data, start, length);
-		}
-	}
-
-	/**
-	 * @see org.xml.sax.ContentHandler#endElement(java.lang.String, java.lang.String,
-	 *      java.lang.String)
-	 */
-	public void endElement(String uri, String localName, String qName) throws SAXException {
-
-		CacheEventNode currentRecord = null;
-
-		/*
-		 * This should only happen in the case where the DOMPath was ignored so the stack does not
-		 * quite match with the XML data structure. In this case we do nothing
-		 */
-		if (qName.equals(this.getCurrentRecord().getNodeName())) {
-			currentRecord = this.removeCurrentRecord();
-			if (currentRecord != null) {
-				currentRecord.commit();
-			}
-		}
-	}
-
-	/**
-	 * @see org.xml.sax.ContentHandler#endDocument()
-	 */
-	public void endDocument() throws SAXException {
-		CacheEventNode lastRecord = this.removeCurrentRecord();
-		lastRecord.commit();
-		availableEventPool.freezePool();
-	}
-
-	/**
-	 * @see org.xml.sax.ErrorHandler#error(org.xml.sax.SAXParseException)
-	 */
-	public void error(SAXParseException ex) throws SAXException {
-		throw ex;
-	}
-
-	/**
-	 * @see org.xml.sax.ErrorHandler#fatalError(org.xml.sax.SAXParseException)
-	 */
-	public void fatalError(SAXParseException ex) throws SAXException {
-		throw ex;
-	}
-
-	/**
-	 * @see org.xml.sax.ErrorHandler#warning(org.xml.sax.SAXParseException)
-	 */
-	public void warning(SAXParseException ex) throws SAXException {
-		Logger.getLogger().logWarning(ex);
-	}
-
-	/**
-	 * @return
-	 */
-	public TranslatorResource getResource() {
-		return resource;
-	}
-
-	protected void createRoot(TranslatorResource resourceArg) {
-		this.eventStack.push(availableEventPool.createCacheEventNode(resourceArg));
-	}
-
-	protected void addToStack(String nodeName, Attributes attributes) {
-		CacheEventNode parent = this.getCurrentRecord();
-		if (!parent.isChildIgnorable(nodeName)) {
-			this.eventStack.push(availableEventPool.createCacheEventNode(parent, nodeName, attributes));
-		}
-	}
-
-	/**
-	 * Return the current CENO without removing it from the event stack.
-	 * 
-	 * @return the current CENO without removing it
-	 */
-	protected CacheEventNode getCurrentRecord() {
-		CacheEventNode result = null;
-		if (!this.eventStack.isEmpty()) {
-			result = this.eventStack.peek();
-		}
-		return result;
-	}
-
-	/**
-	 * Return the current CENO and remove it from the event stack.
-	 * 
-	 * @return the current CENO and remove it
-	 */
-	protected CacheEventNode removeCurrentRecord() {
-		CacheEventNode result = null;
-		if (!this.eventStack.isEmpty()) {
-			result = this.eventStack.pop();
-		}
-		return result;
-	}
-
-	//	private final void printStack() {
-	//		// System.out.println("Printing stack ...");
-	//		// for (int i = 0; i < this.eventStack.size(); i++) {
-	//		// debug("stack[" + i + "]: " + eventStack.get(i));
-	//		// }
-	//		// System.out.println("... Printed stack");
-	//	}
-	//
-	//	private final static void debug(Object obj) {
-	//		// System.out.println(obj);
-	//	}
-	//
-	//	private final static void warn(Object obj) {
-	//		//System.err.println(obj);
-	//	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2SAXRenderer.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2SAXRenderer.java
deleted file mode 100644
index 7bd2634..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2SAXRenderer.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.resource;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Map;
-
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.TransformerFactoryConfigurationError;
-import javax.xml.transform.sax.SAXTransformerFactory;
-import javax.xml.transform.sax.TransformerHandler;
-import javax.xml.transform.stream.StreamResult;
-
-import org.eclipse.emf.common.util.WrappedException;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXNotRecognizedException;
-import org.xml.sax.XMLReader;
-
-/**
- * @author mdelder
- */
-public class EMF2SAXRenderer extends AbstractRendererImpl {
-
-	/**
-	 *  
-	 */
-	public EMF2SAXRenderer() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.Renderer#doLoad(java.io.InputStream, java.util.Map)
-	 */
-	public void doLoad(InputStream in, Map options) {
-		try {
-			SAXParserFactory factory = SAXParserFactory.newInstance();
-			factory.setValidating(isValidating());
-			factory.setNamespaceAware(true);
-			/*
-			 * Causes errors in IBM JDK try { factory.setAttribute(JAXP_SCHEMA_LANGUAGE,
-			 * W3C_XML_SCHEMA); } catch (IllegalArgumentException x) { }
-			 */
-			SAXParser parser = factory.newSAXParser();
-			XMLReader reader = parser.getXMLReader();
-			EMF2SAXDocumentHandler handler = new EMF2SAXDocumentHandler(this.getResource());
-			try {
-				reader.setFeature("http://xml.org/sax/features/validation", isValidating()); //$NON-NLS-1$
-			} catch (SAXNotRecognizedException snre) {
-			}
-			try {
-				reader.setFeature("http://xml.org/sax/features/namespace-prefixes", true); //$NON-NLS-1$
-			} catch (SAXNotRecognizedException snre) {
-			}
-			try {
-				reader.setFeature("http://apache.org/xml/features/validation/schema", isValidating()); //$NON-NLS-1$
-			} catch (SAXNotRecognizedException e) {
-				reader.setFeature("http://xml.org/sax/features/validation", false); //$NON-NLS-1$
-				Logger.getLogger().log("Warning: Parser does not support \"http://apache.org/xml/features/validation/schema\". Validation will be disabled."); //$NON-NLS-1$
-			}
-			try {
-				reader.setFeature("http://apache.org/xml/features/allow-java-encodings", true); //$NON-NLS-1$
-			} catch (SAXNotRecognizedException e) {
-				Logger.getLogger().log("Warning: Parser does not support \"http://apache.org/xml/features/allow-java-encodings\"."); //$NON-NLS-1$
-			}
-			/*
-			 * try { reader.setProperty("http://xml.org/sax/properties/lexical-handler", handler); }
-			 * catch (SAXNotRecognizedException e) { }
-			 */
-			reader.setContentHandler(handler);
-			reader.setErrorHandler(handler);
-			//reader.setDTDHandler(handler);
-			reader.setEntityResolver(handler);
-			InputSource testsource = new InputSource(in);
-			reader.parse(testsource);
-		} catch (RuntimeException t_rex) {
-			throw t_rex;
-		} catch (Exception ex) {
-			throw new WrappedException(ex);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.Renderer#doSave(java.io.OutputStream, java.util.Map)
-	 */
-	public void doSave(OutputStream outputStream, Map options) throws IOException {
-
-		/*
-		 * try { Serializer serializer =
-		 * SerializerFactory.getSerializerFactory(Method.XML).makeSerializer(outputStream,
-		 * createOutputFormat()); serializer.setOutputByteStream(outputStream); ContentHandler
-		 * handler = serializer.asContentHandler();
-		 */
-
-		TransformerHandler handler = null;
-		try {
-			try {
-				SAXTransformerFactory factory = (SAXTransformerFactory) TransformerFactory.newInstance();
-				handler = factory.newTransformerHandler();
-
-				handler.setResult(new StreamResult(outputStream));
-				Transformer transformer = handler.getTransformer();
-				transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
-				transformer.setOutputProperty(OutputKeys.ENCODING, getResource().getEncoding());
-				transformer.setOutputProperty(OutputKeys.VERSION, getResource().getXMLVersion());
-				transformer.setOutputProperty(OutputKeys.METHOD, "xml"); //$NON-NLS-1$
-				transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); //$NON-NLS-1$                
-				transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); //$NON-NLS-1$ //$NON-NLS-2$
-
-				if (getResource().getPublicId() != null)
-					transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, getResource().getPublicId());
-				if (getResource().getSystemId() != null)
-					transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, getResource().getSystemId());
-
-			} catch (TransformerConfigurationException e) {
-				Logger.getLogger().logError(e);
-			} catch (TransformerFactoryConfigurationError e) {
-				Logger.getLogger().logError(e);
-			}
-			if (handler == null) {
-				Logger.getLogger("SAX Writer is null"); //$NON-NLS-1$
-				return;
-			}
-			EMF2SAXWriter writer = new EMF2SAXWriter();
-			writer.serialize(this.resource, handler);
-		} catch (SAXException saxe) {
-			throw new WrappedException(saxe);
-		}
-	}
-
-	/*
-	 * protected OutputFormat createOutputFormat() { OutputFormat format = new OutputFormat();
-	 * format.setIndenting(true); format.setLineSeparator(DOMUtilities.NEWLINE_STRING);
-	 * //$NON-NLS-1$ format.setEncoding(getResource().getEncoding());
-	 * format.setVersion(getResource().getXMLVersion()); if (this.resource != null)
-	 * format.setDoctype(this.resource.getPublicId(), this.resource.getSystemId()); return format; }
-	 */
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.Renderer#prepareToAddContents()
-	 */
-	public void prepareToAddContents() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.Renderer#getVersionID()
-	 */
-	public int getVersionID() {
-		return getResource().getVersionID();
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2SAXRendererFactory.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2SAXRendererFactory.java
deleted file mode 100644
index d3fd5d9..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2SAXRendererFactory.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Aug 19, 2003
- *
- */
-package org.eclipse.wst.common.internal.emf.resource;
-
-
-/**
- * Used to create instances of the EMF2SAXRenderer
- * 
- * @author mdelder
- */
-public class EMF2SAXRendererFactory extends RendererFactory {
-
-	public static final EMF2SAXRendererFactory INSTANCE = new EMF2SAXRendererFactory();
-
-	protected EMF2SAXRendererFactory() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.RendererFactory#createRenderer()
-	 */
-	public Renderer createRenderer() {
-		EMF2SAXRenderer renderer = new EMF2SAXRenderer();
-		renderer.setValidating(isValidating());
-		return renderer;
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2SAXWriter.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2SAXWriter.java
deleted file mode 100644
index c5d0807..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2SAXWriter.java
+++ /dev/null
@@ -1,387 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.resource;
-
-
-import java.util.List;
-import java.util.Stack;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-import org.xml.sax.Attributes;
-import org.xml.sax.ContentHandler;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.AttributesImpl;
-
-/**
- * The EMF2SAXWriter handles the serialization of EMF Resources using SAX events. SAX events are
- * triggered to the content handler as the tree is being parsed. These events can then be written
- * into any stream wrapped by the ContentHandler.
- * 
- * @author mdelder
- */
-public class EMF2SAXWriter {
-
-	public static final String NAMESPACE = "";//"http://java.sun.com/xml/ns/j2ee"; //$NON-NLS-1$
-
-	/* Used in those cases where no Attributes are necessary */
-	private static final Attributes EMPTY_ATTRIBUTES = new AttributesImpl();
-
-	/**
-	 * Serialize an EMF resource into an XML Stream using the given ContentHandler. Note that this
-	 * method can also be used to copy a given EMF Resource if the EMF2SAXDocumentHandler is used as
-	 * the given ContentHandler.
-	 * 
-	 * @param resource
-	 * @param handler
-	 */
-	public void serialize(TranslatorResource resource, ContentHandler handler) throws SAXException {
-
-		Translator rootTranslator = resource.getRootTranslator();
-		EList contents = resource.getContents();
-
-		if (contents.size() != 1) {
-			throw new IllegalStateException("The contents of a resource may only contain one EMF Model Object."); //$NON-NLS-1$
-		}
-		handler.startDocument();
-		EObject element = (EObject) contents.get(0);
-		serialize(handler, element, rootTranslator, new WriterHints(resource));
-		handler.endDocument();
-
-	}
-
-	private void serialize(ContentHandler handler, EObject target, Translator translator, WriterHints hints) throws SAXException {
-
-		List mofChildren = null;
-		Object rawValue = null;
-		EObject newTarget = null;
-		Translator currentChildTranslator = null;
-		Translator nextTranslator = null;
-		char[] characterData = null;
-		String convertedValue = null;
-		Attributes attributes = null;
-		String childDomName = null;
-		final int version = hints.getVersion();
-
-		/*
-		 * Processing hints are used to remember where are in the iteration of the translator's
-		 * children. see the TranslatorFilter for more information on how this array is used.
-		 */
-		int[] processingHints = TranslatorFilter.createProcessingHints();
-
-		String targetDomName = translator.getDOMName(target);
-
-		attributes = getAttributes(translator, target, hints);
-
-		handler.startElement(NAMESPACE, targetDomName, targetDomName, attributes);
-
-		currentChildTranslator = TranslatorFilter.getNextObjectTranslator(translator, processingHints[TranslatorFilter.NEXT_START_HINT_INDX], processingHints, target, version);
-		while (currentChildTranslator != null) {
-			/* For each Child Translator of the Translator parameter passed into the method */
-
-			/* Does the Translator have any MOF Children? */
-			mofChildren = currentChildTranslator.getMOFChildren(target);
-			openDomPathIfNecessary(handler, hints, currentChildTranslator, target, mofChildren);
-
-			if (currentChildTranslator.isManagedByParent()) {
-				/*
-				 * Translators which are managed by their parents require less processing -- just
-				 * convert their value to a string and write it out as the content of an XML element
-				 */
-				childDomName = currentChildTranslator.getDOMName(target);
-				if (!currentChildTranslator.isEmptyTag()) {
-					/* The Translator is not an Empty tag. Its text content is significant */
-
-					if (mofChildren.size() > 0) {
-						for (int j = 0; j < mofChildren.size(); j++) {
-
-							/* Text only translators will not have open and close XML elements */
-							if (!currentChildTranslator.isDOMTextValue())
-								handler.startElement(NAMESPACE, childDomName, childDomName, EMPTY_ATTRIBUTES);
-
-							rawValue = mofChildren.get(j);
-							/* convertValueToString should always return a non-null String */
-							convertedValue = currentChildTranslator.convertValueToString(rawValue, target);
-							characterData = XMLEncoderDecoder.escape(convertedValue).toCharArray();
-							handler.characters(characterData, 0, characterData.length);
-
-							if (!currentChildTranslator.isDOMTextValue())
-								handler.endElement(NAMESPACE, childDomName, childDomName);
-						}
-					}
-				} else {
-					/*
-					 * The Translator is an Empty Element (its mere presence has significance) (e.g.
-					 * <cascade-delete/>
-					 */
-
-					if (currentChildTranslator.isBooleanFeature()) {
-						/* Boolean features may or may not be rendered */
-						rawValue = mofChildren.get(0);
-						if (rawValue != null && ((Boolean) rawValue).booleanValue()) {
-							handler.startElement(NAMESPACE, childDomName, childDomName, EMPTY_ATTRIBUTES);
-							handler.endElement(NAMESPACE, childDomName, childDomName);
-						}
-
-					} else {
-						/* Always render any other Empty elements */
-						handler.startElement(NAMESPACE, childDomName, childDomName, EMPTY_ATTRIBUTES);
-						handler.endElement(NAMESPACE, childDomName, childDomName);
-					}
-				}
-			} else {
-
-				/* The Translator is a more complex feature, handle its processing recursively */
-				for (int j = 0; j < mofChildren.size(); j++) {
-					newTarget = (EObject) mofChildren.get(j);
-					serialize(handler, newTarget, currentChildTranslator, hints);
-				}
-			}
-
-			/* Fetch the next peer translator */
-			nextTranslator = TranslatorFilter.getNextObjectTranslator(translator, processingHints[TranslatorFilter.NEXT_START_HINT_INDX], processingHints, target, version);
-
-			closeDomPathIfNecessary(handler, hints, currentChildTranslator, nextTranslator, target, mofChildren);
-
-			/*
-			 * We needed to invoke closeDomPathIfNecessary() with the peer, now we move on to
-			 * process that peer
-			 */
-			currentChildTranslator = nextTranslator;
-
-		}
-		handler.endElement(NAMESPACE, targetDomName, targetDomName);
-	}
-
-	/**
-	 * Determines whether or not a DOM Path should be rendered. This method is particularly useful
-	 * for determining whether Empty XML elements are relevant and should be written to the XML
-	 * stream.
-	 * 
-	 * @param target
-	 *            The EMF Target of the Translation
-	 * @param currentChildTranslator
-	 *            The current Translator
-	 * @param mofChildren
-	 *            The mofChildren that were found for the Translator on the Target
-	 * @return
-	 */
-	private boolean shouldRenderDomPath(EObject target, Translator currentChildTranslator, List mofChildren) {
-		return !currentChildTranslator.isEmptyContentSignificant() || (currentChildTranslator.shouldRenderEmptyDOMPath(target) || mofChildren.size() > 0);
-	}
-
-	/**
-	 * openDomPathIfNecessary will write the current DOM Path to the serialization stream if it has
-	 * not been written by a previous peer translator. The processing results in the collapse of
-	 * Peer Translators with matching DOM Paths into a single XML parent element.
-	 * 
-	 * @param handler
-	 *            The ContentHandler which is writing the XML result
-	 * @param hints
-	 *            A Global container for information specific to a single XML document
-	 * @param currentChildTranslator
-	 *            The active Translator being processed
-	 * @param target
-	 *            The EMF Target of the Translation
-	 * @throws SAXException
-	 */
-	private void openDomPathIfNecessary(ContentHandler handler, WriterHints hints, Translator currentChildTranslator, EObject target, List mofChildren) throws SAXException {
-
-		/* If the translator does not have a DOM Path, then we do nothing */
-		if (currentChildTranslator.hasDOMPath() && shouldRenderDomPath(target, currentChildTranslator, mofChildren)) {
-
-			String childDomPath = currentChildTranslator.getDOMPath();
-
-			/*
-			 * IsDomPathActive() will verify whether this DOM Path has already been written to the
-			 * XML stream
-			 */
-			if (!hints.isDomPathActive(childDomPath)) {
-
-				/*
-				 * Write an open element for the DOM Path and "remember" that we have written it
-				 */
-				handler.startElement(NAMESPACE, childDomPath, childDomPath, EMPTY_ATTRIBUTES);
-				hints.pushDomPath(childDomPath);
-			}
-
-		}
-	}
-
-	/**
-	 * closeDomPathIfNecessary will determine whether the next peer Translator shares the active DOM
-	 * Path of the current Translator. If the next peer Translator has the same DOM Path, no action
-	 * will be taken (hence condensing the elements into a single XML parent). However, if the DOM
-	 * Path differs (including the Next Peer Translator has no DOM Path) then the current DOM Path
-	 * will be closed (a close XML element is generated.
-	 * 
-	 * @param handler
-	 *            The ContentHandler which is writing the XML result
-	 * @param hints
-	 *            A Global container for information specific to a single XML document
-	 * @param currentChildTranslator
-	 *            The last Translator to have completed processing
-	 * @param nextTranslator
-	 *            The next peer Translator that will become active
-	 * @param target
-	 *            The EMF Target of the Translation
-	 * @throws SAXException
-	 */
-	private void closeDomPathIfNecessary(ContentHandler handler, WriterHints hints, Translator currentChildTranslator, Translator nextTranslator, EObject target, List mofChildren) throws SAXException {
-
-		if (currentChildTranslator.hasDOMPath() && shouldRenderDomPath(target, currentChildTranslator, mofChildren)) {
-			String childDomPath = currentChildTranslator.getDOMPath();
-			if (nextTranslator != null) { /*
-										   * There are more peers after this element, we can peek
-										   * ahead
-										   */
-				String nextPeerDomPath = nextTranslator.getDOMPath();
-				if (nextPeerDomPath == null || !nextPeerDomPath.equals(childDomPath)) {
-					handler.endElement(NAMESPACE, childDomPath, childDomPath);
-					hints.popDomPath();
-				}
-
-			} else { /* This was the last child element, we must close the dompath */
-				handler.endElement(NAMESPACE, childDomPath, childDomPath);
-				hints.popDomPath();
-			}
-		}
-	}
-
-	/**
-	 * Aggregate the Attribute translator children from a given translator. This method will request
-	 * the AttributesImpl object from the WriterHints object. The WriterHints maintains this
-	 * reusable collection to limit the requirement for new object creation.
-	 * 
-	 * @param translator
-	 * @param target
-	 * @param hints
-	 * @return an initialized set of Attributes for the given Translator and EMF Target
-	 */
-	private Attributes getAttributes(Translator translator, EObject target, WriterHints hints) {
-
-		AttributesImpl attributes = hints.getAttributeHolder();
-		int version = hints.getVersion();
-		Object rawValue = null;
-		String convertedValue = null;
-		String childDomName = null;
-		Translator attributeTranslator = null;
-		int[] processingHints = TranslatorFilter.createProcessingHints();
-
-		while ((attributeTranslator = TranslatorFilter.getNextAttributeTranslator(translator, processingHints[TranslatorFilter.NEXT_START_HINT_INDX], processingHints, target, version)) != null) {
-
-			List mofChildren = attributeTranslator.getMOFChildren(target);
-			if (mofChildren.size() > 0) {
-				for (int j = 0; j < mofChildren.size(); j++) {
-
-					childDomName = attributeTranslator.getDOMName(target);
-					rawValue = mofChildren.get(j);
-					convertedValue = attributeTranslator.convertValueToString(rawValue, target);
-					convertedValue = XMLEncoderDecoder.escape(convertedValue);
-					attributes.addAttribute(NAMESPACE, childDomName, childDomName, "String", convertedValue); //$NON-NLS-1$
-				}
-
-			} else {
-				childDomName = attributeTranslator.getDOMName(target);
-				convertedValue = (String) attributeTranslator.getMOFValue(target);
-				if (convertedValue != null)
-					attributes.addAttribute(NAMESPACE, childDomName, childDomName, "String", convertedValue); //$NON-NLS-1$
-			}
-		}
-		return attributes;
-	}
-
-	/**
-	 * WriterHints is used to "remember" certain pieces of information while the writer is
-	 * processing. Of particular interest are the version and the state of the DOM Path output.
-	 * Consecutive elements with consistent (identical) DOM Paths are collapsed under a single XML
-	 * element.
-	 * 
-	 * The WriterHints provides global state between recursive invocations of serialize(). It should
-	 * be not be used to store local data (e.g. data that is only relevant to a single Translator in
-	 * a given context).
-	 * 
-	 * The WriterHints also stores an AttributesImpl object that is re-used to store attributes. The
-	 * getAttributes() method will request the Attributes Holder.
-	 * 
-	 * @author mdelder
-	 */
-	public final class WriterHints {
-		private final TranslatorResource resource;
-		private final Stack domStack = new Stack();
-		private final AttributesImpl attributesImpl = new AttributesImpl();
-
-		public WriterHints(TranslatorResource res) {
-			this.resource = res;
-		}
-
-		/**
-		 * Push a new domPath onto the stack
-		 * 
-		 * @param domPath
-		 *            a DOMPath which has been written to the XML stream
-		 */
-		public void pushDomPath(String domPath) {
-
-			if (domPath != null && domPath.length() > 0)
-				domStack.push(domPath);
-		}
-
-		/**
-		 * Pop the current domPath from the Array
-		 */
-		public void popDomPath() {
-
-			if (!domStack.isEmpty())
-				domStack.pop();
-		}
-
-		/**
-		 * Determines if the given DOMPath has already been written to the XML stream
-		 * 
-		 * @param domPath
-		 * @return true if the given DOMPath has already been written to the XML stream
-		 */
-		public boolean isDomPathActive(String domPath) {
-			boolean result = false;
-			if (!domStack.isEmpty()) {
-
-				String currentDomPath = (String) domStack.peek();
-				if (currentDomPath != null && domPath != null)
-					result = currentDomPath.equals(domPath);
-				else if (!(currentDomPath == null ^ domPath == null))
-					result = true;
-			}
-
-			return result;
-		}
-
-		/**
-		 * @return the version of the EMF Resource
-		 */
-		public int getVersion() {
-			return this.resource.getVersionID();
-		}
-
-		/**
-		 * Returns an empty AttributesImpl object to store attributes. Within the context of a given
-		 * WriterHints object (and hence single XML document), the object returned is a singleton.
-		 * The same AttributesImpl object is cleared and reused for each invocation.
-		 * 
-		 * @return an empty AttributesImpl object to store attributes
-		 */
-		public AttributesImpl getAttributeHolder() {
-			this.attributesImpl.clear();
-			return this.attributesImpl;
-		}
-
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/FileNameResourceFactoryRegistry.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/FileNameResourceFactoryRegistry.java
deleted file mode 100644
index bdfd479..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/FileNameResourceFactoryRegistry.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.resource;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.Resource.Factory;
-import org.eclipse.wst.common.internal.emf.utilities.DefaultOverridableResourceFactoryRegistry;
-
-
-public abstract class FileNameResourceFactoryRegistry extends DefaultOverridableResourceFactoryRegistry {
-	//We are using two lists instead of a Map because we need to iterate
-	//the list of simpleFileNames quite a lot.
-	protected List simpleFileNames;
-	protected List simpleFileNameFactories;
-
-	public FileNameResourceFactoryRegistry() {
-		super();
-	}
-
-	/**
-	 * Return a Resource.Factory that is registered with the last segment of the URI's file name.
-	 * 
-	 * @see org.eclipse.emf.ecore.resource.impl.ResourceFactoryRegistryImpl#getFactory(URI)
-	 */
-	protected Object getFileNameFactory(URI uri) {
-		if (simpleFileNames != null) {
-			String fileName = uri.lastSegment();
-			if (fileName != null) {
-				String key;
-				for (int i = 0; i < simpleFileNames.size(); i++) {
-					key = (String) simpleFileNames.get(i);
-					if (fileName.equals(key))
-						return simpleFileNameFactories.get(i);
-				}
-			}
-		}
-		return null;
-	}
-
-	public Resource.Factory getFactory(URI uri) {
-		Object resourceFactory = getFileNameFactory(uri);
-		if (resourceFactory == null)
-			resourceFactory = super.getFactory(uri);
-		return (Resource.Factory) resourceFactory;
-	}
-
-	/**
-	 * Register a file name representing the last segment of a URI with the corresponding
-	 * Resource.Factory.
-	 */
-	public void registerLastFileSegment(String aSimpleFileName, Resource.Factory aFactory) {
-		URI uri = URI.createURI(aSimpleFileName);
-		String lastSegment = uri.lastSegment();
-		int index = getFileNameIndexForAdd(lastSegment);
-		setFileName(lastSegment, index);
-		setFileNameFactory(aFactory, index);
-	}
-
-	private int getFileNameIndexForAdd(String aSimpleFileName) {
-		if (simpleFileNames != null) {
-			int i = simpleFileNames.indexOf(aSimpleFileName);
-			if (i > -1)
-				return i;
-			return simpleFileNames.size();
-		}
-		return 0;
-	}
-
-	private void setFileNameFactory(Factory aFactory, int index) {
-		if (simpleFileNameFactories == null)
-			simpleFileNameFactories = new ArrayList();
-		simpleFileNameFactories.add(index, aFactory);
-	}
-
-	private void setFileName(String aSimpleFileName, int index) {
-		if (simpleFileNames == null)
-			simpleFileNames = new ArrayList();
-		simpleFileNames.add(index, aSimpleFileName);
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/GenericTranslator.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/GenericTranslator.java
deleted file mode 100644
index eafe09f..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/GenericTranslator.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Mar 20, 2003
- *
- */
-package org.eclipse.wst.common.internal.emf.resource;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * Specialized translator for objects that contain simple mappings with no specialized behavior.
- */
-public class GenericTranslator extends Translator {
-
-	protected Translator[] children;
-
-	/**
-	 * @param domNameAndPath
-	 * @param eClass
-	 */
-	public GenericTranslator(String domNameAndPath, EClass eClass) {
-		super(domNameAndPath, eClass);
-	}
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public GenericTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 * @param path
-	 */
-	public GenericTranslator(String domNameAndPath, EStructuralFeature aFeature, TranslatorPath path) {
-		super(domNameAndPath, aFeature, path);
-	}
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 * @param paths
-	 */
-	public GenericTranslator(String domNameAndPath, EStructuralFeature aFeature, TranslatorPath[] paths) {
-		super(domNameAndPath, aFeature, paths);
-	}
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 * @param eClass
-	 */
-	public GenericTranslator(String domNameAndPath, EStructuralFeature aFeature, EClass eClass) {
-		super(domNameAndPath, aFeature, eClass);
-	}
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 * @param style
-	 */
-	public GenericTranslator(String domNameAndPath, EStructuralFeature aFeature, int style) {
-		super(domNameAndPath, aFeature, style);
-	}
-
-	/**
-	 * @return Translator[]
-	 */
-	public Translator[] getChildren() {
-		return children;
-	}
-
-	/**
-	 * Sets the children.
-	 * 
-	 * @param children
-	 *            The children to set
-	 */
-	public void setChildren(Translator[] children) {
-		this.children = children;
-	}
-
-
-	public static Translator appendChildren(GenericTranslator tran, Translator[] child) {
-		Translator[] orgChild = tran.getChildren();
-		Translator[] newChildren = (Translator[]) concat(orgChild, child);
-		tran.setChildren(newChildren);
-		return tran;
-	}
-
-	public static Translator appendChild(GenericTranslator tran, Translator child) {
-		Object[] orgChild = tran.getChildren();
-		Translator[] newChildren = (Translator[]) concat(orgChild, child);
-		tran.setChildren(newChildren);
-		return tran;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/IDTranslator.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/IDTranslator.java
deleted file mode 100644
index 15755f0..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/IDTranslator.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Mar 19, 2003
- *
- */
-package org.eclipse.wst.common.internal.emf.resource;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.EcorePackage;
-import org.eclipse.emf.ecore.xmi.XMIResource;
-
-/**
- * @author schacher
- */
-public class IDTranslator extends Translator {
-	public class NoResourceException extends RuntimeException {
-
-		public NoResourceException() {
-			super();
-		}
-
-		public NoResourceException(String s) {
-			super(s);
-		}
-	}
-
-	static final public EStructuralFeature ID_FEATURE = EcorePackage.eINSTANCE.getEClass_EIDAttribute();
-	static final public IDTranslator INSTANCE = new IDTranslator();
-
-	public IDTranslator() {
-		super("id", ID_FEATURE, DOM_ATTRIBUTE); //$NON-NLS-1$
-	}
-
-	public void setMOFValue(EObject emfObject, Object value) {
-		XMIResource res = (XMIResource) emfObject.eResource();
-		if (res == null)
-			throw new NoResourceException();
-		String id = res.getID(emfObject);
-		if (id == null && value == null)
-			return;
-		if ((id != null && !id.equals(value)) || (value != null && !value.equals(id)))
-			res.setID(emfObject, (String) value);
-	}
-
-	public Object getMOFValue(EObject emfObject) {
-		if (emfObject == null)
-			throw new NoResourceException();
-		XMIResource res = (XMIResource) emfObject.eResource();
-		if (res == null)
-			throw new NoResourceException();
-		return res.getID(emfObject);
-	}
-
-
-	public boolean featureExists(EObject emfObject) {
-		return true;
-	}
-
-	public boolean isIDMap() {
-		return true;
-	}
-
-
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/LinkUpdaterTarget.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/LinkUpdaterTarget.java
deleted file mode 100644
index f5cd1f9..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/LinkUpdaterTarget.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.resource;
-
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.w3c.dom.Node;
-
-
-public class LinkUpdaterTarget extends Object {
-
-	public static final LinkUpdaterTarget INSTANCE = new LinkUpdaterTarget();
-
-	/**
-	 * Constructor for LinkUpdaterMultiTarget.
-	 * 
-	 * @param adapter
-	 */
-	private LinkUpdaterTarget() {
-		super();
-	}
-
-
-	public void updateDOM(Translator map, Node node, EObject mofObject) {
-		refreshSourceObjects(map, node, mofObject, true);
-	}
-
-	public void updateMOF(Translator map, Node node, EObject mofObject) {
-		refreshSourceObjects(map, node, mofObject, false);
-	}
-
-	protected void refreshSourceObjects(Translator map, Node node, EObject mofObject, boolean domUpdate) {
-		TranslatorPath[] paths = map.getTranslatorPaths();
-		for (int i = 0; i < paths.length; i++) {
-			TranslatorPath path = paths[i];
-			List allSourceObjects = path.findObjects(mofObject);
-			for (Iterator iter = allSourceObjects.iterator(); iter.hasNext();) {
-				EObject curObject = (EObject) iter.next();
-				EMF2DOMAdapter curAdapter = (EMF2DOMAdapter) EcoreUtil.getAdapter(curObject.eAdapters(), EMF2DOMAdapter.class);
-				if (curAdapter != null) {
-					if (domUpdate)
-						curAdapter.updateDOM();
-					else
-						curAdapter.updateMOF();
-				}
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/MappedXMIHelper.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/MappedXMIHelper.java
deleted file mode 100644
index ac27864..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/MappedXMIHelper.java
+++ /dev/null
@@ -1,295 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.resource;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.resource.URIConverter;
-import org.eclipse.emf.ecore.resource.impl.URIConverterImpl;
-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.wst.common.internal.emf.utilities.IDUtil;
-
-public class MappedXMIHelper extends XMLHelperImpl {
-
-	private static final String WORKSPACE_PROTOCOL = "workspace:/"; //$NON-NLS-1$
-	private static final String PLATFORM_RESOURCE_PROTOCOL = "platform:/resource/"; //$NON-NLS-1$
-	private static final EStructuralFeature NULL_FEATURE = new UnsupportedFeature();
-	protected boolean usingMaps = true;
-	protected Map cachedRelativeURIs;
-	protected Map packageURIsToPrefixes;
-
-	/**
-	 * Constructor for MappedXMLHelper.
-	 * 
-	 * @param resource
-	 */
-	public MappedXMIHelper(XMLResource resource, Map prefixesToURIs) {
-		super(resource);
-		this.prefixesToURIs.putAll(prefixesToURIs);
-		pushContext(); //Needed to initialize the context to zero
-		Set keys = prefixesToURIs.keySet();
-		for (Iterator iter = keys.iterator(); iter.hasNext();) {
-			String prefix = (String) iter.next();
-			String uri = (String) prefixesToURIs.get(prefix);
-			namespaceSupport.declarePrefix(prefix, uri);
-		}
-
-	}
-
-	public URI resolve(URI relative, URI base) {
-		URI resolved = null;
-		boolean isMapped = false;
-		ResourceSet set = getResource().getResourceSet();
-		if (set != null) {
-			URI localresourceURI = null;
-			if (relative.hasFragment())
-				localresourceURI = relative.trimFragment();
-			else
-				localresourceURI = relative;
-			isMapped = !(((URIConverterImpl.URIMap) set.getURIConverter().getURIMap()).getURI(localresourceURI).equals(localresourceURI));
-		}
-		if (!isMapped) {
-			if (isUsingContainerRelativePaths() && set != null)
-				resolved = set.getURIConverter().normalize(relative);
-		} else {
-			resolved = relative;
-		}
-		return resolved == null ? super.resolve(relative, base) : resolved;
-	}
-
-	/**
-	 * Method isUsingContainerRelativePaths.
-	 * 
-	 * @return boolean
-	 */
-	private boolean isUsingContainerRelativePaths() {
-		return ((CompatibilityXMIResource) resource).getFormat() == CompatibilityXMIResource.FORMAT_MOF5 || usingMaps;
-	}
-
-	public void addPrefix(String prefix, String uri) {
-		/*
-		 * problem - the incoming key value pair is ejbbnd->ejbbnd.xmi; however, the map already has
-		 * a key value pair of ejbbnd->http:///ejbbnd.ecore
-		 */
-		if (uri.endsWith(".ecore")) { //$NON-NLS-1$
-			usingMaps = false;
-		}
-		String existing = (String) prefixesToURIs.get(prefix);
-		if (existing == null) {
-			prefixesToURIs.put(prefix, uri);
-			namespaceSupport.declarePrefix(prefix, uri);
-		} else if (!existing.equals(uri)) {
-			getCompatibilityResource().addOriginalPackageURI(existing, uri);
-			getCompatibilityResource().setFormat(CompatibilityXMIResource.FORMAT_MOF5);
-		}
-	}
-
-	protected CompatibilityXMIResource getCompatibilityResource() {
-		return (CompatibilityXMIResource) getResource();
-	}
-
-	/**
-	 * @see org.eclipse.emf.ecore.xmi.impl.XMLHelperImpl#getHREF(EObject)
-	 */
-	public String getHREF(EObject obj) {
-		if (!getCompatibilityResource().usesDefaultFormat()) {
-			URIConverter conv = getURIConverter();
-			if (conv != null && conv instanceof CompatibilityURIConverter) {
-				String href = getCompatibliltyHREF(obj, (CompatibilityURIConverter) conv);
-				return useWorkspaceProtocolIfNecessary(href);
-			}
-		}
-		return super.getHREF(obj);
-	}
-
-
-	/**
-	 * @param href
-	 * @return
-	 */
-	protected String useWorkspaceProtocolIfNecessary(String href) {
-		if (href != null && href.startsWith(PLATFORM_RESOURCE_PROTOCOL))
-			return WORKSPACE_PROTOCOL + href.substring(19);
-		return href;
-	}
-
-	private String getCompatibliltyHREF(EObject obj, CompatibilityURIConverter conv) {
-		//Implementation copied from super.getHREF(EObject)
-		InternalEObject o = (InternalEObject) obj;
-
-		URI objectURI = o.eProxyURI();
-		if (objectURI == null) {
-			Resource otherResource = obj.eResource();
-			if (otherResource == null) {
-				objectURI = handleDanglingHREF(obj);
-				if (objectURI == null) {
-					return null;
-				}
-			} else
-				objectURI = otherResource.getURI().appendFragment(otherResource.getURIFragment(obj));
-		}
-
-		//Modified to dispatch back to URI Converter
-		if (!objectURI.isRelative()) {
-			objectURI = makeRelative(objectURI, conv);
-		}
-		return objectURI.toString();
-	}
-
-	protected URI makeRelative(URI objectURI, CompatibilityURIConverter conv) {
-		String fragment = objectURI.fragment();
-		objectURI = objectURI.trimFragment();
-		URI relative = (URI) getCachedRelativeURIs().get(objectURI);
-		if (relative == null) {
-			relative = conv.deNormalize(objectURI);
-			if (relative.isRelative())
-				cachedRelativeURIs.put(objectURI, relative);
-		}
-		return relative.appendFragment(fragment);
-	}
-
-	protected URIConverter getURIConverter() {
-		ResourceSet set = getResource().getResourceSet();
-		if (set != null)
-			return set.getURIConverter();
-		return null;
-	}
-
-	protected Map getCachedRelativeURIs() {
-		if (cachedRelativeURIs == null)
-			cachedRelativeURIs = new HashMap();
-		return cachedRelativeURIs;
-	}
-
-	/**
-	 * @see org.eclipse.emf.ecore.xmi.impl.XMLHelperImpl#getID(EObject)
-	 */
-	public String getID(EObject obj) {
-		if (getCompatibilityResource().usesDefaultFormat())
-			return super.getID(obj);
-		return IDUtil.getOrAssignID(obj, resource);
-	}
-
-	public String[] getNSInfo(EPackage pkg) {
-		String prefix = getMappedPrefix(pkg);
-		if (prefix == null)
-			return new String[]{pkg.getNsPrefix(), pkg.getNsURI()};
-		return new String[]{prefix, prefix + ".xmi"}; //$NON-NLS-1$
-	}
-
-	protected String getMappedPrefix(EPackage pkg) {
-		String nsURI = pkg.getNsURI();
-		if (usingMaps || !getCompatibilityResource().usesDefaultFormat())
-			return (String) packageURIsToPrefixes.get(nsURI);
-		return null;
-	}
-
-	protected String getMappedPrefixOrDefault(EPackage pkg) {
-		String prefix = getMappedPrefix(pkg);
-		return prefix == null ? pkg.getNsPrefix() : prefix;
-	}
-
-
-	/**
-	 * Returns the packageURIsToPrefixes.
-	 * 
-	 * @return Map
-	 */
-	public Map getPackageURIsToPrefixes() {
-		return packageURIsToPrefixes;
-	}
-
-	/**
-	 * Sets the packageURIsToPrefixes.
-	 * 
-	 * @param packageURIsToPrefixes
-	 *            The packageURIsToPrefixes to set
-	 */
-	public void setPackageURIsToPrefixes(Map packageURIsToPrefixes) {
-		this.packageURIsToPrefixes = packageURIsToPrefixes;
-	}
-
-	public String getQName(EClass c) {
-		String name = getName(c);
-
-		if (xmlMap != null) {
-			XMLResource.XMLInfo clsInfo = xmlMap.getInfo(c);
-
-			if (clsInfo != null) {
-				String targetNamespace = clsInfo.getTargetNamespace();
-				return getQName(targetNamespace, name);
-			}
-		}
-
-		EPackage p = c.getEPackage();
-		packages.put(p, null);
-
-		if (p.getNsPrefix().equals("")) //$NON-NLS-1$ 
-			return name;
-
-		//Modified from superclass
-		//return p.getNsPrefix() + ":" + name;
-		return getMappedPrefixOrDefault(p) + ":" + name; //$NON-NLS-1$ 
-	}
-
-	/**
-	 * @see org.eclipse.emf.ecore.xmi.impl.XMLHelperImpl#setValue(EObject, EStructuralFeature,
-	 *      Object, int)
-	 */
-	public void setValue(EObject object, EStructuralFeature feature, Object value, int position) {
-		if (feature == NULL_FEATURE)
-			return;
-		if (!feature.isTransient()) {
-			if (value == null && feature.getEType().getInstanceClass() != null && feature.getEType().getInstanceClass().isPrimitive())
-				//For compatibility with MOF5 where types like Integer might have been set
-				//and serialized as "xsi:nil"
-				return;
-
-			super.setValue(object, feature, value, position);
-		}
-	}
-
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.ecore.xmi.XMLHelper#getFeature(org.eclipse.emf.ecore.EClass,
-	 *      java.lang.String, java.lang.String, boolean)
-	 */
-	public EStructuralFeature getFeature(EClass eClass, String namespaceURI, String name, boolean isElement) {
-		if (UnsupportedFeature.isUnsupported(eClass, name))
-			return NULL_FEATURE;
-		return super.getFeature(eClass, namespaceURI, name, isElement);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.ecore.xmi.XMLHelper#getFeatureKind(org.eclipse.emf.ecore.EStructuralFeature)
-	 */
-	public int getFeatureKind(EStructuralFeature feature) {
-		if (feature == NULL_FEATURE)
-			return XMLHelper.DATATYPE_SINGLE;
-		return super.getFeatureKind(feature);
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/MultiObjectTranslator.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/MultiObjectTranslator.java
deleted file mode 100644
index abfcc83..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/MultiObjectTranslator.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Mar 31, 2003
- *
- */
-package org.eclipse.wst.common.internal.emf.resource;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * @author schacher
- */
-public abstract class MultiObjectTranslator extends Translator {
-	private static final Translator[] EMPTY_TRANSLATORS = new Translator[]{};
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 * @param style
-	 */
-	public MultiObjectTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	public abstract Translator getDelegateFor(EObject o);
-
-	public abstract Translator getDelegateFor(String domName, String readAheadName);
-
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.impl.Translator#createEMFObject(java.lang.String,
-	 *      java.lang.String)
-	 */
-	public EObject createEMFObject(String nodeName, String readAheadName) {
-		return getDelegateFor(nodeName, readAheadName).createEMFObject(nodeName, readAheadName);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.impl.Translator#getChildren(java.lang.Object)
-	 */
-	public Translator[] getChildren(Object o, int version) {
-		if (o == null)
-			return EMPTY_TRANSLATORS;
-		return getDelegateFor((EObject) o).getChildren(o, version);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.impl.Translator#getDOMName(java.lang.Object)
-	 */
-	public String getDOMName(Object value) {
-		return getDelegateFor((EObject) value).getDOMName(value);
-	}
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.impl.Translator#isManagedByParent()
-	 */
-	public boolean isManagedByParent() {
-		return false;
-	}
-
-
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/NamespaceTranslator.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/NamespaceTranslator.java
deleted file mode 100644
index b266883..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/NamespaceTranslator.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Aug 14, 2003
- *
- */
-package org.eclipse.wst.common.internal.emf.resource;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.wst.common.internal.emf.utilities.Namespace;
-import org.eclipse.wst.common.internal.emf.utilities.NamespaceAdapter;
-
-
-/**
- * @author schacher
- */
-public class NamespaceTranslator extends Translator {
-
-	protected String prefix;
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public NamespaceTranslator(String domName) {
-		super(domName, NamespaceAdapter.NOTIFICATION_FEATURE, DOM_ATTRIBUTE);
-		initPrefix();
-	}
-
-	private void initPrefix() {
-		String dName = getDOMName(null);
-		prefix = dName.substring(DefaultTranslatorFactory.XMLNS.length());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.impl.Translator#setMOFValue(org.eclipse.emf.ecore.EObject,
-	 *      java.lang.Object)
-	 */
-	public void setMOFValue(EObject emfObject, Object value) {
-		NamespaceAdapter.addNamespace(prefix, (String) value, emfObject);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.impl.Translator#isSetMOFValue(org.eclipse.emf.ecore.EObject)
-	 */
-	public boolean isSetMOFValue(EObject emfObject) {
-		return getMOFValue(emfObject) != null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.impl.Translator#getMOFValue(org.eclipse.emf.ecore.EObject)
-	 */
-	public Object getMOFValue(EObject mofObject) {
-		return NamespaceAdapter.getNamespaceURIAtThisLevel(prefix, mofObject);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.impl.Translator#unSetMOFValue(org.eclipse.emf.ecore.EObject)
-	 */
-	public void unSetMOFValue(EObject emfObject) {
-		NamespaceAdapter.removeNamespace(prefix, emfObject);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.impl.Translator#featureExists(org.eclipse.emf.ecore.EObject)
-	 */
-	public boolean featureExists(EObject emfObject) {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.impl.Translator#isDataType()
-	 */
-	public boolean isDataType() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.impl.Translator#isMapFor(java.lang.Object, java.lang.Object,
-	 *      java.lang.Object)
-	 */
-	public boolean isMapFor(Object aFeature, Object oldValue, Object newValue) {
-		if (aFeature == feature) {
-			Namespace namespace = (Namespace) (oldValue == null ? newValue : oldValue);
-			if (namespace != null)
-				return prefix.equals(namespace.getPrefix());
-		}
-		return false;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ObjectTranslatorFilter.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ObjectTranslatorFilter.java
deleted file mode 100644
index 918b9ce..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ObjectTranslatorFilter.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- **************************************************************************************************/
-/*
- * Created on Sep 21, 2003
- *  
- */
-package org.eclipse.wst.common.internal.emf.resource;
-
-
-public final class ObjectTranslatorFilter extends TranslatorFilter {
-
-	public ObjectTranslatorFilter() {
-		super(null, -1);
-	}
-
-	public ObjectTranslatorFilter(Translator trans, int version) {
-		super(trans, version);
-	}
-
-	public final int scanNextTranslator(Translator[] children, int start) {
-		int found = start + 1;
-		for (; found < children.length; ++found) {
-			if (!children[found].isDOMAttribute())
-				break;
-		}
-		found = (found < children.length) ? found : -1;
-		return found;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReadAheadHelper.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReadAheadHelper.java
deleted file mode 100644
index a7d1a23..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReadAheadHelper.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Apr 2, 2003
- *
- */
-package org.eclipse.wst.common.internal.emf.resource;
-
-/**
- * @author schacher
- */
-public class ReadAheadHelper {
-
-	protected String parentDOMName;
-	protected String[] values;
-	protected String childDOMName;
-
-	public ReadAheadHelper(String parentDOMName, String[] values, String childDOMName) {
-		super();
-		this.parentDOMName = parentDOMName;
-		this.values = values;
-		this.childDOMName = childDOMName;
-	}
-
-	/**
-	 * @return
-	 */
-	public String getChildDOMName() {
-		return childDOMName;
-	}
-
-	/**
-	 * @return
-	 */
-	public String getParentDOMName() {
-		return parentDOMName;
-	}
-
-	/**
-	 * @return
-	 */
-	public String[] getValues() {
-		return values;
-	}
-
-	/**
-	 * @param string
-	 */
-	public void setChildDOMName(String string) {
-		childDOMName = string;
-	}
-
-	/**
-	 * @param string
-	 */
-	public void setParentDOMName(String string) {
-		parentDOMName = string;
-	}
-
-	/**
-	 * @param strings
-	 */
-	public void setValues(String[] strings) {
-		values = strings;
-	}
-
-
-	public boolean nodeValueIsReadAheadName(String nodeName) {
-
-		return (childDOMName != null) ? childDOMName.equals(nodeName) : false;
-	}
-
-	public boolean nodeNameIsReadAheadName(String nodeName) {
-		boolean result = false;
-		for (int i = 0; i < values.length; i++) {
-			if (nodeName.equals(values[i])) {
-				result = true;
-				break;
-			}
-		}
-		return result;
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedResource.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedResource.java
deleted file mode 100644
index fc8ceaf..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedResource.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.resource;
-
-
-
-import org.eclipse.emf.ecore.resource.Resource;
-
-public interface ReferencedResource extends Resource, CompatibilityXMIResource {
-	//TODO - rename packaged
-
-	public static final String DELETED_ERROR_MSG = "This resource has been deleted and can no longer be used."; //$NON-NLS-1$
-
-	public static final int RESOURCE_WAS_SAVED = 601;
-
-	/**
-	 * Access this resource for read only. This call increments the use read count of this resource.
-	 * Clients should call this method before they use the resource. They should call
-	 * releaseFromRead() after they are done modifying this resource.
-	 */
-	void accessForRead();
-
-	/**
-	 * Access this resource for write only. This call increments the use write count of this
-	 * resource. Clients should call this method before they modify the resource. They should call
-	 * releaseFromWrite() after they are done modifying this resource.
-	 */
-	void accessForWrite();
-
-	/**
-	 * Return true if this resource has just been loaded and not yet accessed for read or write.
-	 */
-	boolean isNew();
-
-	/**
-	 * Return true if this resource does not have any write references.
-	 */
-	boolean isReadOnly();
-
-	/**
-	 * Return true if this resource is shared for read or write by more than one accessor.
-	 */
-	boolean isShared();
-
-	/**
-	 * Return true if this resource is shared for write by more than one accessor.
-	 */
-	boolean isSharedForWrite();
-
-	/**
-	 * Release read the access to this resource. This call decrements the use count of this resource
-	 * and will remove the resource from its resource set if the use count goes to 0. Clients should
-	 * call this method when they are done accessing the resource and only after they have called
-	 * accessForRead() to obtain access.
-	 */
-	void releaseFromRead();
-
-	/**
-	 * Release write the access to this resource. This call decrements the write count of this
-	 * resource and will remove the resource from its resource set if the use count goes to 0.
-	 * Clients should call this method when they are done accessing the resource and only after they
-	 * have called accessForWrite() to obtain access.
-	 */
-	void releaseFromWrite();
-
-	/**
-	 * Saves this resource only if the write count is equal to 1.
-	 */
-	void saveIfNecessary() throws Exception;
-
-	/**
-	 * Return true if this resource is dirty and is not shared for write.
-	 */
-	boolean needsToSave();
-
-
-
-	/**
-	 * Set whether we should allow a refresh to take place even when this resource is dirty.
-	 * 
-	 * @param b
-	 */
-	void setForceRefresh(boolean b);
-
-	/**
-	 * Return whether we should allow a refresh to take place even when this resource is dirty.
-	 */
-	boolean shouldForceRefresh();
-
-	boolean wasReverted();
-
-	/**
-	 * Returns the number of open read accesses on this resource
-	 * 
-	 * @return
-	 */
-	int getReadCount();
-
-	/**
-	 * Returns the number of open write accesses on this resource
-	 * 
-	 * @return
-	 */
-	int getWriteCount();
-
-	/**
-	 * If the resource is no longer being accessed, then remove it from the resource set.
-	 */
-	void unloadIfNecessary();
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedXMIFactoryImpl.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedXMIFactoryImpl.java
deleted file mode 100644
index d891c2c..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedXMIFactoryImpl.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.resource;
-
-
-import java.util.ArrayList;
-import java.util.List;
-
-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.impl.ResourceFactoryImpl;
-
-public class ReferencedXMIFactoryImpl extends ResourceFactoryImpl {
-
-	protected static List globalAdapterFactories;
-	protected List localAdapterFactories;
-
-	/**
-	 * ReferencedXMIFactoryImpl constructor comment.
-	 */
-	public ReferencedXMIFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * This is the method that subclasses can override to actually instantiate a new Resource
-	 * 
-	 * @param uri
-	 * @return
-	 */
-	protected Resource doCreateResource(URI uri) {
-		return new ReferencedXMIResourceImpl(uri);
-	}
-
-	/**
-	 * @see org.eclipse.emf.ecore.resource.impl.ResourceFactoryImpl#createResource(URI)
-	 */
-	public final Resource createResource(URI uri) {
-		Resource res = doCreateResource(uri);
-		adaptNew(res);
-		return res;
-	}
-
-	protected void adaptNew(Resource res) {
-		if (globalAdapterFactories != null) {
-			for (int i = 0; i < globalAdapterFactories.size(); i++) {
-				AdapterFactory factory = (AdapterFactory) globalAdapterFactories.get(i);
-				factory.adaptAllNew(res);
-			}
-		}
-		if (localAdapterFactories != null) {
-			for (int i = 0; i < localAdapterFactories.size(); i++) {
-				AdapterFactory factory = (AdapterFactory) localAdapterFactories.get(i);
-				factory.adaptAllNew(res);
-			}
-		}
-	}
-
-	/**
-	 * The local adapter factory is an adapter factory that you use to only adapt the resource
-	 * specific to the ResourceFactory instance.
-	 * 
-	 * @param factory
-	 */
-	public void addLocalAdapterFactory(AdapterFactory factory) {
-		if (localAdapterFactories == null)
-			localAdapterFactories = new ArrayList(3);
-		localAdapterFactories.add(factory);
-	}
-
-	public void removeLocalAdapterFactory(AdapterFactory factory) {
-		if (localAdapterFactories != null)
-			localAdapterFactories.remove(factory);
-	}
-
-	/**
-	 * A global adapter factory will be used to adapt any resource created by any ResourceFactory
-	 * instance.
-	 * 
-	 * @param factory
-	 */
-	public static void addGlobalAdapterFactory(AdapterFactory factory) {
-		if (globalAdapterFactories == null)
-			globalAdapterFactories = new ArrayList(3);
-		globalAdapterFactories.add(factory);
-	}
-
-	public static void removeGlobalAdapterFactory(AdapterFactory factory) {
-		if (globalAdapterFactories != null)
-			globalAdapterFactories.remove(factory);
-	}
-}
-
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedXMIResourceImpl.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedXMIResourceImpl.java
deleted file mode 100644
index cd4208b..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedXMIResourceImpl.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.resource;
-
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-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.notify.impl.NotificationImpl;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.wst.common.internal.emf.utilities.IDUtil;
-
-public class ReferencedXMIResourceImpl extends CompatibilityXMIResourceImpl implements ReferencedResource {
-	//TODO Add toString hook
-	private static final String TO_STRING = "ReferencedXMIResource, file = "; //$NON-NLS-1$
-	private static final String READ_COUNT_TO_STRING = " R= "; //$NON-NLS-1$
-	private static final String WRITE_COUNT_TO_STRING = " W= "; //$NON-NLS-1$
-
-	private int readReferenceCount = 1;
-	private int editReferenceCount = 0;
-	protected boolean isNew = true;
-	protected boolean forceRefresh;
-
-	/**
-	 * ReferencableXMIResourceImpl constructor comment.
-	 */
-	public ReferencedXMIResourceImpl() {
-		super();
-	}
-
-	public ReferencedXMIResourceImpl(URI uri) {
-		super(uri);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.internal.emf.resource.ReferencedResource#getReadCount()
-	 */
-	public int getReadCount() {
-		return readReferenceCount;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.internal.emf.resource.ReferencedResource#getWriteCount()
-	 */
-	public int getWriteCount() {
-		return editReferenceCount;
-	}
-
-
-
-	/*
-	 * @see ReferencedResource#accessForRead
-	 */
-	public void accessForRead() {
-		checkDeleted();
-		if (!isNew())
-			readReferenceCount++;
-		isNew = false;
-	}
-
-	/*
-	 * @see ReferencedResource#accessForWrite
-	 */
-	public void accessForWrite() {
-		checkDeleted();
-		editReferenceCount++;
-		if (isNew)
-			releaseFromRead();
-		isNew = false;
-		if (!isTrackingModification())
-			setTrackingModification(true);
-	}
-
-	/*
-	 * Check if this resource has been removed and throw an exception if it does not have a
-	 * ResourceSet.
-	 */
-	protected void checkDeleted() {
-		if (getResourceSet() == null)
-			throw new RuntimeException(DELETED_ERROR_MSG);
-	}
-
-	/**
-	 *  
-	 */
-	public void collectContainedObjects(java.util.List collecting, EObject parentObject) {
-
-		java.util.Iterator children = parentObject.eContents().iterator();
-		while (children.hasNext()) {
-			EObject child = (EObject) children.next();
-			collecting.add(child);
-			collectContainedObjects(collecting, child);
-		}
-	}
-
-	/**
-	 *  
-	 */
-	public void ensureFullIDHydration() {
-		List allRefObjects = new ArrayList();
-		Iterator rootObjects = getContents().iterator();
-		while (rootObjects.hasNext()) {
-			EObject child = (EObject) rootObjects.next();
-			allRefObjects.add(child);
-			collectContainedObjects(allRefObjects, child);
-		}
-
-		Iterator iter = allRefObjects.iterator();
-		while (iter.hasNext())
-			IDUtil.assignID((EObject) iter.next(), this);
-	}
-
-	/**
-	 * If the resource is no longer being accessed, then remove it from the resource set.
-	 */
-	public void unloadIfNecessary() {
-		if ((getTotalReferenceCount() <= 0) || (editReferenceCount <= 0 && isModified()))
-			unload();
-	}
-
-	/**
-	 * Return the number of write accesses to this resource.
-	 * 
-	 * @return int The number of references.
-	 */
-	protected int getTotalReferenceCount() {
-		return editReferenceCount + readReferenceCount;
-	}
-
-	/*
-	 * @see ReferencedResource#isNew
-	 */
-	public boolean isNew() {
-		return isNew;
-	}
-
-	/*
-	 * @see ReferencedResource#isReadOnly
-	 */
-	public boolean isReadOnly() {
-		return editReferenceCount <= 0;
-	}
-
-	/*
-	 * @see ReferencedResource#isShared
-	 */
-	public boolean isShared() {
-		return getTotalReferenceCount() > 1;
-	}
-
-	/*
-	 * @see ReferencedResource#isSharedForWrite
-	 */
-	public boolean isSharedForWrite() {
-		return editReferenceCount > 1;
-	}
-
-	/**
-	 * @see ReferencedResource#preDelete
-	 */
-	public void preDelete() {
-	}
-
-	/*
-	 * @see ReferencedResource#releaseFromRead
-	 */
-	public void releaseFromRead() {
-		readReferenceCount--;
-		if (readReferenceCount < 0)
-			throw new RuntimeException("Read reference count error:  " + this.toString()); //$NON-NLS-1$
-		unloadIfNecessary();
-	}
-
-	/*
-	 * @see ReferencedResource#releaseFromWrite
-	 */
-	public void releaseFromWrite() {
-		editReferenceCount--;
-		if (editReferenceCount < 0)
-			throw new RuntimeException("Write reference count error:  " + this.toString()); //$NON-NLS-1$
-		unloadIfNecessary();
-	}
-
-	/*
-	 * @see ReferencedResource#saveIfNecessary
-	 */
-	public void saveIfNecessary() throws Exception {
-		if (!isSharedForWrite()) // caller is the only referencer
-			save(Collections.EMPTY_MAP);
-	}
-
-	public String toString() {
-		return TO_STRING + getURI().toString() + READ_COUNT_TO_STRING + new Integer(readReferenceCount) + WRITE_COUNT_TO_STRING + new Integer(editReferenceCount);
-	}
-
-	/*
-	 * @see ReferencedResource#needsToSave()
-	 */
-	public boolean needsToSave() {
-		return isModified() && !isSharedForWrite();
-	}
-
-
-	/**
-	 * @see ReferencedResource#setForceRefresh(boolean)
-	 */
-	public void setForceRefresh(boolean b) {
-		forceRefresh = b;
-	}
-
-	/**
-	 * @see ReferencedResource#shouldForceRefresh()
-	 */
-	public boolean shouldForceRefresh() {
-		return forceRefresh;
-	}
-
-	protected void basicDoLoad(InputStream arg0, Map arg1) throws IOException {
-		boolean isTrackingMods = isTrackingModification();
-		try {
-			if (isTrackingMods)
-				setTrackingModification(false);
-			super.basicDoLoad(arg0, arg1);
-		} finally {
-			if (isTrackingMods)
-				setTrackingModification(true);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl#doUnload()
-	 */
-	protected void doUnload() {
-		if (isTrackingModification() && editReferenceCount < 1) //do not turn off modification if
-			// we still have a write count
-			setTrackingModification(false);
-		super.doUnload();
-		setForceRefresh(false);
-		setModified(false); //dcb - this is required to ensure that resources without files are
-		// marked as not modified.
-		if (readReferenceCount == 0 && editReferenceCount == 0)
-			resetAsNew();
-	}
-
-
-	/**
-	 * The resource has been unloaded, and there are no references. Treat the resource like a new
-	 * Resource
-	 */
-	private void resetAsNew() {
-		readReferenceCount = 1;
-		isNew = true;
-	}
-
-	/**
-	 * @see Resource#save(Object)
-	 */
-	public void save(Map options) throws IOException {
-		super.save(options);
-		notifySaved();
-	}
-
-	protected void notifySaved() {
-		if (eNotificationRequired()) {
-			Notification notification = new NotificationImpl(RESOURCE_WAS_SAVED, this, this) {
-				public Object getNotifier() {
-					return ReferencedXMIResourceImpl.this;
-				}
-
-				public int getFeatureID(Class expectedClass) {
-					return RESOURCE_WAS_SAVED;
-				}
-			};
-			eNotify(notification);
-		}
-	}
-
-	/**
-	 * @see com.ibm.etools.emf.workbench.ReferencedResource#wasReverted()
-	 */
-	public boolean wasReverted() {
-		return false;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/Renderer.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/Renderer.java
deleted file mode 100644
index 6768cd1..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/Renderer.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.resource;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Map;
-
-/**
- * Interface that defines the api for rendering an EMF object to XML and vice versa
- */
-public interface Renderer {
-
-	public static final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage"; //$NON-NLS-1$
-
-	public static final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema"; //$NON-NLS-1$
-
-	void setResource(TranslatorResource aResource);
-
-	TranslatorResource getResource();
-
-	void doLoad(InputStream in, Map options) throws IOException;
-
-	void doSave(OutputStream outputStream, Map options) throws IOException;
-
-	boolean useStreamsForIO();
-
-	void prepareToAddContents();
-
-	int getVersionID();
-
-	boolean isModified();
-
-	void accessForWrite();
-
-	void accessForRead();
-
-	void releaseFromRead();
-
-	void releaseFromWrite();
-
-	void preDelete();
-
-	void preUnload();
-
-	boolean isShared();
-
-	boolean isSharedForWrite();
-
-	void setBatchMode(boolean isBatch);
-	
-	boolean isBatchMode();
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/RendererFactory.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/RendererFactory.java
deleted file mode 100644
index 9f294d3..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/RendererFactory.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.resource;
-
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-
-public abstract class RendererFactory {
-
-	public abstract Renderer createRenderer();
-
-	private static RendererFactory defaultRendererFactory;
-
-	private static RendererFactoryDefaultHandler defaultHandler;
-
-	private boolean validating = true;
-
-	/**
-	 * Interested parties can use the
-	 */
-	public final static Notifier NotificationEngine = Notifier.INSTANCE;
-
-	/**
-	 * @return
-	 */
-	public static RendererFactory getDefaultRendererFactory() {
-		if (defaultRendererFactory == null)
-			defaultRendererFactory = getDefaultHandler().getDefaultRendererFactory();
-		return defaultRendererFactory;
-	}
-
-	/**
-	 * @param factory
-	 */
-	public static void setDefaultRendererFactory(RendererFactory factory) {
-
-		//System.out.println("\n\n***Setting factory: " + factory);
-		NotificationEngine.notifyListeners(factory);
-		defaultRendererFactory = factory;
-	}
-
-	public String toString() {
-		return "RendererFactory instance: " + getClass().getName(); //$NON-NLS-1$
-	}
-
-	public static class Notifier {
-
-		private static final Notifier INSTANCE = new Notifier();
-
-		private final Collection resourceFactoryListeners = new ArrayList();
-
-		private Notifier() {
-		}
-
-		public void notifyListeners(RendererFactory rendererFactory) {
-
-			final int length = resourceFactoryListeners.size();
-			//System.out.println("Notifying " + length + " listeners");
-
-			if (length > 0) {
-				/*
-				 * Since the renderer factories are singletons, this reference check should always
-				 * work
-				 */
-				if (rendererFactory != RendererFactory.getDefaultRendererFactory()) {
-					WeakReference wref = null;
-					Listener listener = null;
-					synchronized (resourceFactoryListeners) {
-						for (Iterator i = resourceFactoryListeners.iterator(); i.hasNext();) {
-							wref = (WeakReference) i.next();
-							listener = (Listener) wref.get();
-							//System.out.println("Notifying Listener: " + listener);
-							if (listener != null)
-								listener.updateRendererFactory(rendererFactory);
-							else
-								i.remove();
-						}
-					}
-				}
-			}
-		}
-
-		public void addListener(Listener l) {
-			//System.out.println("Adding listener: " + l);
-			synchronized (resourceFactoryListeners) {
-				resourceFactoryListeners.add(new WeakReference(l));
-			}
-		}
-
-		public void removeListener(Listener listenerToRemove) {
-			final int length = resourceFactoryListeners.size();
-			if (length > 0) {
-				WeakReference wref = null;
-				Listener listener = null;
-				synchronized (resourceFactoryListeners) {
-					for (Iterator i = resourceFactoryListeners.iterator(); i.hasNext();) {
-						wref = (WeakReference) i.next();
-						listener = (Listener) wref.get();
-						if (listener != null) {
-							if (listener == listenerToRemove) {
-								i.remove();
-								break;
-							}
-						} else {
-							i.remove();
-						}
-					}
-				}
-			}
-		}
-
-	}
-
-	public interface Listener {
-		void updateRendererFactory(RendererFactory newRendererFactory);
-	}
-
-	/**
-	 * @return
-	 */
-	public boolean isValidating() {
-		return validating;
-	}
-
-	/**
-	 * @param b
-	 */
-	public void setValidating(boolean b) {
-		validating = b;
-	}
-
-	/**
-	 * @return
-	 */
-	public static RendererFactoryDefaultHandler getDefaultHandler() {
-		if (defaultHandler == null)
-			defaultHandler = EMF2DOMRendererFactoryDefaultHandler.INSTANCE;
-		return defaultHandler;
-	}
-
-	/**
-	 * @param handler
-	 */
-	public static void setDefaultHandler(RendererFactoryDefaultHandler handler) {
-		defaultHandler = handler;
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/RendererFactoryDefaultHandler.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/RendererFactoryDefaultHandler.java
deleted file mode 100644
index 575df4f..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/RendererFactoryDefaultHandler.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Dec 1, 2003
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.wst.common.internal.emf.resource;
-
-
-/**
- * @author schacher
- * 
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public interface RendererFactoryDefaultHandler {
-
-	RendererFactory getDefaultRendererFactory();
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/RootTranslator.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/RootTranslator.java
deleted file mode 100644
index 18f8d84..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/RootTranslator.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.resource;
-
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.resource.Resource;
-
-public class RootTranslator extends Translator {
-
-	/**
-	 * Constructor for RootTranslator.
-	 * 
-	 * @param domNameAndPath
-	 * @param eClass
-	 */
-	public RootTranslator(String domNameAndPath, EClass eClass) {
-		super(domNameAndPath, eClass);
-	}
-
-	/**
-	 * @see com.ibm.etools.emf2xml.impl.Translator#setMOFValue(Notifier, Object, int)
-	 */
-	public void setMOFValue(Notifier owner, Object value, int newIndex) {
-		((Resource) owner).getContents().add(newIndex, value);
-	}
-
-	/**
-	 * @see com.ibm.etools.emf2xml.impl.Translator#removeMOFValue(Notifier, Object)
-	 */
-	public void removeMOFValue(Notifier owner, Object value) {
-		((Resource) owner).getContents().remove(value);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.impl.Translator#setMOFValue(org.eclipse.emf.ecore.EObject,
-	 *      java.lang.Object)
-	 */
-	public void setMOFValue(Resource res, Object value) {
-		if (res != null && value != null)
-			res.getContents().add(value);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.impl.Translator#isMultiValued()
-	 */
-	public boolean isMultiValued() {
-		return true;
-	}
-
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/SourceLinkTranslator.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/SourceLinkTranslator.java
deleted file mode 100644
index d5d697b..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/SourceLinkTranslator.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Apr 1, 2003
- *
- */
-package org.eclipse.wst.common.internal.emf.resource;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * @author schacher
- */
-public class SourceLinkTranslator extends Translator {
-
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 * @param path
-	 */
-	public SourceLinkTranslator(String domNameAndPath, EStructuralFeature aFeature, TranslatorPath path) {
-		super(domNameAndPath, aFeature, path);
-	}
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 * @param path
-	 */
-	public SourceLinkTranslator(String domNameAndPath, EStructuralFeature aFeature, TranslatorPath path, int style) {
-		super(domNameAndPath, aFeature, path);
-		fStyle |= style;
-	}
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 * @param style
-	 */
-	public SourceLinkTranslator(String domNameAndPath, EStructuralFeature aFeature, int style) {
-		super(domNameAndPath, aFeature, style);
-	}
-
-	public Object convertStringToValue(String strValue, EObject owner) {
-
-		Object value = null;
-		if (strValue != null)
-			// Find the object with the name that matches matchName
-			value = fTranslatorPaths[0].findObject(owner, strValue.trim());
-		if ((fStyle & Translator.STRING_RESULT_OK) != 0)
-			return ((value != null) ? value : strValue);
-		return value;
-	}
-
-	public String convertValueToString(Object value, EObject owner) {
-		TranslatorPath path = fTranslatorPaths[0];
-		Object attrValue = path.getLastMap().getMOFValue((EObject) value);
-		return path.getLastMap().convertValueToString(attrValue, owner);
-	}
-
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/Translator.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/Translator.java
deleted file mode 100644
index d36e3cf..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/Translator.java
+++ /dev/null
@@ -1,792 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.resource;
-
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.EcorePackage;
-import org.eclipse.emf.ecore.impl.EStructuralFeatureImpl;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.wst.common.internal.emf.utilities.ExtendedEcoreUtil;
-import org.eclipse.wst.common.internal.emf.utilities.FeatureValueConverter;
-
-
-public class Translator {
-
-	public final static int NO_STYLE = 0;
-	public final static int DOM_ATTRIBUTE = 1;
-	public final static int EMPTY_TAG = 1 << 1;
-	public final static int CDATA_CONTENT = 1 << 2;
-	/**
-	 * Style bit that indicates that the end tag should NOT be indented; by default it is.
-	 */
-	public final static int END_TAG_NO_INDENT = 1 << 3;
-	/**
-	 * Style bit that indicates that booleans should NOT be converted as "True" and "False"; default
-	 * is that they are
-	 */
-	public final static int BOOLEAN_LOWERCASE = 1 << 4;
-	/**
-	 * Style bit that indicates an enum value contains hyphens If this is true, then internally the
-	 * hyphens are replaced with underscores
-	 */
-	public final static int ENUM_FEATURE_WITH_HYPHENS = 1 << 5;
-
-	protected final static int OBJECT_MAP = 1 << 6;
-	protected final static int BOOLEAN_FEATURE = 1 << 7;
-
-	protected final static int SHARED_REFERENCE = 1 << 8;
-
-	/**
-	 * Indicates that the feature may be significant even if it is empty
-	 */
-	public final static int EMPTY_CONTENT_IS_SIGNIFICANT = 1 << 9;
-
-	/**
-	 * Used to indicate that feature is associated with a comment node
-	 */
-	protected final static int COMMENT_FEATURE = 1 << 10;
-
-	/**
-	 * If the value is null, then an eUnset() will be invoked on the feature
-	 */
-	public final static int UNSET_IF_NULL = 1 << 11;
-
-	/**
-	 * Return the element contents as a String if the feature is unresolveable (Used by the
-	 * SourceLinkTranslator)
-	 */
-	public final static int STRING_RESULT_OK = 1 << 12;
-
-	protected String[] fDOMNames;
-	protected String fDOMPath = ""; //$NON-NLS-1$
-	protected Map readAheadNames;
-	protected int fStyle = NO_STYLE;
-	protected EStructuralFeature feature;
-	protected TranslatorPath[] fTranslatorPaths;
-	protected EClass emfClass;
-	protected String fNameSpace = ""; //$NON-NLS-1$
-	// added by MDE
-	protected String domNameAndPath = null;
-
-	/**
-	 * Indicates if any of the children of this Translator are themselves DependencyTranslators
-	 */
-	protected Boolean isDependencyParent;
-	protected EStructuralFeature dependencyFeature;
-	protected static EcorePackage ECORE_PACKAGE = EcorePackage.eINSTANCE;
-
-	// Use this identifier for the DOMName when the attribute
-	// value is to be extracted directly from the text of the node.
-	// This is rare, but occurs in the web.xml in the case of a
-	// WelcomeFile.
-	static final public String TEXT_ATTRIBUTE_VALUE = "$TEXT_ATTRIBUTE_VALUE"; //$NON-NLS-1$
-
-	static final public EStructuralFeature CONTAINER_FEATURE = new ContainerFeature();
-
-	static final public EStructuralFeature ROOT_FEATURE = new RootFeature();
-
-	protected static class ContainerFeature extends EStructuralFeatureImpl {
-		protected ContainerFeature() {
-			super();
-		}
-	}
-
-	protected static class RootFeature extends EStructuralFeatureImpl {
-		protected RootFeature() {
-			super();
-		}
-	}
-
-	public Translator findChild(String tagName, Object target, int versionID) {
-
-		Translator result = null;
-		Translator[] maps = getChildren(target, versionID);
-
-		if (maps != null) {
-			for (int i = 0; i < maps.length; i++) {
-				Translator map = maps[i];
-				if (map.isMapFor(tagName)) {
-					result = map;
-					break;
-				}
-			}
-		}
-		if (result == null) {
-			VariableTranslatorFactory factory = getVariableTranslatorFactory();
-			if (factory != null && factory.accepts(tagName)) {
-				result = factory.create(tagName);
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Utility method to string together arrays of children
-	 */
-	public static Object[] concat(Object[] array1, Object[] array2) {
-		Object[] result = (Object[]) java.lang.reflect.Array.newInstance(array1.getClass().getComponentType(), array1.length + array2.length);
-		System.arraycopy(array1, 0, result, 0, array1.length);
-		System.arraycopy(array2, 0, result, array1.length, array2.length);
-		return result;
-	}
-
-	public static Object[] concat(Object[] array1, Object object2) {
-		Object[] newArray = new Object[]{object2};
-		return concat(array1, newArray);
-	}
-
-	public static Translator createParentAndTextAttributeTranslator(String domName, EStructuralFeature parentFeature, EStructuralFeature childFeature) {
-		GenericTranslator parent = new GenericTranslator(domName, parentFeature, END_TAG_NO_INDENT);
-		parent.setChildren(new Translator[]{new Translator(TEXT_ATTRIBUTE_VALUE, childFeature)});
-		return parent;
-	}
-
-	public Translator(String domNameAndPath, EClass eClass) {
-		initializeDOMNameAndPath(domNameAndPath);
-		setEMFClass(eClass);
-	}
-
-	public Translator(String domNameAndPath, EStructuralFeature aFeature) {
-		initializeDOMNameAndPath(domNameAndPath);
-		setFeature(aFeature);
-	}
-
-	public Translator(String domNameAndPath, EStructuralFeature aFeature, EClass eClass) {
-		this(domNameAndPath, aFeature);
-		setEMFClass(emfClass);
-	}
-
-	public Translator(String domNameAndPath, EStructuralFeature aFeature, TranslatorPath path) {
-		this(domNameAndPath, aFeature, new TranslatorPath[]{path});
-	}
-
-	public Translator(String domNameAndPath, EStructuralFeature aFeature, TranslatorPath[] paths) {
-		initializeDOMNameAndPath(domNameAndPath);
-		fTranslatorPaths = paths;
-		setFeature(aFeature);
-	}
-
-	public Translator(String domNameAndPath, EStructuralFeature aFeature, int style) {
-		initializeDOMNameAndPath(domNameAndPath);
-		fStyle = style;
-		setFeature(aFeature);
-	}
-
-	public static EcorePackage getEcorePackage() {
-		return EcorePackage.eINSTANCE;
-	}
-
-	public String getDOMName(Object value) {
-		return fDOMNames[0];
-	}
-
-	public String[] getDOMNames() {
-		return fDOMNames;
-	}
-
-	public String getDOMPath() {
-		return fDOMPath;
-	}
-
-	public boolean hasDOMPath() {
-		return fDOMPath != null && fDOMPath.length() != 0;
-	}
-
-	public EStructuralFeature getFeature() {
-		return feature;
-	}
-
-	/**
-	 * Parse the DOM names and path out of <domNameAndPath>and set the appropriate fields.
-	 */
-	protected void initializeDOMNameAndPath(String domNameAndPathArg) {
-		if (domNameAndPathArg == null)
-			return;
-		int inx = domNameAndPathArg.lastIndexOf('/');
-		if (inx != -1) {
-			fDOMNames = parseDOMNames(domNameAndPathArg.substring(inx + 1));
-			fDOMPath = domNameAndPathArg.substring(0, inx);
-		} else {
-			fDOMNames = parseDOMNames(domNameAndPathArg);
-			fDOMPath = ""; //$NON-NLS-1$
-		}
-		// added by MDE
-		this.domNameAndPath = domNameAndPathArg;
-
-	}
-
-	/**
-	 * Indicates whether the node should be written as an empty tag; eg, <distributable/>
-	 */
-	public boolean isCDATAContent() {
-		return (fStyle & CDATA_CONTENT) != 0;
-	}
-
-	/**
-	 * Indicates whether the DOMName represents a sub element name or an attribute name
-	 * 
-	 * @return boolean True if the DOMName is an attribute name.
-	 */
-	public boolean isDOMAttribute() {
-		return (fStyle & DOM_ATTRIBUTE) != 0;
-	}
-
-	/**
-	 * Indicates whether the node should be written as an empty tag; eg, <distributable/>
-	 */
-	public boolean isEmptyTag() {
-		return (fStyle & EMPTY_TAG) != 0;
-	}
-
-	public boolean isBooleanUppercase() {
-		return (fStyle & BOOLEAN_FEATURE) != 0 && (fStyle & BOOLEAN_LOWERCASE) == 0;
-	}
-
-	public boolean isBooleanFeature() {
-		return (fStyle & BOOLEAN_FEATURE) != 0;
-	}
-
-	public boolean shouldIndentEndTag() {
-		return (fStyle & END_TAG_NO_INDENT) == 0;
-	}
-
-	public boolean isEmptyContentSignificant() {
-		return ((fStyle & EMPTY_TAG) != 0) || ((fStyle & EMPTY_CONTENT_IS_SIGNIFICANT) != 0);
-	}
-
-	/**
-	 * Returns true if this map is to another MOF object (not a primitive)
-	 */
-	public boolean isObjectMap() {
-		return (fStyle & OBJECT_MAP) != 0;
-	}
-
-	/**
-	 * Returns true if this map is for a shared reference
-	 */
-	public boolean isShared() {
-		return (fStyle & SHARED_REFERENCE) != 0;
-	}
-
-	public boolean isEnumWithHyphens() {
-		return (fStyle & ENUM_FEATURE_WITH_HYPHENS) != 0;
-	}
-
-	/**
-	 * Indicates whether the map represents a case where the text of the DOMNode represents the
-	 * objects one and only attribute value. An example of this case is a <welcome-file>file.txt
-	 * </welcome-file>.
-	 */
-	public boolean isDOMTextValue() {
-		return fDOMNames[0] == TEXT_ATTRIBUTE_VALUE;
-	}
-
-	/**
-	 * Indicates whether the id is the mof attribute that should be set.
-	 */
-	public boolean isIDMap() {
-		return false;
-	}
-
-	/**
-	 * Indicates whether the id is the mof attribute that should be set.
-	 */
-	public boolean isLinkMap() {
-		return fTranslatorPaths != null;
-	}
-
-	public boolean isTargetLinkMap() {
-		return isLinkMap() && !isObjectMap();
-	}
-
-	/**
-	 * Return true if this map is the one representing a node with the name <domName>. By default
-	 * this method simply compares the DOM name of the map against the <domName>parameter
-	 * 
-	 * @return boolean
-	 * @param domName
-	 *            java.lang.String
-	 */
-	public boolean isMapFor(String domName) {
-		if (domName.equals(getDOMPath()))
-			return true;
-		for (int i = 0; i < fDOMNames.length; i++) {
-			if (domName.equals(fDOMNames[i]))
-				return true;
-		}
-		return false;
-	}
-
-	public boolean isMapFor(Object aFeature, Object oldValue, Object newValue) {
-		return feature == aFeature;
-	}
-
-	/**
-	 * Indicates whether feature being mapped is a collection.
-	 * 
-	 * @return boolean True if the feature is multi valued.
-	 */
-	public boolean isMultiValued() {
-		if (feature != null)
-			return feature.isMany();
-		return false;
-	}
-
-	/**
-	 * Parses comma separated names from <domNamesString>. Returns an array containing the names.
-	 * 
-	 * @return java.lang.String[]
-	 * @param domNamesString
-	 *            java.lang.String
-	 */
-	protected String[] parseDOMNames(String domNamesString) {
-		int startInx = 0;
-		int inx = domNamesString.indexOf(',');
-		ArrayList results = new ArrayList(1);
-		while (inx != -1) {
-			results.add(domNamesString.substring(startInx, inx));
-			startInx = inx + 1;
-			inx = domNamesString.indexOf(',', startInx);
-		}
-		if (startInx == 0)
-			results.add(domNamesString);
-		else
-			results.add(domNamesString.substring(startInx));
-		return (String[]) results.toArray(new String[results.size()]);
-	}
-
-	public String toString() {
-		StringBuffer sb = new StringBuffer();
-		String cn = getClass().getName();
-		int i = cn.lastIndexOf('.');
-		cn = cn.substring(++i, cn.length());
-		sb.append(cn);
-		sb.append('(');
-		sb.append(fDOMNames[0]);
-		for (int j = 1; j < fDOMNames.length; j++) {
-			sb.append('|');
-			sb.append(fDOMNames[j]);
-		}
-		sb.append(',');
-		sb.append(hashCode());
-		sb.append(')');
-		return sb.toString();
-	}
-
-	/**
-	 * Gets the TranslatorPath.
-	 * 
-	 * @return Returns a TranslatorPath
-	 */
-	public TranslatorPath[] getTranslatorPaths() {
-		return fTranslatorPaths;
-	}
-
-	/*
-	 * @see Object#equals(Object)
-	 */
-	public boolean equals(Object object) {
-		if (!(object instanceof Translator))
-			return false;
-		Translator mapInfo = (Translator) object;
-		return fDOMNames.equals(mapInfo.getDOMNames()) && (feature == null && mapInfo.getFeature() == null || feature.equals(mapInfo.getFeature()));
-	}
-
-	/**
-	 * Returns the isManagedByParent.
-	 * 
-	 * @return boolean
-	 */
-	public boolean isManagedByParent() {
-		return getChildren(null, -1) == null;
-	}
-
-	/*
-	 * In the 99% case there is only one node name to be concerned with, but subclasses can override
-	 * for the cases where multiple dom names map to one feature
-	 */
-	public EObject createEMFObject(String nodeName, String readAheadName) {
-		if (emfClass == null) {
-			if (feature == null)
-				return null;
-			if (isObjectMap())
-				return createEMFObject(feature);
-		}
-		return createEMFObject(emfClass);
-	}
-
-	public static EObject createEMFObject(EStructuralFeature aFeature) {
-		if (aFeature == null)
-			return null;
-
-		return createEMFObject(((EReference) aFeature).getEReferenceType());
-	}
-
-	public static EObject createEMFObject(EClass anEClass) {
-		if (anEClass == null)
-			return null;
-		return anEClass.getEPackage().getEFactoryInstance().create(anEClass);
-	}
-
-	public void setTextValueIfNecessary(String textValue, Notifier owner, int versionId) {
-		Translator textTranslator = this.findChild(Translator.TEXT_ATTRIBUTE_VALUE, owner, versionId);
-		if (textTranslator != null) {
-			Object objectValue = textTranslator.convertStringToValue(textValue, (EObject) owner);
-			textTranslator.setMOFValue(owner, objectValue);
-		}
-	}
-
-	/**
-	 * Check to see if feature is valid on a particular mofObject.
-	 * 
-	 * @return boolean Return true if the feature specified exists on the MOF object.
-	 * @param emfObject
-	 *            org.eclipse.emf.ecore.EObject
-	 */
-	public boolean featureExists(EObject emfObject) {
-		if (feature == null)
-			return false;
-
-		return emfObject.eClass().getEStructuralFeature(feature.getName()) != null;
-	}
-
-	/**
-	 * Translators which do not have a feature should override this method with custom behavior.
-	 */
-	public String extractStringValue(EObject emfObject) {
-		if (isEmptyTag() && feature == null)
-			return ""; //Fake it out with a value //$NON-NLS-1$
-		return null;
-	}
-
-	public Object convertStringToValue(String nodeName, String readAheadName, String value, Notifier owner) {
-		Object result = null;
-		try {
-
-			if (!this.isManagedByParent()) {
-				result = createEMFObject(nodeName, readAheadName);
-			} else {
-				result = convertStringToValue(value, (EObject) owner);
-			}
-
-		} catch (ClassCastException cce) {
-
-		}
-		return result;
-	}
-
-	/**
-	 * Converts a string value to the appropriate type.
-	 * 
-	 * @return java.lang.Object The converted value
-	 * @param strValue
-	 *            java.lang.String The string to convert.
-	 */
-	public Object convertStringToValue(String strValue, EObject owner) {
-		if (feature == null)
-			return strValue;
-		if (strValue != null) {
-			if (isEnumWithHyphens())
-				strValue = strValue.replace('-', '_');
-			if (!isCDATAContent()) {
-				strValue = strValue.trim();
-			}
-		}
-		Object value = FeatureValueConverter.DEFAULT.convertValue(strValue, feature);
-		if (value == null) {
-			if (isEmptyTag() && !isDOMAttribute() && !isDOMTextValue() && isBooleanFeature())
-				return Boolean.TRUE;
-			EObject convertToType = feature.getEType();
-			if (convertToType == null)
-				value = strValue;
-			else if (convertToType.equals(getEcorePackage().getEString())) {
-				value = ""; //$NON-NLS-1$
-			}
-		}
-		return value;
-	}
-
-	/**
-	 * Converts a value of a specified type to a string value. Subclasses may override for special
-	 * cases where special conversion needs to occur based on the feature and or object type.
-	 * 
-	 * @return String The converted value
-	 * @param value
-	 *            java.lang.Object The object to convert.
-	 */
-	public String convertValueToString(Object value, EObject owner) {
-		if (isEmptyTag() || value == null)
-			return null;
-		else if (isEnumWithHyphens())
-			return value.toString().replace('_', '-');
-		else if (isBooleanUppercase())
-			return ((Boolean) value).booleanValue() ? "True" : "False"; //$NON-NLS-1$ //$NON-NLS-2$
-
-		return value.toString();
-	}
-
-	public Translator[] getVariableChildren(Notifier target, int version) {
-		Translator[] results = null;
-		VariableTranslatorFactory factory = getVariableTranslatorFactory();
-		if (factory != null) {
-			List variableTranslators = factory.create(target);
-			if (variableTranslators != null && variableTranslators.size() > 0) {
-				Object[] vtoa = variableTranslators.toArray();
-
-				results = new Translator[vtoa.length];
-				for (int i = 0; i < results.length; i++)
-					results[i] = (Translator) vtoa[i];
-			}
-
-		}
-		if (results == null)
-			results = new Translator[0];
-		return results;
-	}
-
-	/**
-	 * Returns null by default; subclasses should override to return specific children
-	 */
-	public Translator[] getChildren(Object target, int versionID) {
-		return getChildren();
-	}
-
-	protected Translator[] getChildren() {
-		return null;
-	}
-
-	/**
-	 * Return the list of MOF children that currently exist for the values of an attribute.
-	 */
-	public List getMOFChildren(EObject mofObject) {
-		if (feature == null)
-			return Collections.EMPTY_LIST;
-		Object value = getMOFValue(mofObject);
-		List result = Collections.EMPTY_LIST;
-		if (isMultiValued())
-			result = (List) value;
-		else if (value != null)
-			result = Collections.singletonList(value);
-		return result;
-	}
-
-	public Object getMOFValue(EObject mofObject) {
-		if (feature == null)
-			return null;
-		return mofObject.eGet(feature);
-	}
-
-	/**
-	 * Sets a value of a feature in a mof object.
-	 */
-	public void setMOFValue(Notifier owner, Object value, int newIndex) {
-		if (feature != null) {
-			if ((fStyle & UNSET_IF_NULL) != 0 && value == null)
-				ExtendedEcoreUtil.eUnsetOrRemove((EObject) owner, feature, value);
-			else
-				ExtendedEcoreUtil.eSetOrAdd((EObject) owner, feature, value, newIndex);
-		}
-	}
-
-	public void setMOFValue(Notifier owner, Object value) {
-		if (owner instanceof EObject) {
-			setMOFValue((EObject) owner, value);
-		} else if (owner instanceof Resource) {
-			setMOFValue((Resource) owner, value);
-		}
-	}
-
-	public void setMOFValue(EObject emfObject, Object value) {
-		//		if (feature != null)
-		//			emfObject.eSet(feature, value);
-		setMOFValue(emfObject, value, -1);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.impl.Translator#setMOFValue(org.eclipse.emf.ecore.EObject,
-	 *      java.lang.Object)
-	 */
-	public void setMOFValue(Resource res, Object value) {
-		if (res != null && value != null)
-			res.getContents().add(value);
-	}
-
-	public void removeMOFValue(Notifier owner, Object value) {
-		if (feature != null)
-			ExtendedEcoreUtil.eUnsetOrRemove((EObject) owner, feature, value);
-	}
-
-	public boolean isSetMOFValue(EObject emfObject) {
-		boolean isSet = feature != null && emfObject.eIsSet(feature);
-		if (isEmptyTag())
-			return isSet && ((Boolean) emfObject.eGet(feature)).booleanValue();
-		return isSet;
-	}
-
-	public void unSetMOFValue(EObject emfObject) {
-		if (feature != null)
-			emfObject.eUnset(feature);
-	}
-
-	public void clearList(EObject mofObject) {
-		if (feature != null)
-			((List) mofObject.eGet(feature)).clear();
-	}
-
-	protected void setFeature(EStructuralFeature aFeature) {
-		this.feature = aFeature;
-		if (feature == null)
-			return;
-		//This way an instance check happens only once
-		if (aFeature instanceof EReference) {
-			fStyle |= OBJECT_MAP;
-			if (!((EReference) aFeature).isContainment())
-				fStyle |= SHARED_REFERENCE;
-		}
-
-		if (getEcorePackage().getEBoolean() == feature.getEType())
-			fStyle |= BOOLEAN_FEATURE;
-	}
-
-	protected void setEMFClass(EClass anEClass) {
-		this.emfClass = anEClass;
-		if (anEClass != null)
-			fStyle |= OBJECT_MAP;
-
-	}
-
-	public boolean hasReadAheadNames() {
-		return readAheadNames != null && !readAheadNames.isEmpty();
-	}
-
-	/**
-	 * Return the read ahead names, if they are defined, for a given parent node name. This is used
-	 * when creation of a specific EMF object is dependent on the value of a child node.
-	 */
-	public ReadAheadHelper getReadAheadHelper(String parentName) {
-		if (readAheadNames == null)
-			return null;
-		return (ReadAheadHelper) readAheadNames.get(parentName);
-	}
-
-	public void addReadAheadHelper(ReadAheadHelper helper) {
-		if (readAheadNames == null)
-			readAheadNames = new HashMap(3);
-		readAheadNames.put(helper.getParentDOMName(), helper);
-	}
-
-	public boolean isDependencyChild() {
-		return false;
-	}
-
-	/**
-	 * @return
-	 */
-	public boolean isDependencyParent() {
-		if (isDependencyParent == null) {
-			isDependencyParent = Boolean.FALSE;
-			Translator[] theChildren = getChildren(null, -1);
-			if (theChildren != null) {
-				for (int i = 0; i < theChildren.length; i++) {
-					//For now we assume one
-					if (theChildren[i].isDependencyChild()) {
-						isDependencyParent = Boolean.TRUE;
-						dependencyFeature = theChildren[i].getDependencyFeature();
-					}
-				}
-			}
-		}
-		return isDependencyParent.booleanValue();
-	}
-
-	/**
-	 * @return
-	 */
-	public EStructuralFeature getDependencyFeature() {
-		return dependencyFeature;
-	}
-
-	public EObject basicGetDependencyObject(EObject parent) {
-		return (EObject) parent.eGet(dependencyFeature);
-	}
-
-	/**
-	 * Use when the DOM path is not null, and there are no children. Default is false, but
-	 * subclasses may wish to override
-	 */
-	public boolean shouldRenderEmptyDOMPath(EObject eObject) {
-		return isEmptyContentSignificant();
-	}
-
-	/**
-	 * Use when the translator tolerates parent nodes that relate to the DOM path, and no children;
-	 * default is do nothing
-	 */
-	public void setMOFValueFromEmptyDOMPath(EObject eObject) {
-
-	}
-
-	/**
-	 * Namespace for the attributes
-	 * 
-	 * @return
-	 */
-	public String getNameSpace() {
-		return fNameSpace;
-	}
-
-	/**
-	 * Set the namespace for the dom attribute
-	 * 
-	 * @param string
-	 */
-	public void setNameSpace(String string) {
-		fNameSpace = string;
-	}
-
-	public VariableTranslatorFactory getVariableTranslatorFactory() {
-		if (isObjectMap())
-			return DefaultTranslatorFactory.INSTANCE;
-		return null;
-	}
-
-	public boolean isEnumFeature() {
-		return feature != null && ECORE_PACKAGE.getEEnum().isInstance(feature.getEType());
-	}
-
-	public boolean isUnsettable() {
-		return feature != null && feature.isUnsettable();
-	}
-
-	public boolean isDataType() {
-		return feature != null && feature.getEType() instanceof EDataType;
-	}
-
-	/**
-	 * @return
-	 */
-	public boolean isComment() {
-		return (fStyle & COMMENT_FEATURE) != 0;
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorFilter.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorFilter.java
deleted file mode 100644
index b12067d..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorFilter.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- **************************************************************************************************/
-/*
- * Created on Sep 21, 2003
- *  
- */
-package org.eclipse.wst.common.internal.emf.resource;
-
-import org.eclipse.emf.ecore.EObject;
-
-
-/*
- * Translator filters can be used to differentiate between Object and Attribute Translators without
- * breaking them out into seperate data structures. The Filter will rely on the underlying data
- * structure used to store the children of the given Translator.
- * 
- * getNextChild() will return null when no other translators of the given genre are available.
- * 
- * The processing hints which are created and then passed to getNext*Translator() store information
- * that needs to be persisted between calls. The createProcessingHints() will create a properly
- * initialized array. The constants NEXT_START_HINT_INDX and MODE_HINT_INDX provide pointers into
- * the array for the NEXT_START position and the proper mode to operate in
- * (STANDARD_TRANSLATORS_MODE or
- *  
- */
-public abstract class TranslatorFilter {
-
-	protected final Translator translator;
-	protected final int version;
-
-	public static final int NEXT_START_HINT_INDX = 0;
-	public static final int MODE_HINT_INDX = 1;
-
-	public static final int STANDARD_TRANSLATORS_MODE = 0;
-	public static final int VARIABLE_TRANSLATORS_MODE = 1;
-
-	/*
-	 * These TranslatorFilters are used in a stateless mode. Only their scanNextTranslator() methods
-	 * will be invoked
-	 */
-	private static final TranslatorFilter objectTranslatorFilter = new ObjectTranslatorFilter(null, -1);
-	private static final TranslatorFilter attributeTranslatorFilter = new AttributeTranslatorFilter(null, -1);
-
-
-	protected int mode = STANDARD_TRANSLATORS_MODE;
-	protected int index = -1;
-
-	protected Translator cachedPeekAheadTranslator = null;
-
-	public TranslatorFilter(Translator trans, int version) {
-		this.translator = trans;
-		this.version = version;
-	}
-
-	/**
-	 * Calling peek twice will advance the current child
-	 */
-	public Translator peekNextChild(EObject target) {
-		cachedPeekAheadTranslator = getNextChild(target);
-		return cachedPeekAheadTranslator;
-	}
-
-	/**
-	 * getNextChild() will return null when no other translators of the given genre are available.
-	 */
-	public Translator getNextChild(EObject target) {
-
-		Translator result = null;
-		if (cachedPeekAheadTranslator != null) {
-			result = cachedPeekAheadTranslator;
-			cachedPeekAheadTranslator = null;
-			return result;
-		}
-
-		int found = 0;
-		Translator children[] = null;
-		switch (mode) {
-			case STANDARD_TRANSLATORS_MODE :
-				children = this.translator.getChildren(target, this.version);
-
-				/* Look for the next Attribute Translator */
-				found = scanNextTranslator(children, this.index);
-
-				if (found >= 0) {
-					/*
-					 * If found, (1) update the result, (2) update the index so we can skip ahead on
-					 * the next invocation (3) escape the VARIABLE_TRANSLATORS processing
-					 */
-					result = children[found];
-					this.index = found;
-					break;
-				}
-				/*
-				 * Reset the index. DO NOT BREAK. Allow entry into VARIABLE_TRANSLATORS case
-				 */
-				this.index = -1;
-				/*
-				 * update the mode to VARIABLE_TRANSLATORS so we can skip to it directly next time
-				 */
-				this.mode = VARIABLE_TRANSLATORS_MODE;
-			case VARIABLE_TRANSLATORS_MODE :
-				children = this.translator.getVariableChildren(target, this.version);
-				found = scanNextTranslator(children, this.index);
-				if (found >= 0) {
-					/*
-					 * If found, (1) update the result, (2) update the index so we can skip ahead on
-					 * the next invocation
-					 */
-					result = children[found];
-					this.index = found;
-				}
-
-		}
-
-		return result;
-	}
-
-	public static final int[] createProcessingHints() {
-		return new int[]{-1, STANDARD_TRANSLATORS_MODE};
-	}
-
-	public static final Translator getNextAttributeTranslator(Translator translator, int startHint, int[] nextHint, EObject target, int version) {
-
-		return TranslatorFilter.getNextChild(translator, startHint, nextHint, target, version, attributeTranslatorFilter);
-	}
-
-	public static final Translator getNextObjectTranslator(Translator translator, int startHint, int[] nextHint, EObject target, int version) {
-
-		return TranslatorFilter.getNextChild(translator, startHint, nextHint, target, version, objectTranslatorFilter);
-	}
-
-	/**
-	 * getNextChild() takes hints on where to begin in the children array of the given Translator.
-	 * When it finds the translator, it will update the hints array with the start hint for the next
-	 * invocation(hints[0]) and when necessary it will use update the mode (hints[1]) to either
-	 * STANDARD_TRANSLATORS or VARIABLE_TRANSLATORS.
-	 * 
-	 * @param translator
-	 * @param startHint
-	 * @param hints
-	 *            a two-element array: hints[0] will be updated with the next startHint and hints[1]
-	 *            will be used to store the mode.
-	 * @param target
-	 * @param version
-	 * @param translatorFilter
-	 * @return
-	 */
-	public static final Translator getNextChild(Translator translator, int startHint, int[] hints, EObject target, int version, TranslatorFilter translatorFilter) {
-
-		Translator result = null;
-
-		int index = startHint;
-		Translator children[] = null;
-
-		switch (hints[MODE_HINT_INDX]) {
-			case STANDARD_TRANSLATORS_MODE :
-				children = translator.getChildren(target, version);
-				if (children != null && startHint < children.length) {
-
-					/* Look for the next Attribute Translator */
-					index = translatorFilter.scanNextTranslator(children, index);
-
-					if (index >= 0) {
-						/*
-						 * If found, (1) update the result, (2) update the index so we can skip
-						 * ahead on the next invocation (3) escape the VARIABLE_TRANSLATORS
-						 * processing
-						 */
-						result = children[index];
-						break;
-					}
-					/*
-					 * DO NOT BREAK we will default to VARIABLE TRANSLATORS MODE so we must reset
-					 * the startHint appropriately
-					 */
-					startHint = -1;
-				}
-
-			case VARIABLE_TRANSLATORS_MODE :
-				hints[MODE_HINT_INDX] = VARIABLE_TRANSLATORS_MODE;
-				/*
-				 * Reset the index.
-				 */
-				index = startHint;
-				children = translator.getVariableChildren(target, version);
-				if (children != null && children.length > 0 && startHint < children.length) {
-					index = translatorFilter.scanNextTranslator(children, index);
-					result = (index >= 0) ? children[index] : null;
-				}
-		}
-
-		hints[NEXT_START_HINT_INDX] = (result == null && children != null) ? children.length : index;
-
-		return result;
-	}
-
-
-	public abstract int scanNextTranslator(Translator[] children, int start);
-
-	/**
-	 * @return
-	 */
-	public int getIndex() {
-		return index;
-	}
-
-	/**
-	 * @return
-	 */
-	public int getMode() {
-		return mode;
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorPath.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorPath.java
deleted file mode 100644
index a2d843e..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorPath.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.resource;
-
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-
-public class TranslatorPath {
-	protected Translator[] mapInfoPath;
-
-	/**
-	 * Construct with an array of Translator that specifies the path to follow from an object to
-	 * another object
-	 */
-	public TranslatorPath(Translator[] path) {
-		mapInfoPath = path;
-	}
-
-	public List findObjects(EObject startObject) {
-		Object cur = startObject;
-		for (int i = 0; i < mapInfoPath.length; i++) {
-			Translator curMap = mapInfoPath[i];
-			if (cur instanceof EObject) {
-				EStructuralFeature curAttr = curMap.getFeature();
-				if (curAttr == Translator.CONTAINER_FEATURE) {
-					curAttr = ((EObject) cur).eContainmentFeature();
-					cur = ((EObject) cur).eContainer();
-				} else if (curAttr == Translator.ROOT_FEATURE) {
-					cur = ((TranslatorResource) startObject.eResource()).getRootObject();
-				} else {
-					cur = ((EObject) cur).eGet(curAttr);
-				}
-				if (curMap.isMultiValued()) {
-					return (List) cur;
-				}
-			}
-		}
-		return null;
-	}
-
-	public Object findObject(EObject startObject, Object matchValue) {
-		List objects = findObjects(startObject);
-		if (objects == null)
-			return null;
-		return findObject(objects, getLastMap(), matchValue);
-	}
-
-	private Object findObject(List objectList, Translator map, Object matchValue) {
-		for (Iterator iter = objectList.iterator(); iter.hasNext();) {
-			EObject mofObject = (EObject) iter.next();
-			Object curMatchValue = mofObject.eGet(map.getFeature());
-			if (matchValue.equals(curMatchValue))
-				return mofObject;
-		}
-		return null;
-	}
-
-	public Translator getLastMap() {
-		return mapInfoPath[mapInfoPath.length - 1];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer sb = new StringBuffer();
-		String cn = getClass().getName();
-		int i = cn.lastIndexOf('.');
-		cn = cn.substring(++i, cn.length());
-		sb.append(cn);
-		sb.append('(');
-		sb.append(mapInfoPath[0]);
-		for (int j = 1; j < mapInfoPath.length; j++) {
-			sb.append('\n');
-			sb.append(mapInfoPath[j]);
-		}
-		sb.append(')');
-		return sb.toString();
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorResource.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorResource.java
deleted file mode 100644
index 32c9c47..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorResource.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.resource;
-
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.EStructuralFeatureImpl;
-import org.xml.sax.EntityResolver;
-
-public interface TranslatorResource extends ReferencedResource {
-	/*
-	 * must make a subclass because the constructor for EStructuralFeature is protected
-	 */
-	static class DocTypeFeature extends EStructuralFeatureImpl {
-		protected DocTypeFeature() {
-			super();
-		}
-	}
-
-
-	EStructuralFeature DOC_TYPE_FEATURE = new DocTypeFeature();
-
-	/**
-	 * The public id of the XML document, if specified.
-	 */
-	String getPublicId();
-
-	/**
-	 * Return the first element in the EList.
-	 */
-	EObject getRootObject();
-
-	/**
-	 * The system id of the XML document, if specified.
-	 */
-	String getSystemId();
-
-	/**
-	 * Sets the public id and system id of the XML document.
-	 */
-	void setDoctypeValues(String publicId, String systemId);
-
-	/**
-	 * Sets the default public/system ids if necessary
-	 */
-	void setDefaults();
-
-	/**
-	 * Returns the name that will be in the document type header of the serialized xml file
-	 */
-	String getDoctype();
-
-	/**
-	 * Returns the XML version of this document
-	 */
-	String getXMLVersion();
-
-	Translator getRootTranslator();
-
-	/**
-	 * Entity resolver that can be used when using standard parsers to read the resource
-	 */
-	EntityResolver getEntityResolver();
-
-	boolean usesDTD();
-
-	public int getVersionID();
-
-	void setVersionID(int i);
-
-	Renderer getRenderer();
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorResourceFactory.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorResourceFactory.java
deleted file mode 100644
index 20a450b..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorResourceFactory.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.resource;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-
-public abstract class TranslatorResourceFactory extends ReferencedXMIFactoryImpl implements RendererFactory.Listener {
-
-	protected RendererFactory rendererFactory;
-	private boolean listeningForUpdates = false;
-
-	/**
-	 * Constructor for TranslatorResourceFactory.
-	 */
-	public TranslatorResourceFactory(RendererFactory aRendererFactory, boolean listeningForUpdates) {
-		super();
-		rendererFactory = aRendererFactory;
-		setListeningForUpdates(listeningForUpdates);
-	}
-
-	/**
-	 * Constructor for TranslatorResourceFactory.
-	 */
-	public TranslatorResourceFactory(RendererFactory aRendererFactory) {
-		this(aRendererFactory, true);
-	}
-
-	public void setListeningForUpdates(boolean shouldBeListeningForUpdates) {
-
-		if (this.listeningForUpdates ^ shouldBeListeningForUpdates) {
-			if (!shouldBeListeningForUpdates)
-				RendererFactory.NotificationEngine.removeListener(this);
-			else
-				RendererFactory.NotificationEngine.addListener(this);
-
-			this.listeningForUpdates = shouldBeListeningForUpdates;
-		}
-	}
-
-	public boolean isListeningForUpdates() {
-		return this.listeningForUpdates;
-	}
-
-	public Resource doCreateResource(URI uri) {
-		Renderer aRenderer = rendererFactory.createRenderer();
-		return createResource(uri, aRenderer);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.RendererFactory.Listener#updateRendererFactory(com.ibm.etools.emf2xml.RendererFactory)
-	 */
-	public void updateRendererFactory(RendererFactory newRendererFactory) {
-		//System.out.println("Updating renderer factory");
-		rendererFactory = newRendererFactory;
-	}
-
-	protected abstract TranslatorResource createResource(URI uri, Renderer aRenderer);
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorResourceImpl.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorResourceImpl.java
deleted file mode 100644
index c65e5a9..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorResourceImpl.java
+++ /dev/null
@@ -1,392 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.resource;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Collection;
-import java.util.Map;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.NotificationImpl;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.EcorePackage;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.resource.impl.ResourceImpl;
-import org.eclipse.wst.common.internal.emf.utilities.StringUtil;
-import org.xml.sax.EntityResolver;
-
-public abstract class TranslatorResourceImpl extends ReferencedXMIResourceImpl implements TranslatorResource {
-	static final public EStructuralFeature ID_FEATURE = EcorePackage.eINSTANCE.getEClass_EIDAttribute();
-	protected static final String DEFAULT_ENCODING = "UTF-8"; //$NON-NLS-1$
-	protected static final String DEFAULT_VERSION = "1.0"; //$NON-NLS-1$
-	protected Renderer renderer;
-	/**
-	 * The public Id to use at the head of the document.
-	 */
-	protected String publicId;
-	/**
-	 * The system Id to use at the head of the document.
-	 */
-	protected String systemId;
-	protected String xmlVersion;
-	// Default the resources to J2EE 1.4
-	protected int versionID;
-
-	/**
-	 * @deprecated since 4/29/2003 - used for compatibility Subclasses should
-	 *             be using the Renderers and translator framework
-	 */
-	public TranslatorResourceImpl() {
-		super();
-	}
-
-	/**
-	 * @deprecated since 4/29/2003 - used for compatibility Subclasses should
-	 *             be using the Renderers and translator framework
-	 */
-	public TranslatorResourceImpl(URI uri) {
-		super(uri);
-	}
-
-	public TranslatorResourceImpl(URI uri, Renderer aRenderer) {
-		super(uri);
-		setRenderer(aRenderer);
-		versionID = getDefaultVersionID();
-	}
-
-	public TranslatorResourceImpl(Renderer aRenderer) {
-		super();
-		setRenderer(aRenderer);
-	}
-
-	public java.lang.String getEncoding() {
-		if (super.getEncoding() == null)
-			setEncoding(DEFAULT_ENCODING);
-		return super.getEncoding();
-	}
-
-	public String getPublicId() {
-		return publicId;
-	}
-
-	/**
-	 * Return the first element in the EList.
-	 */
-	public EObject getRootObject() {
-		if (contents == null || contents.isEmpty())
-			return null;
-		return (EObject) getContents().get(0);
-	}
-
-	public String getSystemId() {
-		return systemId;
-	}
-
-	public void setDoctypeValues(String aPublicId, String aSystemId) {
-		boolean changed = !(StringUtil.stringsEqual(publicId, aPublicId) && StringUtil.stringsEqual(systemId, aSystemId));
-		publicId = aPublicId;
-		systemId = aSystemId;
-		if (changed) {
-			eNotify(new NotificationImpl(Notification.SET, null, null) {
-				public Object getFeature() {
-					return DOC_TYPE_FEATURE;
-				}
-
-				public Object getNotifier() {
-					return TranslatorResourceImpl.this;
-				}
-			});
-		}
-	}
-
-	/**
-	 * Returns the xmlVersion.
-	 * 
-	 * @return String
-	 */
-	public String getXMLVersion() {
-		if (xmlVersion == null)
-			xmlVersion = DEFAULT_VERSION;
-		return xmlVersion;
-	}
-
-	/**
-	 * Sets the xmlVersion.
-	 * 
-	 * @param xmlVersion
-	 *            The xmlVersion to set
-	 */
-	public void setXMLVersion(String xmlVersion) {
-		this.xmlVersion = xmlVersion;
-	}
-
-	protected void basicDoLoad(InputStream inputStream, Map options) throws IOException {
-		// long start = System.currentTimeMillis();
-		boolean isTrackingMods = isTrackingModification();
-		try {
-			if (isTrackingMods)
-				setTrackingModification(false);
-			renderer.doLoad(inputStream, options);
-		}
-		finally {
-			if (isTrackingMods)
-				setTrackingModification(true);
-		}
-		// long end = System.currentTimeMillis();
-		// recordTime("Load", start, end);
-	}
-
-	public void save(Map options) throws IOException {
-		if (renderer.useStreamsForIO()) {
-			super.save(options);
-		}
-		else {
-			// we cast to OutputStream, in preparation for 3.2 code base,
-			// where this doSave call is ambiguous with just "null". 
-			doSave((OutputStream) null, options);
-			notifySaved();
-		}
-	}
-
-	/**
-	 * @see com.ibm.etools.xmi.helpers.CompatibilityXMIResourceImpl#doSave(OutputStream,
-	 *      Map)
-	 */
-	public void doSave(OutputStream outputStream, Map options) throws IOException {
-		// long start = System.currentTimeMillis();
-		renderer.doSave(outputStream, options);
-		setModified(false);
-		// long end = System.currentTimeMillis();
-		// recordTime("Save", start, end);
-	}
-
-	// private void recordTime(String type, long start, long end) {
-	// System.out.println(renderer.getClass().getName() + "\t" + type + "\t" +
-	// (end - start) +
-	// "\t\t\tms" + "\t" + (( this.getVersionID()) / 10.0) + "\t" + this);
-	// //$NON-NLS-1$
-	// //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-	// }
-
-	/**
-	 * @see org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl#doUnload()
-	 */
-	protected void doUnload() {
-		renderer.preUnload();
-		super.doUnload();
-	}
-
-	public String toString() {
-		return getClass().getName() + getURI().toString();
-	}
-
-	/**
-	 * Returns the renderer.
-	 * 
-	 * @return Renderer
-	 */
-	public Renderer getRenderer() {
-		return renderer;
-	}
-
-	/**
-	 * Sets the renderer.
-	 * 
-	 * @param renderer
-	 *            The renderer to set
-	 */
-	public void setRenderer(Renderer renderer) {
-		this.renderer = renderer;
-		if (renderer.getResource() != this)
-			renderer.setResource(this);
-	}
-
-	/**
-	 * For compatibility of old subtype resources, returns the super
-	 * implementation
-	 * 
-	 * @return
-	 */
-	protected EList primGetContents() {
-		return super.getContents();
-	}
-
-	public EList getContents() {
-		if (contents == null) {
-			initializeContents();
-		}
-		return contents;
-	}
-
-	protected void initializeContents() {
-		contents = new ResourceImpl.ContentsEList() {
-			public boolean add(Object object) {
-				renderer.prepareToAddContents();
-				return super.add(object);
-			}
-
-			public boolean addAll(Collection collection) {
-				renderer.prepareToAddContents();
-				return super.addAll(collection);
-			}
-		};
-	}
-
-	public void setDefaults() {
-		if (systemId != null && publicId != null)
-			return;
-		String pubId = publicId == null ? getDefaultPublicId() : publicId;
-		String sysId = systemId == null ? getDefaultSystemId() : systemId;
-		setDoctypeValues(pubId, sysId);
-	}
-
-	/**
-	 * @see org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl#init()
-	 */
-	protected void init() {
-		super.init();
-		setEncoding(DEFAULT_ENCODING);
-	}
-
-	/**
-	 * Returns null by default; subclasses can override
-	 * 
-	 * @see com.ibm.etools.emf2xml.TranslatorResource#createEntityResolver()
-	 */
-	public EntityResolver getEntityResolver() {
-		return null;
-	}
-
-	protected abstract String getDefaultPublicId();
-
-	protected abstract String getDefaultSystemId();
-
-	protected abstract int getDefaultVersionID();
-
-	/**
-	 * @return
-	 */
-	public int getVersionID() {
-		return versionID;
-	}
-
-	/**
-	 * @param i
-	 */
-	public void setVersionID(int i) {
-		versionID = i;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.TranslatorResource#usesDTD()
-	 */
-	public boolean usesDTD() {
-		return getPublicId() != null && getSystemId() != null;
-	}
-
-	/**
-	 * Overridden to notify when the ID gets set; need this to push it into
-	 * the resource
-	 * 
-	 * @see org.eclipse.emf.ecore.xmi.XMLResource#setID(EObject, String)
-	 */
-	public void setID(EObject eObject, String id) {
-		String oldId = getID(eObject);
-		super.setID(eObject, id);
-		eObject.eNotify(new ENotificationImpl((InternalEObject) eObject, Notification.SET, ID_FEATURE, oldId, id));
-	}
-
-	/**
-	 * This method indicates whether or not the extent associated with the
-	 * resource has been modified since the last time it was loaded or saved.
-	 * 
-	 * @return boolean
-	 */
-	public boolean isModified() {
-		return super.isModified() || renderer.isModified();
-	}
-
-	/*
-	 * Overriden to give the renderer a hook
-	 * 
-	 * @see org.eclipse.wst.common.internal.emf.resource.ReferencedResource#accessForWrite()
-	 */
-	public void accessForWrite() {
-		renderer.accessForWrite();
-		super.accessForWrite();
-	}
-
-	/*
-	 * Overriden to give the renderer a hook
-	 * 
-	 * @see org.eclipse.wst.common.internal.emf.resource.ReferencedResource#accessForRead()
-	 */
-	public void accessForRead() {
-		renderer.accessForRead();
-		super.accessForRead();
-	}
-
-	public void releaseFromRead() {
-		renderer.releaseFromRead();
-		super.releaseFromRead();
-	}
-
-	public void releaseFromWrite() {
-		renderer.releaseFromWrite();
-		super.releaseFromWrite();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf.workbench.ReferencedXMIResourceImpl#preDelete()
-	 */
-	public void preDelete() {
-		super.preDelete();
-		renderer.preDelete();
-	}
-
-	public boolean isShared() {
-		return super.isShared() || renderer.isShared();
-	}
-
-	public boolean isSharedForWrite() {
-		return super.isSharedForWrite() || renderer.isSharedForWrite();
-	}
-
-	public boolean isLoaded() {
-		synchronized (this) {
-			return super.isLoaded();
-		}
-	}
-
-	public void load(Map options) throws IOException {
-		synchronized (this) {
-			if (isLoaded)
-				return;
-			// System.out.println(Thread.currentThread() + "
-			// TranslatorResource.load(): " + this);
-			if (renderer.useStreamsForIO()) {
-				super.load(options);
-			}
-			else if (!isLoaded) {
-				load((InputStream) null, options);
-			}
-		}
-
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/UnsupportedFeature.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/UnsupportedFeature.java
deleted file mode 100644
index 43c5864..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/UnsupportedFeature.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Apr 13, 2004
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-package org.eclipse.wst.common.internal.emf.resource;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.EAttributeImpl;
-
-/**
- * @author cbridgha
- * 
- * TODO To change the template for this generated type comment go to Window - Preferences - Java -
- * Code Generation - Code and Comments
- */
-public class UnsupportedFeature extends EAttributeImpl {
-	/**
-	 * This is used to capture features that are no longer supported
-	 */
-	public static boolean isUnsupported(EClass anEClass, String featureName) {
-
-		if (featureName.equals("isZeroParams") && anEClass.getName().equals("MethodElement")) //$NON-NLS-1$ //$NON-NLS-2$
-			return true;
-		return false;
-	}
-
-	public UnsupportedFeature() {
-		super();
-		// TODO Auto-generated constructor stub
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/VariableTranslatorFactory.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/VariableTranslatorFactory.java
deleted file mode 100644
index 1a4eef9..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/VariableTranslatorFactory.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Aug 20, 2003
- *
- */
-package org.eclipse.wst.common.internal.emf.resource;
-
-import java.util.List;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-
-
-/**
- * @author schacher
- */
-public interface VariableTranslatorFactory {
-	/** Returns whether a Translator should be created for the given DOM name */
-	boolean accepts(String domName);
-
-	/** Returns whether a Translator should be created for the given feature */
-	boolean accepts(Notification notif);
-
-	Translator create(Notification notif);
-
-	/** Creates a new Translator for the DOM name */
-	Translator create(String domName);
-
-	/** Creates variable translators for an EMF object to be rendered */
-	List create(Notifier target);
-
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/XMLEncoderDecoder.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/XMLEncoderDecoder.java
deleted file mode 100644
index 9f46962..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/XMLEncoderDecoder.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on May 20, 2004
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-package org.eclipse.wst.common.internal.emf.resource;
-
-/**
- * @author mdelder
- *  
- */
-public class XMLEncoderDecoder {
-
-	/**
-	 *  
-	 */
-	public XMLEncoderDecoder() {
-		super();
-	}
-
-	/**
-	 * Identifies the last printable character in the Unicode range that is supported by the
-	 * encoding used with this serializer. For 8-bit encodings this will be either 0x7E or 0xFF. For
-	 * 16-bit encodings this will be 0xFFFF. Characters that are not printable will be escaped using
-	 * character references.
-	 */
-	private int _lastPrintable = 0x7E;
-
-	protected static XMLEncoderDecoder _singleton;
-
-
-	/**
-	 * Returns a decoded version of the value.
-	 */
-	public String decode(String value) {
-		// NOT_IMPLEMENTED
-		return value;
-	}
-
-
-	/**
-	 * Escapes a string so it may be printed as text content or attribute value. Non printable
-	 * characters are escaped using character references. Where the format specifies a deault entity
-	 * reference, that reference is used (e.g. <tt>&amp;lt;</tt>).
-	 * 
-	 * @param source
-	 *            The string to escape
-	 */
-	public char[] encode(char[] value) {
-		boolean unmodified = true;
-		StringBuffer sbuf = new StringBuffer(value.length);
-		String charRef = null;
-		char ch;
-		for (int i = 0; i < value.length; ++i) {
-			ch = value[i];
-			// If there is a suitable entity reference for this
-			// character, print it. The list of available entity
-			// references is almost but not identical between
-			// XML and HTML.
-			charRef = getEntityRef(ch);
-			if (charRef != null) {
-				sbuf.append('&');
-				sbuf.append(charRef);
-				sbuf.append(';');
-				unmodified = false;
-			} else if ((ch >= ' ' && ch <= _lastPrintable && ch != 0xF7) || ch == '\n' || ch == '\r' || ch == '\t') {
-				// If the character is not printable, print as character
-				// reference.
-				// Non printables are below ASCII space but not tab or line
-				// terminator, ASCII delete, or above a certain Unicode
-				// threshold.
-				sbuf.append(ch);
-			} else {
-				sbuf.append("&#");//$NON-NLS-1$
-				sbuf.append(Integer.toString(ch));
-				sbuf.append(';');
-				unmodified = false;
-			}
-		}
-		if (unmodified)
-			return value;
-		char[] result = new char[sbuf.length()];
-		sbuf.getChars(0, sbuf.length(), result, 0);
-		return result;
-	}
-
-	/**
-	 * Escapes a string so it may be printed as text content or attribute value. Non printable
-	 * characters are escaped using character references. Where the format specifies a deault entity
-	 * reference, that reference is used (e.g. <tt>&amp;lt;</tt>).
-	 * 
-	 * @param source
-	 *            The string to escape
-	 */
-	public String encode(String value) {
-		StringBuffer sbuf = new StringBuffer(value.length());
-		String charRef = null;
-		char ch;
-		for (int i = 0; i < value.length(); ++i) {
-			ch = value.charAt(i);
-			// If there is a suitable entity reference for this
-			// character, print it. The list of available entity
-			// references is almost but not identical between
-			// XML and HTML.
-			charRef = getEntityRef(ch);
-			if (charRef != null) {
-				sbuf.append('&');
-				sbuf.append(charRef);
-				sbuf.append(';');
-			} else if ((ch >= ' ' && ch <= _lastPrintable && ch != 0xF7) || ch == '\n' || ch == '\r' || ch == '\t') {
-				// If the character is not printable, print as character
-				// reference.
-				// Non printables are below ASCII space but not tab or line
-				// terminator, ASCII delete, or above a certain Unicode
-				// threshold.
-				sbuf.append(ch);
-			} else {
-				sbuf.append("&#");//$NON-NLS-1$
-				sbuf.append(Integer.toString(ch));
-				sbuf.append(';');
-			}
-		}
-		return sbuf.toString();
-	}
-
-	public static String escape(String value) {
-		if (_singleton == null) {
-			_singleton = new XMLEncoderDecoder();
-		}
-		return _singleton.encode(value);
-	}
-
-	/**
-	 * Returns the suitable entity reference for this character value, or null if no such entity
-	 * exists. Calling this method with <tt>'&amp;'</tt> will return <tt>"&amp;amp;"</tt>.
-	 * 
-	 * @param ch
-	 *            Character value
-	 * @return Character entity name, or null
-	 */
-	protected String getEntityRef(char ch) {
-		// Encode special XML characters into the equivalent character
-		// references.
-		// These five are defined by default for all XML documents.
-		switch (ch) {
-			case '<' :
-				return "lt";//$NON-NLS-1$
-			case '>' :
-				return "gt";//$NON-NLS-1$
-			case '"' :
-				return "quot";//$NON-NLS-1$
-			case '\'' :
-				return "apos";//$NON-NLS-1$
-			case '&' :
-				return "amp";//$NON-NLS-1$
-		}
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/AdapterFactoryDescriptor.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/AdapterFactoryDescriptor.java
deleted file mode 100644
index a852031..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/AdapterFactoryDescriptor.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-
-public interface AdapterFactoryDescriptor {
-
-	public AdapterFactory createAdapterFactory();
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/AdapterFactoryUtil.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/AdapterFactoryUtil.java
deleted file mode 100644
index 706f9ea..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/AdapterFactoryUtil.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notifier;
-
-public class AdapterFactoryUtil {
-
-	/**
-	 * Constructor for AdapterFactoryUtil.
-	 */
-	public AdapterFactoryUtil() {
-		super();
-	}
-
-	public static void adaptNew(Notifier newObject, List factories) {
-		AdapterFactory fact;
-		for (int i = 0; i < factories.size(); i++) {
-			fact = (AdapterFactory) factories.get(i);
-			fact.adaptNew(newObject, null);
-		}
-	}
-
-	public static void createAdapterFactories(List descriptors, List factories) {
-		AdapterFactoryDescriptor desc;
-		AdapterFactory adapterFact;
-		for (int i = 0; i < descriptors.size(); i++) {
-			desc = (AdapterFactoryDescriptor) descriptors.get(i);
-			adapterFact = desc.createAdapterFactory();
-			if (adapterFact != null)
-				factories.add(adapterFact);
-		}
-		descriptors.clear();
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ArrayUtil.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ArrayUtil.java
deleted file mode 100644
index 847b88d..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ArrayUtil.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-
-
-public class ArrayUtil {
-
-	public static Object[] concat(Object[] array1, Object[] array2) {
-		Class componentType = null;
-		if (array1.getClass().getComponentType() == array2.getClass().getComponentType())
-			componentType = array1.getClass().getComponentType();
-		else
-			componentType = Object.class;
-
-		return concat(array1, array2, componentType);
-	}
-
-	public static Object[] concat(Object[] array1, Object[] array2, Class componentType) {
-		Object[] result = (Object[]) java.lang.reflect.Array.newInstance(componentType, array1.length + array2.length);
-		System.arraycopy(array1, 0, result, 0, array1.length);
-		System.arraycopy(array2, 0, result, array1.length, array2.length);
-		return result;
-	}
-
-	public static Object[] concatAll(java.util.List arrays, Class componentType) {
-		int resultLength = 0;
-		for (int i = 0; i < arrays.size(); i++) {
-			resultLength += ((Object[]) arrays.get(i)).length;
-		}
-		Object[] result = (Object[]) java.lang.reflect.Array.newInstance(componentType, resultLength);
-		int pos = 0;
-		for (int i = 0; i < arrays.size(); i++) {
-			Object[] array = (Object[]) arrays.get(i);
-			System.arraycopy(array, 0, result, pos, array.length);
-			pos += array.length;
-		}
-		return result;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/Assert.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/Assert.java
deleted file mode 100644
index b375851..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/Assert.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-import org.eclipse.jem.util.logger.proxy.Logger;
-
-
-
-/**
- * <code>Assert</code> is useful for for embedding runtime sanity checks in code. The predicate
- * methods all test a condition and throw some type of unchecked exception if the condition does not
- * hold.
- * <p>
- * Assertion failure exceptions, like most runtime exceptions, are thrown when something is
- * misbehaving. Assertion failures are invariably unspecified behavior; consequently, clients should
- * never rely on these being thrown (and certainly should not being catching them specifically).
- * </p>
- */
-// This class was, originally, copied directly from com.ibm.itp.common.
-// It was copied to our own package just to minimize minor dependencies
-// on other packages and internal APIs.
-public final class Assert {
-	/* This class is not intended to be instantiated. */
-
-	private Assert() {
-	}
-
-	/**
-	 * Asserts that an argument is legal. If the given boolean is not <code>true</code>, an
-	 * <code>IllegalArgumentException</code> is thrown.
-	 * 
-	 * @param expression
-	 *            the outcode of the check
-	 * @return <code>true</code> if the check passes (does not return if the check fails)
-	 * @exception IllegalArgumentException
-	 *                if the legality test failed
-	 */
-	public static boolean isLegal(boolean expression) {
-		return isLegal(expression, "");//$NON-NLS-1$
-	}
-
-	/**
-	 * Asserts that an argument is legal. If the given boolean is not <code>true</code>, an
-	 * <code>IllegalArgumentException</code> is thrown. The given message is included in that
-	 * exception, to aid debugging.
-	 * 
-	 * @param expression
-	 *            the outcode of the check
-	 * @param message
-	 *            the message to include in the exception
-	 * @return <code>true</code> if the check passes (does not return if the check fails)
-	 * @exception IllegalArgumentException
-	 *                if the legality test failed
-	 */
-	public static boolean isLegal(boolean expression, String message) {
-		if (!expression)
-			throw new IllegalArgumentException();
-		return expression;
-	}
-
-	/**
-	 * Asserts that the given object is not <code>null</code>. If this is not the case, some kind
-	 * of unchecked exception is thrown.
-	 * 
-	 * @param object
-	 *            the value to test
-	 * @exception IllegalArgumentException
-	 *                if the object is <code>null</code>
-	 */
-	public static void isNotNull(Object object) {
-		isNotNull(object, "");//$NON-NLS-1$
-	}
-
-	/**
-	 * Asserts that the given object is not <code>null</code>. If this is not the case, some kind
-	 * of unchecked exception is thrown. The given message is included in that exception, to aid
-	 * debugging.
-	 * 
-	 * @param object
-	 *            the value to test
-	 * @param message
-	 *            the message to include in the exception
-	 * @exception IllegalArgumentException
-	 *                if the object is <code>null</code>
-	 */
-	public static void isNotNull(Object object, String message) {
-		if (object == null) {
-			Logger.getLogger().logError("null_argument: " + message);//$NON-NLS-1$
-			throw new AssertionFailedException();
-		}
-	}
-
-	/**
-	 * Asserts that the given boolean is <code>true</code>. If this is not the case, some kind of
-	 * unchecked exception is thrown.
-	 * 
-	 * @param expression
-	 *            the outcode of the check
-	 * @return <code>true</code> if the check passes (does not return if the check fails)
-	 */
-	public static boolean isTrue(boolean expression) {
-		return isTrue(expression, "");//$NON-NLS-1$
-	}
-
-	/**
-	 * Asserts that the given boolean is <code>true</code>. If this is not the case, some kind of
-	 * unchecked exception is thrown. The given message is included in that exception, to aid
-	 * debugging.
-	 * 
-	 * @param expression
-	 *            the outcode of the check
-	 * @param message
-	 *            the message to include in the exception
-	 * @return <code>true</code> if the check passes (does not return if the check fails)
-	 */
-	public static boolean isTrue(boolean expression, String message) {
-		if (!expression) {
-			Logger.getLogger().logError("assertion failed: " + message);//$NON-NLS-1$
-			throw new AssertionFailedException();
-		}
-		return expression;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/AssertionFailedException.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/AssertionFailedException.java
deleted file mode 100644
index 044c60d..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/AssertionFailedException.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-
-/**
- * <code>AssertionFailedException</code> is a runtime exception thrown by some of the methods in
- * <code>Assert</code>.
- * <p>
- * This class is not declared public to prevent some misuses; programs that catch or otherwise
- * depend on assertion failures are susceptible to unexpected breakage when assertions in the code
- * are added or removed.
- * </p>
- */
-// This class was, originally, copied directly from com.ibm.itp.common.
-// It was copied to our own package just to minimize minor dependencies
-// on other packages and internal APIs.
-class AssertionFailedException extends RuntimeException {
-	/**
-	 * Constructs a new exception.
-	 */
-	public AssertionFailedException() {
-	}
-
-	/**
-	 * Constructs a new exception with the given message.
-	 */
-	public AssertionFailedException(String detail) {
-		super(detail);
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/Association.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/Association.java
deleted file mode 100644
index 485d0c3..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/Association.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-/**
- * Insert the type's description here. Creation date: (12/17/2000 7:38:15 PM)
- * 
- * @author: Administrator
- */
-public class Association {
-	protected Object key;
-	protected Object value;
-
-	/**
-	 * Association constructor comment.
-	 */
-	public Association(Object aKey, Object aValue) {
-		setKey(aKey);
-		setValue(aValue);
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (12/17/2000 7:38:48 PM)
-	 * 
-	 * @return java.lang.Object
-	 */
-	public java.lang.Object getKey() {
-		return key;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (12/17/2000 7:38:48 PM)
-	 * 
-	 * @return java.lang.Object
-	 */
-	public java.lang.Object getValue() {
-		return value;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (12/17/2000 7:38:48 PM)
-	 * 
-	 * @param newKey
-	 *            java.lang.Object
-	 */
-	public void setKey(java.lang.Object newKey) {
-		key = newKey;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (12/17/2000 7:38:48 PM)
-	 * 
-	 * @param newValue
-	 *            java.lang.Object
-	 */
-	public void setValue(java.lang.Object newValue) {
-		value = newValue;
-	}
-}
-
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/CloneablePublic.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/CloneablePublic.java
deleted file mode 100644
index b243775..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/CloneablePublic.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Sep 22, 2003
- *
- */
-package org.eclipse.wst.common.internal.emf.utilities;
-
-/**
- * Interface that exposes the clone method, for objects that need to generically copy other
- * cloneable objects
- */
-public interface CloneablePublic extends Cloneable {
-	Object clone();
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/CommandContext.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/CommandContext.java
deleted file mode 100644
index 913139c..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/CommandContext.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Apr 27, 2004
- */
-package org.eclipse.wst.common.internal.emf.utilities;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-
-
-
-/**
- * @author John Mourra
- */
-public class CommandContext implements ICommandContext {
-
-	private IProgressMonitor monitor;
-	private Map properties;
-	private ResourceSet resourceSet;
-
-	/**
-	 * @param monitor
-	 */
-	public CommandContext(IProgressMonitor monitor) {
-		this(monitor, null, null);
-	}
-
-	/**
-	 * @param monitor
-	 * @param configurationProperties
-	 * @param resourceSet
-	 */
-	public CommandContext(IProgressMonitor monitor, Map configurationProperties, ResourceSet resourceSet) {
-		this.monitor = monitor;
-		this.properties = configurationProperties;
-		this.resourceSet = resourceSet;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.ws.rd.command.framework.ICommandContext#getProgressMonitor()
-	 */
-	public IProgressMonitor getProgressMonitor() {
-		if (monitor == null)
-			monitor = new NullProgressMonitor();
-		return monitor;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.ws.rd.command.framework.ICommandContext#getConfigurationProperties()
-	 */
-	public Map getConfigurationProperties() {
-		if (properties == null)
-			properties = new HashMap();
-		return properties;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.ws.rd.command.framework.ICommandContext#getResourceSet()
-	 */
-	public ResourceSet getResourceSet() {
-		if (resourceSet == null)
-			resourceSet = new ResourceSetImpl();
-		return resourceSet;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/CopyGroup.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/CopyGroup.java
deleted file mode 100644
index 79b3b1e..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/CopyGroup.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-
-/**
- * This class is used to copy a group of RefObjects and/or Resources. This group will ensure that
- * all non-composite relationships are deferred until all Resources and RefObjects are copied. This
- * allows you to make copies of a group of objects that may have non-composite relationships and
- * ensure that these relationships are pointing to the copied object if it is part of the group
- * (either directly or through a containment relationship). Creation date: (12/17/2000 1:21:17 PM)
- * 
- * @author: Administrator
- */
-public class CopyGroup {
-	protected String defaultIdSuffix;
-	protected ResourceSet copyContext;
-	protected List resources;
-	protected List refObjects;
-	protected List copiedResources;
-	protected List copiedRefObjects;
-	protected boolean preserveIds = false;
-
-	/**
-	 * CopyGroup constructor comment.
-	 */
-	public CopyGroup() {
-		super();
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (12/17/2000 1:28:16 PM)
-	 * 
-	 * @param aRefObject
-	 *            org.eclipse.emf.ecore.EObject
-	 */
-	public boolean add(EObject aRefObject) {
-		return add(aRefObject, null);
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (12/17/2000 1:28:16 PM)
-	 * 
-	 * @param aRefObject
-	 *            org.eclipse.emf.ecore.EObject
-	 */
-	public boolean add(EObject aRefObject, String idSuffix) {
-		if (aRefObject != null && !containsRefObject(aRefObject)) {
-			getRefObjects().add(createAssociation(aRefObject, idSuffix));
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (12/17/2000 1:27:32 PM)
-	 * 
-	 * @param aResources
-	 *            org.eclipse.emf.ecore.resource.Resource
-	 */
-	public void add(Resource aResource) {
-		add(aResource, null);
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (12/17/2000 1:27:32 PM)
-	 * 
-	 * @param aResources
-	 *            org.eclipse.emf.ecore.resource.Resource
-	 */
-	public void add(Resource aResource, String newUri) {
-		if (aResource != null)
-			getResources().add(createAssociation(aResource, newUri));
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (12/17/2000 1:28:16 PM)
-	 * 
-	 * @param aRefObject
-	 *            org.eclipse.emf.ecore.EObject
-	 */
-	public void addCopied(EObject aRefObject) {
-		if (aRefObject != null)
-			getCopiedRefObjects().add(aRefObject);
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (12/17/2000 1:27:32 PM)
-	 * 
-	 * @param aResources
-	 *            org.eclipse.emf.ecore.resource.Resource
-	 */
-	public void addCopied(Resource aResource) {
-		if (aResource != null) {
-			getCopiedResources().add(aResource);
-			if (getCopyContext() != null)
-				getCopyContext().getResources().add(aResource);
-		}
-	}
-
-	protected boolean contains(List associations, Object anObject) {
-		if (anObject == null)
-			return false;
-		int size = associations.size();
-		Association assoc;
-		for (int i = 0; i < size; i++) {
-			assoc = (Association) associations.get(i);
-			if (assoc.getKey() == anObject)
-				return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Return true if
-	 * 
-	 * @aRefObject has been added to this group. Creation date: (12/17/2000 1:28:16 PM)
-	 * @param aRefObject
-	 *            org.eclipse.emf.ecore.EObject
-	 */
-	public boolean containsRefObject(EObject aRefObject) {
-		return contains(getRefObjects(), aRefObject);
-	}
-
-	/**
-	 * Return true if
-	 * 
-	 * @aResource has been added to this group. Creation date: (12/17/2000 1:28:16 PM)
-	 * @param aRefObject
-	 *            org.eclipse.emf.ecore.EObject
-	 */
-	public boolean containsResource(Resource aResource) {
-		return contains(getResources(), aResource);
-	}
-
-	private Association createAssociation(Object key, Object value) {
-		return new Association(key, value);
-	}
-
-	/**
-	 * Returns a List of RefObjects that were copied. Creation date: (12/17/2000 1:25:46 PM)
-	 * 
-	 * @return java.util.List
-	 */
-	public java.util.List getCopiedRefObjects() {
-		if (copiedRefObjects == null)
-			copiedRefObjects = new ArrayList();
-		return copiedRefObjects;
-	}
-
-	/**
-	 * Returns a List of Resources that were copied. Creation date: (12/17/2000 1:25:46 PM)
-	 * 
-	 * @return java.util.List
-	 */
-	public java.util.List getCopiedResources() {
-		if (copiedResources == null)
-			copiedResources = new ArrayList();
-		return copiedResources;
-	}
-
-	/**
-	 * The context to add all copied resources into. Creation date: (12/17/2000 8:09:45 PM)
-	 * 
-	 * @return org.eclipse.emf.ecore.resource.ResourceSet
-	 */
-	public org.eclipse.emf.ecore.resource.ResourceSet getCopyContext() {
-		return copyContext;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (12/17/2000 1:44:43 PM)
-	 * 
-	 * @return java.lang.String
-	 */
-	public java.lang.String getDefaultIdSuffix() {
-		return defaultIdSuffix;
-	}
-
-	/**
-	 * Should the id be copied in the case where no suffix is specified? Defaults to false
-	 */
-	public boolean getPreserveIds() {
-		return preserveIds;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (12/17/2000 1:25:46 PM)
-	 * 
-	 * @return java.util.List
-	 */
-	public java.util.List getRefObjects() {
-		if (refObjects == null)
-			refObjects = new ArrayList();
-		return refObjects;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (12/17/2000 1:25:46 PM)
-	 * 
-	 * @return java.util.List
-	 */
-	public java.util.List getResources() {
-		if (resources == null)
-			resources = new ArrayList();
-		return resources;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (12/17/2000 1:25:46 PM)
-	 * 
-	 * @return java.util.List
-	 */
-	public java.util.List primGetRefObjects() {
-		return refObjects;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (12/17/2000 1:25:46 PM)
-	 * 
-	 * @return java.util.List
-	 */
-	public java.util.List primGetResources() {
-		return resources;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (12/17/2000 1:28:16 PM)
-	 * 
-	 * @param aRefObject
-	 *            org.eclipse.emf.ecore.EObject
-	 * @return boolean
-	 */
-	public boolean remove(EObject aRefObject) {
-		if (aRefObject != null && primGetRefObjects() != null) {
-			Iterator it = primGetRefObjects().iterator();
-			Association association;
-			while (it.hasNext()) {
-				association = (Association) it.next();
-				if (association.getKey() == aRefObject)
-					return primGetRefObjects().remove(association);
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (12/17/2000 1:27:32 PM)
-	 * 
-	 * @param aResources
-	 *            org.eclipse.emf.ecore.resource.Resource
-	 * @return boolean
-	 */
-	public boolean remove(Resource aResource) {
-		if (aResource != null && primGetResources() != null) {
-			Iterator it = primGetResources().iterator();
-			Association association;
-			while (it.hasNext()) {
-				association = (Association) it.next();
-				if (association.getKey() == aResource)
-					return primGetResources().remove(association);
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Set the context to add all copied resources into. Creation date: (12/17/2000 8:09:45 PM)
-	 * 
-	 * @param newCopyContext
-	 *            org.eclipse.emf.ecore.resource.Context
-	 */
-	public void setCopyContext(org.eclipse.emf.ecore.resource.ResourceSet newCopyContext) {
-		copyContext = newCopyContext;
-	}
-
-	/**
-	 * If an ID suffix is not defined for a EObject that is to be copied, this value will be used.
-	 * Creation date: (12/17/2000 1:44:43 PM)
-	 * 
-	 * @param newDefaultIdSuffix
-	 *            java.lang.String
-	 */
-	public void setDefaultIdSuffix(java.lang.String newDefaultIdSuffix) {
-		defaultIdSuffix = newDefaultIdSuffix;
-	}
-
-	/**
-	 * Should the id be copied in the case where no suffix is specified?
-	 */
-	public void setPreserveIds(boolean value) {
-		preserveIds = value;
-	}
-
-	/**
-	 * Subclasses should override this method if they require additional processing after the group
-	 * has been copied.
-	 * 
-	 * @param copyUtil
-	 */
-	public void postCopy(EtoolsCopyUtility copyUtil) {
-	}
-
-}
-
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DOMLoadOptions.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DOMLoadOptions.java
deleted file mode 100644
index 05ae8a5..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DOMLoadOptions.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Mar 12, 2003
- *
- * To change this generated comment go to 
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
-package org.eclipse.wst.common.internal.emf.utilities;
-
-/**
- * @author schacher
- * 
- * To change this generated comment go to Window>Preferences>Java>Code Generation>Code and Comments
- */
-public class DOMLoadOptions {
-	protected boolean validate;
-	protected boolean allowJavaEncodings;
-	protected boolean expandEntityRefererences;
-
-	/**
-	 * @return boolean
-	 */
-	public boolean isAllowJavaEncodings() {
-		return allowJavaEncodings;
-	}
-
-	/**
-	 * @return boolean
-	 */
-	public boolean isExpandEntityRefererences() {
-		return expandEntityRefererences;
-	}
-
-	/**
-	 * @return boolean
-	 */
-	public boolean isValidate() {
-		return validate;
-	}
-
-	/**
-	 * Sets the allowJavaEncodings.
-	 * 
-	 * @param allowJavaEncodings
-	 *            The allowJavaEncodings to set
-	 */
-	public void setAllowJavaEncodings(boolean allowJavaEncodings) {
-		this.allowJavaEncodings = allowJavaEncodings;
-	}
-
-	/**
-	 * Sets the expandEntityRefererences.
-	 * 
-	 * @param expandEntityRefererences
-	 *            The expandEntityRefererences to set
-	 */
-	public void setExpandEntityRefererences(boolean expandEntityRefererences) {
-		this.expandEntityRefererences = expandEntityRefererences;
-	}
-
-	/**
-	 * Sets the validate.
-	 * 
-	 * @param validate
-	 *            The validate to set
-	 */
-	public void setValidate(boolean validate) {
-		this.validate = validate;
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DOMUtilities.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DOMUtilities.java
deleted file mode 100644
index 7eeac6c..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DOMUtilities.java
+++ /dev/null
@@ -1,680 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-import org.xml.sax.EntityResolver;
-import org.xml.sax.ErrorHandler;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-
-/**
- * A class containing common dom manipulation and search functions.
- */
-public class DOMUtilities {
-	// Handy Constants
-	public static final String INDENT_STRING = "\t"; //$NON-NLS-1$
-	public static final String NEWLINE_STRING = System.getProperty("line.separator"); //$NON-NLS-1$
-	//Hack to be removed when the DOM apis change such that there is an easier
-	//way to fluff up and set the doctype
-	private static final String DUMMY_ENTITY_STRING = "dummy"; //$NON-NLS-1$
-	private static final String DUMMY_ENTITY_NODE_STRING = "<dummy/>"; //$NON-NLS-1$
-	private static DocumentBuilder defaultDocumentBuilder;
-	private static EntityResolver defaultEntityResolver;
-
-	/**
-	 * Returns an iterator that iterates over the sub nodes of a path.
-	 */
-	static public Iterator createPathIterator(String path) {
-		String tPath = path.startsWith("/") ? path.substring(1) : path; //$NON-NLS-1$
-		if (tPath.length() == 0)
-			tPath = null;
-		final String aPath = tPath;
-
-		return new Iterator() {
-			int prevIndex = 0;
-			int curIndex = 0;
-			String pathString = aPath;
-
-			public boolean hasNext() {
-				return pathString != null && prevIndex != -1;
-			}
-
-			public Object next() {
-				curIndex = pathString.indexOf('/', prevIndex);
-				String nodeString = null;
-				if (curIndex != -1)
-					nodeString = pathString.substring(prevIndex, curIndex++);
-				else
-					nodeString = pathString.substring(prevIndex);
-				prevIndex = curIndex;
-				return nodeString;
-			}
-
-			public void remove() {
-				throw new UnsupportedOperationException();
-			}
-		};
-	}
-
-	/**
-	 * Get the text for the passed in node.
-	 */
-	static public String getChildText(Node node) {
-		Text textNode = getChildTextNode(node);
-		if (textNode != null)
-			return textNode.getData();
-		return null;
-	}
-
-	/**
-	 * Get the text for the passed in node.
-	 */
-	static public Text getChildTextNode(Node node) {
-		Node textNode = node.getFirstChild();
-		while (textNode != null && DOMUtilities.isTextNode(textNode)) {
-			if (!isWhitespace(textNode))
-				return (Text) textNode;
-			textNode = textNode.getNextSibling();
-		}
-		return null;
-	}
-
-	/**
-	 * Return a string representing the current indentation of the node.
-	 */
-	static public String getIndentString(Node node) {
-		Revisit.toDo();
-		return ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * Get the last non-text child of a node.
-	 * 
-	 * @return org.w3c.dom.Node The last non-text child node of
-	 * @node.
-	 * @param node
-	 *            org.w3c.dom.Node The node
-	 */
-	public static Node getLastNodeChild(Node node) {
-		if (node == null)
-			return null;
-		Node child = node.getLastChild();
-		while (child != null && child.getNodeType() == Node.TEXT_NODE)
-			child = child.getPreviousSibling();
-		return child;
-	}
-
-	/**
-	 * Get the next non-text sibling after a node.
-	 * 
-	 * @return org.w3c.dom.Node The first non-text sibling node after
-	 * @node. If there is no next non-text sibling, null is returned.
-	 * @param node
-	 *            org.w3c.dom.Node The node
-	 */
-	public static Node getNextNodeSibling(Node node) {
-		Node sibling = node.getNextSibling();
-		while (sibling != null && sibling.getNodeType() != Node.ELEMENT_NODE)
-			sibling = sibling.getNextSibling();
-		return sibling;
-	}
-
-	/**
-	 * Get the first child Node with the specified name
-	 */
-	static public Node getNodeChild(Node node, String nodeName) {
-		Node child = null;
-		NodeList children = node.getChildNodes();
-		for (int i = 0; i < children.getLength(); i++) {
-			Node n = children.item(i);
-			if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().equals(nodeName)) {
-				child = n;
-				break;
-			}
-		}
-		return child;
-	}
-
-	/**
-	 * Traverses the path passed in <pathName>. The path is a string in the form
-	 * 'node1/node2/node3'. This method starts at node.
-	 */
-	static public Node getNodeChildForPath(Node parent, String pathName) {
-
-		Node curNode = parent;
-		Iterator i = DOMUtilities.createPathIterator(pathName);
-		while (i.hasNext()) {
-			String child = (String) i.next();
-			curNode = DOMUtilities.getNodeChild(curNode, child);
-			if (curNode == null)
-				return null;
-		}
-		return curNode;
-	}
-
-	/**
-	 * Get the Node children with the specified names
-	 */
-	static public List getNodeChildren(Node node, String[] nodeNames) {
-		NodeList childNodes = node.getChildNodes();
-		ArrayList results = new ArrayList();
-
-		for (int i = 0; i < childNodes.getLength(); i++) {
-			Node n = childNodes.item(i);
-			if (n.getNodeType() == Node.ELEMENT_NODE) {
-				boolean found = false;
-				for (int j = 0; j < nodeNames.length; j++) {
-					if (nodeNames[j].equals(n.getNodeName())) {
-						found = true;
-						break;
-					}
-				}
-				if (found)
-					results.add(n);
-			}
-		}
-		return results;
-	}
-
-	/**
-	 * Get the Node children with the specified name
-	 */
-	static public List getNodeChildren(Node node, String nodeName) {
-		NodeList childNodes = node.getChildNodes();
-		ArrayList results = new ArrayList();
-
-		for (int i = 0; i < childNodes.getLength(); i++) {
-			Node n = childNodes.item(i);
-			if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().equals(nodeName))
-				results.add(n);
-		}
-		return results;
-	}
-
-	/**
-	 * Get the first non-text sibling before a node.
-	 * 
-	 * @return org.w3c.dom.Node The first non-text sibling node before
-	 * @node. If there is no previous non-text sibling, null is returned.
-	 * @param node
-	 *            org.w3c.dom.Node The node
-	 */
-	public static Node getPreviousNodeSibling(Node node) {
-		if (node == null)
-			return null;
-		Node sibling = node.getPreviousSibling();
-		while (sibling != null && DOMUtilities.isTextNode(sibling))
-			sibling = sibling.getPreviousSibling();
-		return sibling;
-	}
-
-	/**
-	 * Get the first text node before a node.
-	 * 
-	 * @return org.w3c.dom.Node The first text node before
-	 * @node. Null if no such node exist.
-	 * @param node
-	 *            org.w3c.dom.Node The node
-	 */
-	public static Text getPreviousText(Node node) {
-		Text sibling = getPreviousTextSibling(node);
-
-		if (sibling == null && node.getParentNode() != null)
-			sibling = getPreviousText(node.getParentNode());
-
-		return sibling;
-	}
-
-	/**
-	 * Get the first text sibling before a node.
-	 * 
-	 * @return org.w3c.dom.Node The first text sibling node before
-	 * @node. If there is no previous text sibling, null is returned.
-	 * @param node
-	 *            org.w3c.dom.Node The node
-	 */
-	public static Text getPreviousTextSibling(Node node) {
-		Assert.isNotNull(node);
-
-		Node sibling = node.getPreviousSibling();
-		Node lastText = null;
-		while (sibling != null && sibling.getNodeType() == Node.TEXT_NODE) {
-			lastText = sibling;
-			sibling = sibling.getPreviousSibling();
-		}
-		return (Text) lastText;
-	}
-
-	/**
-	 * Get the first text sibling before a node.
-	 * 
-	 * @return org.w3c.dom.Node The first text sibling node before
-	 * @node. If there is no previous text sibling, null is returned.
-	 * @param node
-	 *            org.w3c.dom.Node The node
-	 */
-	public static String getTrailingWhitespace(Text node) {
-		Assert.isNotNull(node);
-
-		String text = node.getData();
-		if (text.length() == 0)
-			return ""; //$NON-NLS-1$
-
-		int i = text.length() - 1;
-		for (; i >= 0; i--) {
-			if (!Character.isWhitespace(text.charAt(i))) {
-				break;
-			}
-		}
-
-		return text.substring(++i);
-	}
-
-	/**
-	 * Inserts <newNode>into <parent>after <refNode>. If <refNode>is null then the node is inserted
-	 * to the beginning of the parent's child nodes.
-	 * 
-	 * @param parent
-	 *            org.w3c.dom.Node
-	 * @param newNode
-	 *            org.w3c.dom.Node
-	 * @param refNode
-	 *            org.w3c.dom.Node
-	 */
-	public static void insertAfterNode(Node parent, Node newNode, Node refNode) {
-		Node insertBeforeNode = null;
-		if (refNode != null) {
-			insertBeforeNode = refNode.getNextSibling();
-		}
-		if (refNode == null)
-			insertBeforeNode(parent, newNode, parent.getFirstChild());
-		else
-			insertBeforeNode(parent, newNode, insertBeforeNode);
-	}
-
-	/**
-	 * Insert a <newNode>into <parent>before <refNode>. This utility method is used to ensure that
-	 * the insertion does not result in two adjacent text nodes. The DOM model does not handle
-	 * adjacent text nodes. They must be joined together.
-	 * 
-	 * @param newNode
-	 *            org.w3c.dom.Node
-	 * @param newNode
-	 *            org.w3c.dom.Node
-	 * @param refNode
-	 *            org.w3c.dom.Node
-	 */
-	static public void insertBeforeNode(Node parent, Node newNode, Node refNode) {
-		if (newNode.getNodeType() == Node.TEXT_NODE) {
-			Text textNewNode = (Text) newNode;
-
-			// If the insert before node is text, join it with the new node.
-			if (refNode != null && refNode.getNodeType() == Node.TEXT_NODE) {
-				Text textRefNode = (Text) refNode;
-				textRefNode.setData(textNewNode.getData() + textRefNode.getData());
-				return;
-			}
-			// If the node we are inserting after is text,
-			// join it with the new node.
-			Node insertAfterNode = (refNode == null) ? parent.getLastChild() : refNode.getPreviousSibling();
-			if (insertAfterNode != null && insertAfterNode.getNodeType() == Node.TEXT_NODE) {
-				Text textInsertAfterNode = (Text) insertAfterNode;
-				textInsertAfterNode.setData(textInsertAfterNode.getData() + textNewNode.getData());
-				return;
-			}
-		}
-		// There is no text node to join to, simple insert the node.
-		parent.insertBefore(newNode, refNode);
-	}
-
-	/**
-	 * Insert a <newNode>into <parent>before <refNode>. This method will also insert the node before
-	 * any whitespace nodes that appear in the tree before <refNode>. This method will also ensure
-	 * that the insertion does not result in two adjacent text nodes. The DOM model does not handle
-	 * adjacent text nodes. They must be joined together.
-	 * 
-	 * @param newNode
-	 *            org.w3c.dom.Node
-	 * @param newNode
-	 *            org.w3c.dom.Node
-	 * @param refNode
-	 *            org.w3c.dom.Node
-	 */
-	static public void insertBeforeNodeAndWhitespace(Node parent, Node newNode, Node refNode) {
-		Node curNode = (refNode == null) ? parent.getLastChild() : refNode.getPreviousSibling();
-		Node lastNode = refNode;
-
-		while (curNode != null && (DOMUtilities.isWhitespace(curNode) || DOMUtilities.isComment(curNode))) {
-			lastNode = curNode;
-			curNode = curNode.getPreviousSibling();
-		}
-
-		insertBeforeNode(parent, newNode, lastNode);
-	}
-
-	/**
-	 * Return whether the node is a text node.
-	 * 
-	 * @return boolean Answer true if the node is a text node, false otherwise.
-	 * @param node
-	 *            org.w3c.dom.Node The node to check
-	 */
-	static public boolean isTextNode(Node node) {
-		Assert.isNotNull(node);
-		return (node.getNodeType() == Node.TEXT_NODE) || (node.getNodeType() == Node.CDATA_SECTION_NODE);
-	}
-
-	/**
-	 * Return whether the node is entirely comment or not.
-	 * 
-	 * @return boolean Answer true if the node is whitespace, false otherwise.
-	 * @param node
-	 *            org.w3c.dom.Node The node to check
-	 */
-	static public boolean isComment(Node node) {
-		Assert.isNotNull(node);
-
-		return node.getNodeType() == Node.COMMENT_NODE;
-	}
-
-	/**
-	 * Return whether the node is entirely whitepace or not.
-	 * 
-	 * @return boolean Answer true if the node is whitespace, false otherwise.
-	 * @param node
-	 *            org.w3c.dom.Node The node to check
-	 */
-	static public boolean isWhitespace(Node node) {
-		Assert.isNotNull(node);
-
-		if (node.getNodeType() != Node.TEXT_NODE)
-			return false;
-
-		Text textNode = (Text) node;
-		String text = textNode.getData();
-		if (text == null)
-			return false;
-
-		for (int i = 0; i < text.length(); i++) {
-			if (!Character.isWhitespace(text.charAt(i))) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * Remove all the children of <node>
-	 */
-	static public void removeAllChildren(Node node) {
-		NodeList list = node.getChildNodes();
-		for (int i = 0; i < list.getLength(); i++) {
-			node.removeChild(list.item(i));
-		}
-	}
-
-	// traverses the DOM starting at the specified node and returns a list
-	// of nodes matching the search string
-
-	static public ArrayList getAllNodes(Node node, String nodeName) {
-		ArrayList nodeList = new ArrayList();
-
-		String[] nodeNames = {nodeName};
-		findAllNodes(node, nodeNames, nodeList);
-
-		return nodeList;
-	}
-
-	// traverses the DOM starting at the specified node and returns a list
-	// of nodes matching the search strings
-
-	static public ArrayList getAllNodes(Node node, String[] nodeNamesArray) {
-		ArrayList nodeList = new ArrayList();
-		findAllNodes(node, nodeNamesArray, nodeList);
-
-		return nodeList;
-	}
-
-	// recursive helper for getAllNodes
-	static private void findAllNodes(Node node, String[] nodeNames, ArrayList results) {
-
-		NodeList nodes = node.getChildNodes();
-		if (nodes != null) {
-			for (int i = 0; i < nodes.getLength(); i++) {
-				for (int j = 0; j < nodeNames.length; j++) {
-					if (nodes.item(i).getNodeName().equals(nodeNames[j])) {
-						results.add(nodes.item(i));
-					}
-				}
-				findAllNodes(nodes.item(i), nodeNames, results);
-			}
-		}
-	}
-
-	/**
-	 * Returns the system defined JAXP document builder
-	 */
-	static public DocumentBuilder newDefaultDocumentBuilder(DOMLoadOptions options) throws ParserConfigurationException {
-		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
-		dbf.setValidating(options.isValidate());
-		dbf.setNamespaceAware(options.isValidate());
-		/*
-		 * Causes errors in IBM JDK try { dbf.setAttribute(Renderer.JAXP_SCHEMA_LANGUAGE,
-		 * Renwderer.W3C_XML_SCHEMA); } catch (IllegalArgumentException x) { }
-		 */
-		try {
-			dbf.setAttribute("http://apache.org/xml/features/allow-java-encodings", new Boolean(options.isAllowJavaEncodings())); //$NON-NLS-1$	        
-		} catch (IllegalArgumentException ignore) {
-			Logger.getLogger().log("Warning: Parser does not support \"http://apache.org/xml/features/allow-java-encodings\"."); //$NON-NLS-1$
-		}
-		try {
-			dbf.setAttribute("http://apache.org/xml/features/validation/schema", new Boolean(options.isValidate())); //$NON-NLS-1$
-		} catch (IllegalArgumentException ignore) {
-			dbf.setValidating(false);
-			Logger.getLogger().log("Warning: Parser does not support \"http://apache.org/xml/features/validation/schema\". Validation will be disabled."); //$NON-NLS-1$
-		}
-		dbf.setExpandEntityReferences(options.isExpandEntityRefererences());
-		DocumentBuilder result = dbf.newDocumentBuilder();
-		result.setErrorHandler(new ErrorHandler() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.xml.sax.ErrorHandler#error(org.xml.sax.SAXParseException)
-			 */
-			public void error(SAXParseException arg0) throws SAXException {
-				throw arg0;
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.xml.sax.ErrorHandler#fatalError(org.xml.sax.SAXParseException)
-			 */
-			public void fatalError(SAXParseException arg0) throws SAXException {
-				throw arg0;
-			}
-
-			public void warning(SAXParseException arg0) throws SAXException {
-				Logger.getLogger().logWarning(arg0);
-			}
-
-		});
-		return result;
-	}
-
-	/**
-	 * Creates a stub document, where the DocumentType is defined by the parameters.
-	 */
-	static public Document createNewDocument(String doctype, String publicId, String systemId) throws ParserConfigurationException, SAXException, IOException {
-		DocumentBuilder builder = getDefaultDocumentBuilder();
-		InputStream in = createHeaderInputStream(doctype, publicId, systemId, true);
-		Document result = builder.parse(in);
-		removeDummyEntity(result);
-		removeExtraneousComments(result);
-		return result;
-	}
-
-	public static Document loadDocument(InputStream in, DOMLoadOptions options, EntityResolver resolver) throws ParserConfigurationException, SAXException, IOException {
-		DocumentBuilder builder = DOMUtilities.newDefaultDocumentBuilder(options);
-		builder.setEntityResolver(resolver);
-		Document result = builder.parse(in);
-		removeExtraneousComments(result);
-		return result;
-	}
-
-	/**
-	 * At the time of this writing, the DOM Level 2 APIs are not advanced enough for setting the
-	 * document type; so the only parser independent way of accomplishing this is by creating a
-	 * stream and parsing it.
-	 */
-	public static InputStream createHeaderInputStream(String doctype, String publicId, String systemId) {
-		return createHeaderInputStream(doctype, publicId, systemId, false);
-	}
-
-
-	private static InputStream createHeaderInputStream(String doctype, String publicId, String systemId, boolean includeDummy) {
-		ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
-		PrintWriter writer = new PrintWriter(outputStream);
-		writeHeader(writer, doctype, publicId, systemId);
-		if (includeDummy)
-			addDummyEntity(writer);
-		writer.flush();
-		writer.close();
-		return new java.io.ByteArrayInputStream(outputStream.toByteArray());
-	}
-
-	private static void writeHeader(PrintWriter writer, String doctype, String publicId, String systemId) {
-		writer.write("<?xml version=\""); //$NON-NLS-1$
-		writer.write("1.0"); //$NON-NLS-1$
-		writer.write("\" encoding=\""); //$NON-NLS-1$
-		writer.write("UTF-8"); //$NON-NLS-1$
-		writer.write("\"?>"); //$NON-NLS-1$
-		writer.println();
-
-		if (doctype != null) {
-			writer.write("<!DOCTYPE "); //$NON-NLS-1$
-			writer.write(doctype);
-			writer.write(" PUBLIC \""); //$NON-NLS-1$
-			writer.write(publicId);
-			writer.write("\" \""); //$NON-NLS-1$
-			writer.write(systemId);
-			writer.write("\">"); //$NON-NLS-1$
-			writer.println();
-		}
-	}
-
-	private static void addDummyEntity(PrintWriter writer) {
-		Revisit.revisit();
-		writer.println(DUMMY_ENTITY_NODE_STRING);
-		//Major hack because we can not parse an empty document
-	}
-
-	private static void removeDummyEntity(Document doc) {
-		doc.removeChild(getNodeChild(doc, DUMMY_ENTITY_STRING));
-	}
-
-	private static void removeExtraneousComments(Document doc) {
-		//another major hack because of a bug in XML4J 4.0.7 that added all the
-		//comments from the dtd to the document. Can be removed after we move up
-		//Xerces levels
-		Node aNode = doc.getFirstChild();
-		while (aNode != null) {
-			Node nextNode = aNode.getNextSibling();
-			if (aNode.getNodeType() == Node.COMMENT_NODE)
-				doc.removeChild(aNode);
-			aNode = nextNode;
-		}
-	}
-
-	/**
-	 * For performance, cache a static instance of the JAXP registered document builder. Validation
-	 * is disabled for this instance. If you need validation, use
-	 * {@link #newDefaultDocumentBuilder(boolean, boolean, boolean)}
-	 * 
-	 * @return DocumentBuilder
-	 * @throws ParserConfigurationException
-	 *             if JAXP is not configured correctly
-	 */
-	public static DocumentBuilder getDefaultDocumentBuilder() throws ParserConfigurationException {
-		if (defaultDocumentBuilder == null) {
-			DOMLoadOptions opts = new DOMLoadOptions();
-			opts.setAllowJavaEncodings(true);
-			opts.setExpandEntityRefererences(true);
-			opts.setValidate(false);
-			defaultDocumentBuilder = newDefaultDocumentBuilder(opts);
-			defaultDocumentBuilder.setEntityResolver(defaultEntityResolver);
-			defaultDocumentBuilder.setErrorHandler(new ErrorHandler() {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.xml.sax.ErrorHandler#error(org.xml.sax.SAXParseException)
-				 */
-				public void error(SAXParseException exception) throws SAXException {
-
-				}
-
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.xml.sax.ErrorHandler#fatalError(org.xml.sax.SAXParseException)
-				 */
-				public void fatalError(SAXParseException exception) throws SAXException {
-
-				}
-
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.xml.sax.ErrorHandler#warning(org.xml.sax.SAXParseException)
-				 */
-				public void warning(SAXParseException exception) throws SAXException {
-
-				}
-
-			});
-		}
-
-		return defaultDocumentBuilder;
-	}
-
-	/**
-	 * @return
-	 */
-	public static EntityResolver getDefaultEntityResolver() {
-		return defaultEntityResolver;
-	}
-
-	/**
-	 * @param resolver
-	 */
-	public static void setDefaultEntityResolver(EntityResolver resolver) {
-		defaultEntityResolver = resolver;
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DanglingHREFException.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DanglingHREFException.java
deleted file mode 100644
index 21f9254..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DanglingHREFException.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on May 12, 2003
- *
- */
-package org.eclipse.wst.common.internal.emf.utilities;
-
-/**
- * Exception thrown when a proxy can not be resolved
- */
-public class DanglingHREFException extends Exception {
-
-
-	public DanglingHREFException() {
-		super();
-	}
-
-	/**
-	 * @param s
-	 */
-	public DanglingHREFException(String s) {
-		super(s);
-	}
-
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DefaultFeatureValueConverter.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DefaultFeatureValueConverter.java
deleted file mode 100644
index 2cfb9a7..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DefaultFeatureValueConverter.java
+++ /dev/null
@@ -1,321 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClassifier;
-import org.eclipse.emf.ecore.EEnum;
-import org.eclipse.emf.ecore.EEnumLiteral;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.EcorePackage;
-
-/**
- * Insert the type's description here. Creation date: (5/10/2001 2:49:49 PM)
- * 
- * @author: Administrator
- */
-public class DefaultFeatureValueConverter implements FeatureValueConverter {
-	private static final String FAILED_CONVERSION_PATTERN = WFTUtilsResourceHandler.Failed_to_convert__0__to___ERROR_; //$NON-NLS-1$ = "Failed to convert {0} to {1}."
-
-	/**
-	 * DefaultFeatureValueConverter constructor comment.
-	 */
-	public DefaultFeatureValueConverter() {
-		super();
-	}
-
-	/**
-	 * Convert
-	 * 
-	 * @aValue to a Boolean.
-	 */
-	protected Object convertToBoolean(Object aValue) {
-		if (aValue instanceof String)
-			return Boolean.valueOf((String) aValue);
-		if (aValue instanceof Boolean)
-			return aValue;
-		return failedToConvert(aValue, WFTUtilsResourceHandler.Boolean_UI_); //$NON-NLS-1$ = "Boolean"
-	}
-
-	/**
-	 * Convert
-	 * 
-	 * @aValue to a Byte.
-	 */
-	protected Object convertToByte(Object aValue) {
-		if (aValue instanceof String)
-			return Byte.valueOf((String) aValue);
-		if (aValue instanceof Byte)
-			return aValue;
-		return failedToConvert(aValue, WFTUtilsResourceHandler.Byte_UI_); //$NON-NLS-1$ = "Byte"
-	}
-
-	/**
-	 * Convert
-	 * 
-	 * @aValue to a Character.
-	 */
-	protected Object convertToCharacter(Object aValue) {
-		if (aValue instanceof String && ((String) aValue).length() == 1)
-			return new Character(((String) aValue).charAt(0));
-		if (aValue instanceof Character)
-			return aValue;
-		return failedToConvert(aValue, WFTUtilsResourceHandler.Character_UI_); //$NON-NLS-1$ = "Character"
-	}
-
-	/**
-	 * Convert
-	 * 
-	 * @aValue to a Double.
-	 */
-	protected Object convertToDouble(Object aValue) {
-		if (aValue instanceof String) {
-			try {
-				return Double.valueOf((String) aValue);
-			} catch (NumberFormatException e) {
-				return defaultDouble();
-			}
-		}
-		if (aValue instanceof Double)
-			return aValue;
-		return failedToConvert(aValue, WFTUtilsResourceHandler.Double_UI_); //$NON-NLS-1$ = "Double"
-	}
-
-	/**
-	 * Convert
-	 * 
-	 * @aValue to a EEnumLiteral.
-	 */
-	protected Object convertToEnum(Object aValue, EStructuralFeature aFeature) {
-		EEnumLiteral literal = null;
-		EEnum eenum = (EEnum) aFeature.getEType();
-		if (aValue instanceof String)
-			literal = eenum.getEEnumLiteral((String) aValue);
-		else if (aValue instanceof Integer)
-			literal = eenum.getEEnumLiteral(((Integer) aValue).intValue());
-		else if (aValue instanceof EEnumLiteral)
-			literal = (EEnumLiteral) aValue;
-
-		if (literal == null)
-			return failedToConvert(aValue, WFTUtilsResourceHandler.Enumeration_UI_); //$NON-NLS-1$ = "Enumeration"
-
-		return literal.getInstance();
-	}
-
-	/**
-	 * Convert
-	 * 
-	 * @aValue to a Float.
-	 */
-	protected Object convertToFloat(Object aValue) {
-		if (aValue instanceof String) {
-			try {
-				return Float.valueOf((String) aValue);
-			} catch (NumberFormatException e) {
-				return defaultFloat();
-			}
-		}
-		if (aValue instanceof Float)
-			return aValue;
-		return failedToConvert(aValue, WFTUtilsResourceHandler.Float_UI_); //$NON-NLS-1$ = "Float"
-	}
-
-	/**
-	 * Convert
-	 * 
-	 * @aValue to a Integer.
-	 */
-	protected Object convertToInteger(Object aValue) {
-		if (aValue instanceof String) {
-			try {
-				return Integer.valueOf((String) aValue);
-			} catch (NumberFormatException e) {
-				return defaultInteger();
-			}
-		}
-		if (aValue instanceof Integer)
-			return aValue;
-		return failedToConvert(aValue, WFTUtilsResourceHandler.Integer_UI_); //$NON-NLS-1$ = "Integer"
-	}
-
-	/**
-	 * Convert
-	 * 
-	 * @aValue to a Java Object.
-	 */
-	protected Object convertToJavaObject(Object aValue) {
-		return aValue;
-	}
-
-	/**
-	 * Convert
-	 * 
-	 * @aValue to a Long.
-	 */
-	protected Object convertToLong(Object aValue) {
-		if (aValue instanceof String) {
-			try {
-				return Long.valueOf((String) aValue);
-			} catch (NumberFormatException e) {
-				return defaultLong();
-			}
-		}
-		if (aValue instanceof Long)
-			return aValue;
-		return failedToConvert(aValue, WFTUtilsResourceHandler.Long_UI_); //$NON-NLS-1$ = "Long"
-	}
-
-	/**
-	 * Convert
-	 * 
-	 * @aValue to a MofObject.
-	 */
-	protected Object convertToMofObject(Object aValue) {
-		if (aValue instanceof EObject)
-			return aValue;
-		return failedToConvert(aValue, WFTUtilsResourceHandler.MofObject_UI_); //$NON-NLS-1$ = "MofObject"
-	}
-
-	/**
-	 * Convert
-	 * 
-	 * @aValue to a Short.
-	 */
-	protected Object convertToShort(Object aValue) {
-		if (aValue instanceof String) {
-			try {
-				return Short.valueOf((String) aValue);
-			} catch (NumberFormatException e) {
-				return defaultShort();
-			}
-		}
-		if (aValue instanceof Short)
-			return aValue;
-		return failedToConvert(aValue, WFTUtilsResourceHandler.Short_UI_); //$NON-NLS-1$ = "Short"
-	}
-
-	/**
-	 * Convert
-	 * 
-	 * @aValue to a String.
-	 */
-	protected Object convertToString(Object aValue) {
-		return aValue.toString();
-	}
-
-	/**
-	 * Convert
-	 * 
-	 * @aValue to the type of
-	 * @anAttribute.
-	 */
-	protected Object convertValue(Object aValue, org.eclipse.emf.ecore.EAttribute anAttribute) {
-
-		EClassifier meta = anAttribute.getEType();
-		if (meta.eClass() == EcorePackage.eINSTANCE.getEEnum())
-			return convertToEnum(aValue, anAttribute);
-		switch (meta.getClassifierID()) {
-			case EcorePackage.ESTRING :
-				return convertToString(aValue);
-			case EcorePackage.EBOOLEAN_OBJECT :
-			case EcorePackage.EBOOLEAN :
-				return convertToBoolean(aValue);
-			case EcorePackage.EINTEGER_OBJECT :
-			case EcorePackage.EINT :
-				return convertToInteger(aValue);
-			case EcorePackage.EFLOAT_OBJECT :
-			case EcorePackage.EFLOAT :
-				return convertToFloat(aValue);
-			case EcorePackage.ECHARACTER_OBJECT :
-			case EcorePackage.ECHAR :
-				return convertToCharacter(aValue);
-			case EcorePackage.ELONG_OBJECT :
-			case EcorePackage.ELONG :
-				return convertToLong(aValue);
-			case EcorePackage.EBYTE_OBJECT :
-			case EcorePackage.EBYTE :
-				return convertToByte(aValue);
-			case EcorePackage.EDOUBLE_OBJECT :
-			case EcorePackage.EDOUBLE :
-				return convertToDouble(aValue);
-			case EcorePackage.ESHORT_OBJECT :
-			case EcorePackage.ESHORT :
-				return convertToShort(aValue);
-			//		case EcorePackage.EENUM:
-			//			return convertToEnum(aValue, anAttribute);
-			case EcorePackage.EOBJECT :
-				return convertToMofObject(aValue);
-			case EcorePackage.EJAVA_OBJECT :
-				return convertToJavaObject(aValue);
-		}
-		return aValue;
-	}
-
-	/**
-	 * Convert
-	 * 
-	 * @aValue to the type of
-	 * @aFeature.
-	 */
-	public Object convertValue(Object aValue, org.eclipse.emf.ecore.EStructuralFeature aFeature) {
-		if (aValue == null || aFeature == null || !(aFeature instanceof EAttribute))
-			return aValue; //nothing to convert
-		return convertValue(aValue, (EAttribute) aFeature);
-	}
-
-	/**
-	 * Return the default Double value.
-	 */
-	protected Double defaultDouble() {
-		return null;
-	}
-
-	/**
-	 * Return the default Float value.
-	 */
-	protected Float defaultFloat() {
-		return null;
-	}
-
-	/**
-	 * Return the default Integer value.
-	 */
-	protected Integer defaultInteger() {
-		return null;
-	}
-
-	/**
-	 * Return the default Long value.
-	 */
-	protected Long defaultLong() {
-		return null;
-	}
-
-	/**
-	 * Return the default Short value.
-	 */
-	protected Short defaultShort() {
-		return null;
-	}
-
-	/**
-	 * Failed to convert
-	 * 
-	 * @aValue.
-	 */
-	protected Object failedToConvert(Object aValue, String aString) {
-		String errorString = java.text.MessageFormat.format(FAILED_CONVERSION_PATTERN, new String[]{aValue.toString(), aString});
-		throw new FeatureValueConversionException(errorString);
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DefaultOverridableResourceFactoryRegistry.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DefaultOverridableResourceFactoryRegistry.java
deleted file mode 100644
index c3777bf..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DefaultOverridableResourceFactoryRegistry.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Mar 14, 2003
- *
- * To change this generated comment go to 
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
-package org.eclipse.wst.common.internal.emf.utilities;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.Resource.Factory;
-import org.eclipse.emf.ecore.resource.impl.ResourceFactoryRegistryImpl;
-
-/**
- * @author DABERG
- * 
- * To change this generated comment go to Window>Preferences>Java>Code Generation>Code and Comments
- */
-public class DefaultOverridableResourceFactoryRegistry extends ResourceFactoryRegistryImpl {
-	protected static Resource.Factory GLOBAL_FACTORY = Resource.Factory.Registry.INSTANCE.getFactory(URI.createURI(DEFAULT_EXTENSION));
-
-	/**
-	 *  
-	 */
-	public DefaultOverridableResourceFactoryRegistry() {
-		super();
-	}
-
-	public Resource.Factory getFactory(URI uri) {
-		Object resourceFactory = null;
-		if (resourceFactory == null) {
-			String protocol = uri.scheme();
-			resourceFactory = protocolToFactoryMap.get(protocol);
-			if (resourceFactory == null) {
-				String extension = uri.fileExtension();
-				resourceFactory = extensionToFactoryMap.get(extension);
-				if (resourceFactory == null) {
-					resourceFactory = delegatedGetFactory(uri);
-					if (resourceFactory == GLOBAL_FACTORY) {
-						resourceFactory = (Factory) extensionToFactoryMap.get(Resource.Factory.Registry.DEFAULT_EXTENSION);
-						if (resourceFactory == null)
-							resourceFactory = GLOBAL_FACTORY;
-					}
-
-				}
-			}
-		}
-
-		return resourceFactory instanceof Resource.Factory.Descriptor ? ((Resource.Factory.Descriptor) resourceFactory).createFactory() : (Resource.Factory) resourceFactory;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.ecore.resource.impl.ResourceFactoryRegistryImpl#delegatedGetFactory(org.eclipse.emf.common.util.URI)
-	 */
-	protected Factory delegatedGetFactory(URI uri) {
-		return Resource.Factory.Registry.INSTANCE.getFactory(uri);
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DeferredReferenceUtilityAction.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DeferredReferenceUtilityAction.java
deleted file mode 100644
index ec1f668..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DeferredReferenceUtilityAction.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * Insert the type's description here. Creation date: (12/15/2000 5:25:43 PM)
- * 
- * @author: Administrator
- */
-public abstract class DeferredReferenceUtilityAction {
-	protected EReference reference;
-	protected Object referenceValue;
-	protected EObject copyContainer;
-	protected String idSuffix;
-
-	/**
-	 * DeferredCopy constructor comment.
-	 */
-	public DeferredReferenceUtilityAction(EReference aReference, Object aValue, String aSuffix, EObject aCopyContainer) {
-		reference = aReference;
-		referenceValue = aValue;
-		idSuffix = aSuffix;
-		copyContainer = aCopyContainer;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (12/16/2000 9:32:28 AM)
-	 * 
-	 * @return org.eclipse.emf.ecore.EObject
-	 */
-	public org.eclipse.emf.ecore.EObject getCopyContainer() {
-		return copyContainer;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (12/15/2000 5:34:56 PM)
-	 * 
-	 * @return java.lang.String
-	 */
-	public java.lang.String getIdSuffix() {
-		return idSuffix;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (12/15/2000 5:34:56 PM)
-	 * 
-	 * @return org.eclipse.emf.ecore.EReference
-	 */
-	public org.eclipse.emf.ecore.EReference getReference() {
-		return reference;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (12/16/2000 9:32:28 AM)
-	 * 
-	 * @return java.lang.Object
-	 */
-	public Object getReferenceValue() {
-		return referenceValue;
-	}
-
-	public abstract void performAction();
-}
-
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/EncoderDecoder.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/EncoderDecoder.java
deleted file mode 100644
index 69fe06b..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/EncoderDecoder.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-
-/**
- * Represents an interface to an object which can encode and decode values. This typically involves
- * cryptography algorithms. This interface, along with the supplied adapters provide an extension
- * mechanism for pluggable crytography that can be used when storing and retrieving attribute
- * values, and is used prevalently for encoding and decoding password values of mof objects.
- */
-public interface EncoderDecoder {
-	/**
-	 * Returns a decoded version of the value.
-	 */
-	public String decode(String value);
-
-	/**
-	 * Returns an encoded version of the value.
-	 */
-	public String encode(String value);
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/EncoderDecoderAdapter.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/EncoderDecoderAdapter.java
deleted file mode 100644
index 788b300..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/EncoderDecoderAdapter.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-
-/**
- * An adapter for EncoderDecoder implementations
- */
-public abstract class EncoderDecoderAdapter implements EncoderDecoder {
-
-	/**
-	 * EncoderDecoderAdapter constructor comment.
-	 */
-	public EncoderDecoderAdapter() {
-		super();
-	}
-
-	/**
-	 * Returns a decoded version of the value.
-	 */
-	public abstract String decode(String value);
-
-	/**
-	 * Returns an encoded version of the value.
-	 */
-	public abstract String encode(String value);
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/EncoderDecoderRegistry.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/EncoderDecoderRegistry.java
deleted file mode 100644
index d615112..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/EncoderDecoderRegistry.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Registry for storing and retrieving value decoders and encoders. Usage Example:
- * 
- * <pre>
- * 
- * 
- * // Use the standard WebSphere password value encoder/decoder.
- * EncoderDecoderRegistry.getDefaultRegistry().setDefaultEncoderDecoder(new com.ibm.ejs.security.util.WASEncoderDecoder());
- * // Begin tracking changes...
- * WriteBackHelper.begin();
- * // Load a resource which may have un-encoded values...
- * // Note: The WCCM will attempt to detect un-encoded values.  If unencoded values
- * // are found, the value will be encoded, and the resource will be added to the
- * // WriteBackHelper.
- * Resource res = resourceSet.load(&quot;myResource&quot;);
- * // Ensure that any changes due to encoding are written back out.
- * WriteBackHelper.end();
- * </pre>
- */
-public class EncoderDecoderRegistry {
-	protected static EncoderDecoderRegistry _defaultInstance;
-	public static final EncoderDecoder INITIAL_DEFAULT_ENCODER = PassthruEncoderDecoder.INSTANCE;
-	protected Map encoders = new HashMap();
-	protected Object defaultEncoderKey;
-
-	/**
-	 * EncoderDecoderRegistry constructor comment.
-	 */
-	public EncoderDecoderRegistry() {
-		super();
-		initializeDefaultEncoders();
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (2/2/2001 12:43:31 AM)
-	 */
-	public void addEncoderDecoder(EncoderDecoder encoderDecoder) {
-		encoders.put(encoderDecoder.getClass().getName(), encoderDecoder);
-		if (defaultEncoderKey == null)
-			defaultEncoderKey = encoderDecoder.getClass().getName();
-	}
-
-	/**
-	 * Returns an encoder/decoder by key.
-	 */
-	public EncoderDecoder getDefaultEncoderDecoder() {
-		if (defaultEncoderKey == null)
-			return null;
-		return (EncoderDecoder) encoders.get(defaultEncoderKey);
-	}
-
-	/**
-	 * Returns the default registry to use for retrieving value encoders and decoders
-	 */
-	public static EncoderDecoderRegistry getDefaultRegistry() {
-		if (_defaultInstance == null) {
-			_defaultInstance = new EncoderDecoderRegistry();
-		}
-		return _defaultInstance;
-	}
-
-	/**
-	 * Returns an encoder/decoder by key.
-	 */
-	public EncoderDecoder getEncoderDecoder(Object key) {
-		return (EncoderDecoder) encoders.get(key);
-	}
-
-	/**
-	 * Initializes a standard set of encoder/decoders.
-	 */
-	public void initializeDefaultEncoders() {
-		setDefaultEncoderDecoder(INITIAL_DEFAULT_ENCODER);
-		addEncoderDecoder(new XMLValueEncoderDecoder());
-	}
-
-	/**
-	 * Removes the encoder/decoder with the specified key.
-	 */
-	public void removeEncoderDecoder(Object key) {
-		if (encoders.containsKey(key)) {
-			encoders.remove(key);
-		}
-	}
-
-	/**
-	 * Returns an encoder/decoder by key.
-	 */
-	public void setDefaultEncoderDecoder(EncoderDecoder encoder) {
-		defaultEncoderKey = encoder.getClass().getName();
-		if (!encoders.containsKey(defaultEncoderKey)) {
-			addEncoderDecoder(encoder);
-		}
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/EtoolsCopySession.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/EtoolsCopySession.java
deleted file mode 100644
index ca678b8..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/EtoolsCopySession.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.common.notify.impl.NotificationImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-
-/**
- * Insert the type's description here. Creation date: (05/04/01 11:25:59 PM)
- * 
- * @author: Administrator
- */
-public class EtoolsCopySession extends EtoolsCopyUtility {
-	public static final int RESOURCE_COPIED = 500;
-	private EtoolsCopyUtility parentCopyUtility;
-	private XMLResource currentResource;
-	private XMLResource currentCopyResource;
-
-	/**
-	 * EtoolsCopySession constructor comment.
-	 */
-	public EtoolsCopySession(EtoolsCopyUtility aCopyUtility) {
-		parentCopyUtility = aCopyUtility;
-		setPreserveIds(aCopyUtility.preserveIds());
-		setCopyAdapters(aCopyUtility.isCopyAdapters());
-	}
-
-	/**
-	 * Copy all Resources and RefObjects within <code>aGroup</code> and add them to
-	 * <code>aGroup</code>. Non composite references will be deferred until all objects are
-	 * copied from <code>aGroup</code>.
-	 * 
-	 * Copy Resources first and then copy RefObjects.
-	 */
-	public void copy(CopyGroup aGroup) {
-		if (aGroup != null) {
-			copyResources(aGroup);
-			copyRefObjects(aGroup);
-			executeDeferredCopyActions();
-			aGroup.postCopy(this);
-			notifyNewResourcesCopied(aGroup);
-		}
-	}
-
-	/**
-	 * This method should be used if you are only going to copy <code>aRefObject</code> in this
-	 * copy execution.
-	 */
-	public EObject copy(EObject aRefObject, String idSuffix) {
-		EObject copied = containmentCopy(aRefObject, idSuffix);
-		executeDeferredCopyActions();
-		return copied;
-	}
-
-	/**
-	 * This method should be used if you are only going to copy <code>aRefObject</code> in this
-	 * copy execution. This method only copies <code>aRefObject</code> attributes.
-	 */
-	public EObject copyObject(EObject aRefObject, String idSuffix) {
-		EObject copied = containmentCopyObject(aRefObject, idSuffix);
-		executeDeferredCopyActions();
-		return copied;
-	}
-
-	/**
-	 * This method should be used if you are only going to copy <code>aResource</code> in this
-	 * copy execution. The copied Resource will have a URI equal to <code>newUri</code>.
-	 */
-	public Resource copy(Resource aResource, String newUri) {
-		Resource copied = containmentCopy(aResource, newUri);
-		executeDeferredCopyActions();
-		copyModificationFlag(aResource, copied);
-		notifyNewResourceCopied(copied);
-		return copied;
-	}
-
-	protected void notifyNewResourcesCopied(CopyGroup group) {
-		List copied = group.getCopiedResources();
-		for (int i = 0; i < copied.size(); i++) {
-			notifyNewResourceCopied((Resource) copied.get(i));
-		}
-	}
-
-	protected void notifyNewResourceCopied(Resource copied) {
-		copied.eNotify(new NotificationImpl(RESOURCE_COPIED, null, null));
-	}
-
-	/**
-	 * @see com.ibm.etools.emf.ecore.utilities.copy.EtoolsCopyUtility#primCopyObject(EObject,
-	 *      String)
-	 */
-	protected EObject primCopyObject(EObject aRefObject, String idSuffix) {
-		EObject copy = super.primCopyObject(aRefObject, idSuffix);
-		copyIdIfNecessary(aRefObject, copy, idSuffix);
-		return copy;
-	}
-
-	protected void copyIdIfNecessary(EObject obj, EObject copy, String idSuffix) {
-		if ((idSuffix == null && !preserveIds) || currentResource == null)
-			return;
-		String id = currentResource.getID(obj);
-		if (id == null)
-			return;
-		id = idSuffix == null ? id : id + idSuffix;
-		currentCopyResource.setID(copy, id);
-	}
-
-
-	/**
-	 * Set delivery back on for all the cached objects and push them to the parentCopyUtility.
-	 */
-	public void flush() {
-		Iterator it = getCopiedObjects().entrySet().iterator();
-		Map parentCopies = getParentCopyUtility().getCopiedObjects();
-		Map.Entry entry;
-		EObject copy;
-		while (it.hasNext()) {
-			entry = (Map.Entry) it.next();
-			copy = (EObject) entry.getValue();
-			copy.eSetDeliver(true);
-			parentCopies.put(entry.getKey(), copy);
-		}
-		copiedObjects = null;
-	}
-
-	/**
-	 * Return a cached copy.
-	 */
-	public EObject getCopy(EObject anObject) {
-		EObject copied = super.getCopy(anObject);
-		if (copied == null)
-			copied = getParentCopyUtility().getCopy(anObject);
-		return copied;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (05/04/01 11:28:07 PM)
-	 * 
-	 * @return com.ibm.etools.emf.ecore.utilities.copy.EtoolsCopyUtility
-	 */
-	protected EtoolsCopyUtility getParentCopyUtility() {
-		return parentCopyUtility;
-	}
-
-	/**
-	 * Return an instance of EObject that is the same type as <code>aRefObject</code>.
-	 */
-	public EObject newInstance(EObject aRefObject) {
-		EObject newType = super.newInstance(aRefObject);
-		newType.eSetDeliver(false);
-		return newType;
-	}
-
-	/**
-	 * @see com.ibm.etools.emf.ecore.utilities.copy.EtoolsCopyUtility#newInstance(Resource, String)
-	 */
-	public Resource newInstance(Resource aResource, String newUri) {
-		Resource copy = super.newInstance(aResource, newUri);
-		if (aResource instanceof XMLResource) {
-			currentResource = (XMLResource) aResource;
-			currentCopyResource = (XMLResource) copy;
-		} else {
-			currentResource = null;
-			currentCopyResource = null;
-		}
-		return copy;
-	}
-
-}
-
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/EtoolsCopyUtility.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/EtoolsCopyUtility.java
deleted file mode 100644
index fa24556..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/EtoolsCopyUtility.java
+++ /dev/null
@@ -1,669 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EFactory;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.ETypedElement;
-import org.eclipse.emf.ecore.EcorePackage;
-import org.eclipse.emf.ecore.resource.Resource;
-
-
-/**
- * Insert the type's description here. Creation date: (12/13/2000 9:10:55 PM)
- * 
- * @author: Administrator
- */
-public class EtoolsCopyUtility {
-	protected static final String REFENUMLITERAL_TYPE_NAME = "EEnumLiteral"; //$NON-NLS-1$
-	private final EcorePackage pkg = EcorePackage.eINSTANCE;
-
-	private final ETypedElement METAENAME = pkg.getENamedElement_Name();
-
-	protected HashMap copiedObjects;
-	protected List deferredReferenceCopies;
-	protected boolean preserveIds = false;
-	protected boolean copyAdapters = false;
-	protected HashMap copiedAdapters;
-
-	protected class DeferredSingleReferenceCopyAction extends DeferredReferenceUtilityAction {
-		public DeferredSingleReferenceCopyAction(EReference aReference, Object aValue, String aSuffix, EObject aCopyContainer) {
-			super(aReference, aValue, aSuffix, aCopyContainer);
-		}
-
-		public void performAction() {
-			EObject value = (EObject) getReferenceValue();
-			getCopyContainer().eSet(getReference(), getCopyIfFound(value));
-		}
-	}
-
-	protected class DeferredManyReferenceCopyAction extends DeferredReferenceUtilityAction {
-		public DeferredManyReferenceCopyAction(EReference aReference, List aValue, String aSuffix, EObject aCopyContainer) {
-			super(aReference, aValue, aSuffix, aCopyContainer);
-		}
-
-		public void performAction() {
-			List copyList = (List) getCopyContainer().eGet(getReference());
-			Iterator it = ((List) getReferenceValue()).iterator();
-			EObject next;
-			while (it.hasNext()) {
-				next = (EObject) it.next();
-				copyList.add(getCopyIfFound(next));
-			}
-		}
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (12/13/2000 9:14:26 PM)
-	 * 
-	 * @param aRefObject
-	 *            org.eclipse.emf.ecore.EObject
-	 */
-	public EtoolsCopyUtility() {
-	}
-
-	/**
-	 * Create a <code>DeferredManyReferenceCopyAction</code> and add it to the list of deferred
-	 * copy actions.
-	 */
-	protected void addDeferredManyReferenceCopy(EReference reference, List aValue, String idSuffix, EObject aCopyContainer) {
-		getDeferredReferenceCopies().add(new DeferredManyReferenceCopyAction(reference, aValue, idSuffix, aCopyContainer));
-	}
-
-	/**
-	 * Create a <code>DeferredSingleReferenceCopyAction</code> and add it to the list of deferred
-	 * copy actions.
-	 */
-	protected void addDeferredSingleReferenceCopy(EReference reference, EObject aValue, String idSuffix, EObject aCopyContainer) {
-		getDeferredReferenceCopies().add(new DeferredSingleReferenceCopyAction(reference, aValue, idSuffix, aCopyContainer));
-	}
-
-	/**
-	 * Check for an already copied object first.
-	 */
-	protected EObject containmentCopy(EObject anObject, String idSuffix) {
-		EObject copied = getCopy(anObject);
-		if (copied == null)
-			copied = primCopy(anObject, idSuffix);
-		return copied;
-	}
-
-	/**
-	 * Check for an already copied object first.
-	 */
-	protected EObject containmentCopyObject(EObject anObject, String idSuffix) {
-		EObject copied = getCopy(anObject);
-		if (copied == null)
-			copied = primCopyObject(anObject, idSuffix);
-		return copied;
-	}
-
-	protected Resource containmentCopy(Resource aResource, String newUri) {
-		/* copied resources are never cached */
-		return primCopy(aResource, newUri);
-	}
-
-	/**
-	 * Copy all Resources and RefObjects within <code>aGroup</code> and add them to
-	 * <code>aGroup</code>. Non composite references will be deferred until all objects are
-	 * copied from <code>aGroup</code>.
-	 * 
-	 * Copy Resources first and then copy RefObjects.
-	 */
-	public void copy(CopyGroup aGroup) {
-		if (aGroup != null) {
-			EtoolsCopySession session = new EtoolsCopySession(this);
-			session.setPreserveIds(aGroup.getPreserveIds());
-			session.copy(aGroup);
-			session.flush();
-		}
-	}
-
-	public EObject copy(EObject aRefObject) {
-		return copy(aRefObject, null);
-	}
-
-	/**
-	 * This method should be used if you are only going to copy <code>aRefObject</code> in this
-	 * copy execution.
-	 */
-	public EObject copy(EObject aRefObject, String idSuffix) {
-		EtoolsCopySession session = new EtoolsCopySession(this);
-		EObject copied = session.copy(aRefObject, idSuffix);
-		session.flush();
-		return copied;
-	}
-
-	/**
-	 * This method should be used if you are only going to copy <code>aRefObject</code> in this
-	 * copy execution. This method only copies <code>aRefObject</code> with its properties, not
-	 * references.
-	 */
-	public EObject copyObject(EObject aRefObject, String idSuffix) {
-		EtoolsCopySession session = new EtoolsCopySession(this);
-		EObject copied = session.copyObject(aRefObject, idSuffix);
-		session.flush();
-		return copied;
-	}
-
-	/**
-	 * This method should be used if you are only going to copy <code>aResource</code> in this
-	 * copy execution. The copied Resource will have a URI equal to <code>newUri</code>.
-	 */
-	public Resource copy(Resource aResource, String newUri) {
-		EtoolsCopySession session = new EtoolsCopySession(this);
-		Resource copied = session.copy(aResource, newUri);
-		session.flush();
-		return copied;
-	}
-
-	/**
-	 * If an attribute is set and its value is not <code>null</code>, then perform copy
-	 * <code>attribute</code> value from <code>aRefObject</code> to <code>copyRef</code>.
-	 * Null is a valid value if the attribute is set.
-	 */
-
-	protected void copyAttribute(EAttribute attribute, EObject aRefObject, String idSuffix, EObject copyRef) {
-		if (!attribute.isChangeable())
-			return; //ignore
-		if (attribute.isMany()) {
-			List value = (List) aRefObject.eGet(attribute);
-			if (value != null)
-				copyManyAttribute(attribute, value, aRefObject, idSuffix, copyRef);
-		} else if (aRefObject.eIsSet(attribute)) {
-			Object value = aRefObject.eGet(attribute);
-			if (value == null)
-				copyRef.eSet(attribute, value);
-			else
-				copySingleAttribute(attribute, value, aRefObject, idSuffix, copyRef);
-		} else if (attribute == METAENAME) {
-			//set name to the ID (this is computed as a default), only get here if isSetName is
-			// false.
-			copyRef.eSet(attribute, aRefObject.eGet(attribute));
-		}
-	}
-
-	/**
-	 * Iterate over the attributes of the receiver and copy each attribute.
-	 */
-	protected void copyCurrentAttributes(EObject aRefObject, String idSuffix, EObject copyRef) {
-		List attributes = aRefObject.eClass().getEAllAttributes();
-		if (attributes != null) {
-			Iterator it = attributes.iterator();
-			EAttribute ra;
-			while (it.hasNext()) {
-				ra = (EAttribute) it.next();
-				copyAttribute(ra, aRefObject, idSuffix, copyRef);
-			}
-		}
-	}
-
-	/**
-	 * This method will iterate over the references of the receiver. If a reference's value is not
-	 * <code>null</code>, then a series of tests are done before setting the value with the
-	 * copied object, <code>copyRef</code>.
-	 * 
-	 * Tests: 1. Do nothing if the reference equals the metaEContainer or metaEContains references.
-	 */
-
-	protected void copyCurrentReferences(EObject aRefObject, String idSuffix, EObject copyRef) {
-		List references = aRefObject.eClass().getEAllReferences();
-		if (references != null) {
-			Iterator it = references.iterator();
-			EReference rr;
-			while (it.hasNext()) {
-				rr = (EReference) it.next();
-				if (shouldCopyReference(rr))
-					copyReference(rr, aRefObject, idSuffix, copyRef);
-			}
-		}
-	}
-
-	/**
-	 * Iterate over <code>anExtent</code> and copy each element to <code>copyExtent</code>.
-	 */
-	protected void copyExtent(EList anExtent, EList copyExtent) {
-		Iterator it = anExtent.iterator();
-		EObject refObject;
-		while (it.hasNext()) {
-			refObject = (EObject) it.next();
-			copyExtent.add(containmentCopy(refObject, null));
-		}
-	}
-
-	/**
-	 * Copy a many value attribute which is treated as a many valued reference.
-	 * 
-	 * Tests:
-	 * 
-	 * 1. If the type is <bold>not </bold> <code>null</code>, then set the value on
-	 * <code>copyRef</code> without making a copy. 2. If the type is <code>null</code>, then
-	 * obtain the list from <code>copyRef</code> and add a copy of each value from the original
-	 * list to it.
-	 */
-
-	protected void copyManyAttribute(EAttribute attribute, List aValue, EObject aRefObject, String idSuffix, EObject copyRef) {
-		if (attribute.getEType() == null)
-			copyRef.eSet(attribute, aValue);
-		else {
-			List copyList = (List) copyRef.eGet(attribute);
-			Iterator it = aValue.iterator();
-			Object next;
-			while (it.hasNext()) {
-				next = it.next();
-				if (next instanceof EObject)
-					copyList.add(containmentCopy((EObject) next, idSuffix));
-				else
-					copyList.add(next);
-			}
-		}
-	}
-
-	/**
-	 * This method will iterate over the references of the receiver. If a reference's value is not
-	 * <code>null</code>, then a series of tests are done before setting the value with the
-	 * copied object, <code>copyRef</code>.
-	 * 
-	 * Tests: 1. If the reference is many, obtain the list from the receiving object and make a copy
-	 * of each value if the reference is composite before adding to the list; otherwise, just add
-	 * each value to the of the <code>copyRef</code>.
-	 */
-
-	protected void copyManyReference(EReference aReference, List aList, EObject aRefObject, String idSuffix, EObject copyRef) {
-		if (!aList.isEmpty()) {
-			if (aReference.isContainment()) {
-				List copyList = (List) copyRef.eGet(aReference);
-				Iterator it = aList.iterator();
-				EObject targetValue;
-				while (it.hasNext()) {
-					targetValue = (EObject) it.next();
-					copyList.add(containmentCopy(targetValue, idSuffix));
-				}
-			} else
-				addDeferredManyReferenceCopy(aReference, aList, idSuffix, copyRef);
-		}
-	}
-
-	/**
-	 * This method will iterate over the references of the receiver. If a reference's value is not
-	 * <code>null</code>, then perform the copy.
-	 */
-
-	protected void copyReference(EReference aReference, EObject aRefObject, String idSuffix, EObject copyRef) {
-		if (aReference.isMany()) {
-			List value = (List) aRefObject.eGet(aReference);
-			if (value != null)
-				copyManyReference(aReference, value, aRefObject, idSuffix, copyRef);
-		} else if (aRefObject.eIsSet(aReference)) {
-			Object value = aRefObject.eGet(aReference);
-			copySingleReference(aReference, (EObject) value, aRefObject, idSuffix, copyRef);
-		}
-	}
-
-	/**
-	 * Copy all RefObjects from <code>aGroup</code> and add the copy back to <code>aGroup</code>.
-	 */
-	protected void copyRefObjects(CopyGroup aGroup) {
-		Association association;
-		EObject refObject;
-		String idSuffix;
-		if (aGroup.primGetRefObjects() != null) {
-			Iterator it = aGroup.primGetRefObjects().iterator();
-			while (it.hasNext()) {
-				association = (Association) it.next();
-				refObject = (EObject) association.getKey();
-				idSuffix = (String) association.getValue();
-				if (idSuffix == null)
-					idSuffix = aGroup.getDefaultIdSuffix();
-				aGroup.addCopied(containmentCopy(refObject, idSuffix));
-			}
-		}
-	}
-
-	/**
-	 * Copy all Resources from <code>aGroup</code> and add the copy back to <code>aGroup</code>.
-	 */
-	protected void copyResources(CopyGroup aGroup) {
-		Association association;
-		Resource resource;
-		String uri;
-		if (aGroup.primGetResources() != null) {
-			Iterator it = aGroup.primGetResources().iterator();
-			while (it.hasNext()) {
-				association = (Association) it.next();
-				resource = (Resource) association.getKey();
-				uri = (String) association.getValue();
-				Resource copied = containmentCopy(resource, uri);
-				copyModificationFlag(resource, copied);
-				aGroup.addCopied(copied);
-			}
-		}
-	}
-
-	/**
-	 * Copy a single value attribute.
-	 * 
-	 * Tests:
-	 * 
-	 * 1. If an attribute type is not <code>null</code> then it is an object type and it must be
-	 * copied. Do not copy the value if the attribute is an Enumeration type. 2. If an attribute
-	 * type is <bold>not </bold> <code>null</code> then copy the value before setting it on
-	 * <code>copyRef</code>.
-	 */
-
-	protected void copySingleAttribute(EAttribute attribute, Object aValue, EObject aRefObject, String idSuffix, EObject copyRef) {
-		if (attribute.getEType() == null) {
-			copyRef.eSet(attribute, aValue);
-		} else {
-			//MOF108
-			// if (attribute.isObjectType())
-			if (attribute.getEType() instanceof EClass)
-				copyRef.eSet(attribute, containmentCopy((EObject) aValue, idSuffix));
-			else
-				copyRef.eSet(attribute, aValue);
-		}
-	}
-
-	/**
-	 * This method will iterate over the references of the receiver. If a reference's value is not
-	 * <code>null</code>, then a series of tests are done before setting the value with the
-	 * copied object, <code>copyRef</code>.
-	 * 
-	 * Tests: 1. If the reference is <bold>not </bold> many, make a copy of the value if the
-	 * reference is composite before setting the value with <code>copyRef</code>; otherwise, just
-	 * set the value as is.
-	 */
-
-	protected void copySingleReference(EReference aReference, EObject aValue, EObject aRefObject, String idSuffix, EObject copyRef) {
-		//Exceptional case; the relationship is not the container relationship
-		//And is not navigable in the other direction; go ahead and copy
-		if (aValue != aRefObject.eContainer() || aReference.getEOpposite() == null) {
-			if (aReference.isContainment())
-				copyRef.eSet(aReference, containmentCopy(aValue, idSuffix));
-			else
-				addDeferredSingleReferenceCopy(aReference, aValue, idSuffix, copyRef);
-		}
-	}
-
-	/**
-	 * Copy all Resources and RefObjects within <code>aGroup</code> and add them to
-	 * <code>aGroup</code>. Non composite references will be deferred until all objects are
-	 * copied from <code>aGroup</code>.
-	 * 
-	 * Copy Resources first and then copy RefObjects.
-	 */
-	public static void createCopy(CopyGroup aGroup) {
-		EtoolsCopyUtility utility = new EtoolsCopyUtility();
-		utility.copy(aGroup);
-	}
-
-	/**
-	 * Copies attributes
-	 */
-	public static void createAttributeCopy(EObject aRefObject, EObject copyObject) {
-		EtoolsCopyUtility utility = new EtoolsCopyUtility();
-		utility.copyCurrentAttributes(aRefObject, null, copyObject);
-	}
-
-	/**
-	 * Copies all set attributes and references based on containment. Thus, it will copy the entire
-	 * containment tree. Use the idSuffix to define the suffix that will be appended to the existing
-	 * IDs of copied objects.
-	 */
-	public static EObject createCopy(EObject aRefObject) {
-		return createCopy(aRefObject, null);
-	}
-
-	/**
-	 * Copies all set attributes and references based on containment. Thus, it will copy the entire
-	 * containment tree. Use the idSuffix to define the suffix that will be appended to the existing
-	 * IDs of copied objects.
-	 */
-	public static EObject createCopy(EObject aRefObject, String idSuffix) {
-		EtoolsCopyUtility utility = new EtoolsCopyUtility();
-		return utility.copy(aRefObject, idSuffix);
-	}
-
-	/**
-	 * Copy <code>aResource</code> using <code>newUri</code> for the URI.
-	 */
-	public static Resource createCopy(Resource aResource, String newUri) {
-		EtoolsCopyUtility utility = new EtoolsCopyUtility();
-		return utility.copy(aResource, newUri);
-	}
-
-	protected void executeDeferredCopyActions() {
-		if (primGetDeferredReferenceCopies() != null) {
-			Iterator it = primGetDeferredReferenceCopies().iterator();
-			DeferredReferenceUtilityAction action;
-			while (it.hasNext()) {
-				action = (DeferredReferenceUtilityAction) it.next();
-				action.performAction();
-			}
-			primGetDeferredReferenceCopies().clear();
-		}
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (12/13/2000 9:17:35 PM)
-	 * 
-	 * @return java.util.HashMap
-	 */
-	protected java.util.HashMap getCopiedObjects() {
-		if (copiedObjects == null)
-			copiedObjects = new HashMap(200);
-		return copiedObjects;
-	}
-
-	protected java.util.HashMap getCopiedAdapters() {
-		if (copiedAdapters == null)
-			copiedAdapters = new HashMap(200);
-		return copiedAdapters;
-	}
-
-	/**
-	 * Return a cached copy.
-	 */
-	public EObject getCopy(EObject anObject) {
-		if (anObject == null)
-			return null;
-		return (EObject) getCopiedObjects().get(anObject);
-	}
-
-	/**
-	 * Return a cached copy, if none, return the argument.
-	 */
-	public EObject getCopyIfFound(EObject anObject) {
-		EObject copied = getCopy(anObject);
-		return copied == null ? anObject : copied;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (12/16/2000 9:11:32 AM)
-	 * 
-	 * @return java.util.List
-	 */
-	protected java.util.List getDeferredReferenceCopies() {
-		if (deferredReferenceCopies == null)
-			deferredReferenceCopies = new ArrayList(100);
-		return deferredReferenceCopies;
-	}
-
-	/**
-	 * Return an instance of EObject that is the same type as <code>aRefObject</code>.
-	 */
-	public EObject newInstance(EObject aRefObject) {
-		if (aRefObject == null)
-			return null;
-		EPackage epkg = (EPackage) aRefObject.eClass().eContainer();
-		EFactory factory = epkg.getEFactoryInstance();
-		EClass refObj = aRefObject.eClass();
-		return factory.create(refObj);
-	}
-
-	/**
-	 * Return an instance of Resource that uses the same ResourceFactory as the one used by
-	 * <code>aResource</code>. If <code>newUri</code> is <code>null</code> then use the URI
-	 * from <code>aResource</code>.
-	 */
-	public Resource newInstance(Resource aResource, String newUri) {
-		if (aResource == null)
-			return null;
-		Resource newResource;
-		String originalUri = aResource.getURI().toString();
-		newUri = newUri == null ? originalUri : newUri;
-
-		Resource.Factory factory = null;
-		if (aResource.getResourceSet() == null)
-			factory = Resource.Factory.Registry.INSTANCE.getFactory(URI.createURI(originalUri));
-		else
-			factory = aResource.getResourceSet().getResourceFactoryRegistry().getFactory(URI.createURI(originalUri));
-
-
-		newResource = factory.createResource(URI.createURI(newUri));
-		return newResource;
-	}
-
-	/**
-	 * Should the id be copied in the case where no suffix is specified? Defaults to false
-	 */
-	public boolean preserveIds() {
-		return preserveIds;
-	}
-
-	/**
-	 * Copies all set attributes and references based on containment. Thus, it will copy the entire
-	 * containment tree. Use the idSuffix to define the suffix that will be appended to the existing
-	 * IDs of copied objects. If an idSuffix does not exist, do not set an id on the copied object.
-	 */
-	protected EObject primCopy(EObject aRefObject, String idSuffix) {
-		if (aRefObject == null)
-			return null;
-		EObject copyRef = primCopyObject(aRefObject, idSuffix);
-
-		copyCurrentReferences(aRefObject, idSuffix, copyRef);
-		return copyRef;
-	}
-
-	/**
-	 * Copies all set attributes based on containment. Thus, it will copy the entire containment
-	 * tree. Use the idSuffix to define the suffix that will be appended to the existing IDs of
-	 * copied objects. If an idSuffix does not exist, do not set an id on the copied object.
-	 */
-	protected EObject primCopyObject(EObject aRefObject, String idSuffix) {
-		if (aRefObject == null)
-			return null;
-		EObject copyRef = newInstance(aRefObject);
-
-		recordCopy(aRefObject, copyRef);
-		copyCurrentAttributes(aRefObject, idSuffix, copyRef);
-		if (isCopyAdapters())
-			copyAdapters(aRefObject, copyRef);
-		return copyRef;
-	}
-
-	protected void copyAdapters(EObject aRefObject, EObject copyRef) {
-		List adapters = aRefObject.eAdapters();
-		for (int i = 0; i < adapters.size(); i++) {
-			Adapter adapter = (Adapter) adapters.get(i);
-			copyAdapter(aRefObject, copyRef, adapter);
-
-		}
-	}
-
-	protected void copyAdapter(EObject aRefObject, EObject copyRef, Adapter adapter) {
-		if (!(adapter instanceof CloneablePublic))
-			return;
-		CloneablePublic copyAdapter = (CloneablePublic) getCopiedAdapters().get(adapter);
-		if (copyAdapter == null) {
-			copyAdapter = (CloneablePublic) ((CloneablePublic) adapter).clone();
-			getCopiedAdapters().put(adapter, copyAdapter);
-		}
-		if (copyAdapter != null)
-			copyRef.eAdapters().add(copyAdapter);
-	}
-
-	/**
-	 * Copies all set attributes and references based on containment. Thus, it will copy the entire
-	 * containment tree. Use the idSuffix to define the suffix that will be appended to the existing
-	 * IDs of copied objects.
-	 */
-	protected Resource primCopy(Resource aResource, String newUri) {
-		if (aResource == null)
-			return null;
-		Resource copyResource = newInstance(aResource, newUri);
-		copyExtent(aResource.getContents(), copyResource.getContents());
-		return copyResource;
-	}
-
-	protected void copyModificationFlag(Resource aResource, Resource copied) {
-		if (aResource.isModified())
-			copied.setModified(true);
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (12/16/2000 9:11:32 AM)
-	 * 
-	 * @return java.util.List
-	 */
-	private java.util.List primGetDeferredReferenceCopies() {
-		return deferredReferenceCopies;
-	}
-
-	public void recordCopy(EObject aSource, EObject aCopy) {
-		getCopiedObjects().put(aSource, aCopy);
-	}
-
-	public void recordCopy(Adapter aSource, Adapter aCopy) {
-		getCopiedAdapters().put(aSource, aCopy);
-	}
-
-	/**
-	 * Should the id be copied in the case where no suffix is specified?
-	 */
-	public void setPreserveIds(boolean value) {
-		preserveIds = value;
-	}
-
-	protected boolean shouldCopyReference(EReference aReference) {
-		return aReference.isChangeable();
-	}
-
-	/**
-	 * @return
-	 */
-	public boolean isCopyAdapters() {
-		return copyAdapters;
-	}
-
-	/**
-	 * Flag used to indicate whether adapters should be copied as well. In order for an adapter to
-	 * be copied, it must implement the {@link CloneablePublic}interface.
-	 */
-	public void setCopyAdapters(boolean b) {
-		copyAdapters = b;
-	}
-
-}
-
-
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ExceptionHelper.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ExceptionHelper.java
deleted file mode 100644
index b5fc133..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ExceptionHelper.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.wst.common.frameworks.internal.enablement.nonui.IWFTWrappedException;
-
-
-
-/**
- * Utility class to factor common code for implementers of IArchiveWrappedException
- */
-public class ExceptionHelper {
-
-	/**
-	 * Utility class; cannot be instantiated
-	 */
-	private ExceptionHelper() {
-		super();
-	}
-
-	/**
-	 * Return the messages from
-	 * 
-	 * @exception and
-	 *                all nested exceptions, in order from outermost to innermost
-	 */
-	public static java.lang.String[] getAllMessages(IWFTWrappedException exception) {
-		List messages = new ArrayList(4);
-		messages.add(exception.getMessage());
-		Exception nested = exception.getNestedException();
-		while (nested != null) {
-			messages.add(nested.getMessage());
-			if (nested instanceof IWFTWrappedException)
-				nested = ((IWFTWrappedException) nested).getNestedException();
-			else
-				nested = null;
-		}
-		return (String[]) messages.toArray(new String[messages.size()]);
-	}
-
-	/**
-	 * Return the messages from
-	 * 
-	 * @exception and
-	 *                all nested exceptions, in order from outermost to innermost, concatenated as
-	 *                one
-	 */
-	public static String getConcatenatedMessages(IWFTWrappedException exception) {
-		String[] messages = getAllMessages(exception);
-		StringBuffer sb = new StringBuffer(256);
-		for (int i = 0; i < messages.length; i++) {
-			sb.append(messages[i]);
-			if (i < messages.length - 1)
-				sb.append('\n');
-		}
-		return sb.toString();
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ExtendedEcoreUtil.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ExtendedEcoreUtil.java
deleted file mode 100644
index a404cea..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ExtendedEcoreUtil.java
+++ /dev/null
@@ -1,246 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-import java.io.FileNotFoundException;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.common.util.WrappedException;
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.ENamedElement;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-
-
-
-public class ExtendedEcoreUtil extends EcoreUtil {
-	private static FileNotFoundDetector FILE_NOT_FOUND_DETECTOR;
-	private static String NAME_ATTRIBUTE_STRING = "name"; //$NON-NLS-1$
-
-
-	public interface FileNotFoundDetector {
-		boolean isFileNotFound(WrappedException wrappedEx);
-	}
-
-	public static void setFileNotFoundDetector(FileNotFoundDetector detector) {
-		FILE_NOT_FOUND_DETECTOR = detector;
-	}
-
-	public static FileNotFoundDetector getFileNotFoundDetector() {
-		if (FILE_NOT_FOUND_DETECTOR == null) {
-			FILE_NOT_FOUND_DETECTOR = new FileNotFoundDetector() {
-				public boolean isFileNotFound(WrappedException wrappedEx) {
-					if (getInnerFileNotFoundException(wrappedEx) != null)
-						return true;
-					return false;
-				}
-			};
-		}
-		return FILE_NOT_FOUND_DETECTOR;
-	}
-
-	public static FileNotFoundException getInnerFileNotFoundException(WrappedException wrappedEx) {
-		if (wrappedEx.exception() instanceof java.io.FileNotFoundException) {
-			return (FileNotFoundException) wrappedEx.exception();
-		} else if (wrappedEx.exception() instanceof WrappedException) {
-			return getInnerFileNotFoundException((WrappedException) wrappedEx.exception());
-		}
-		return null;
-	}
-
-	public static void eSetOrAdd(EObject obj, EStructuralFeature feature, Object value) {
-		eSetOrAdd(obj, feature, value, 0);
-	}
-
-	public static void eSetOrAdd(EObject obj, EStructuralFeature feature, Object value, int newIndex) {
-		if (feature.isMany() && value != null) {
-			if (newIndex >= 0)
-				((List) obj.eGet(feature)).add(newIndex, value);
-			else
-				((List) obj.eGet(feature)).add(value);
-		} else {
-			obj.eSet(feature, value);
-		}
-	}
-
-	public static void eUnsetOrRemove(EObject obj, EStructuralFeature feature, Object value) {
-		if (feature == null || feature.isMany())
-			((List) obj.eGet(feature)).remove(value);
-		else
-			obj.eUnset(feature);
-	}
-
-	public static boolean endsWith(URI sourceUri, URI testUri) {
-		//TODO Waiting on new emf URI API
-		String[] sourceSegments = sourceUri.segments();
-		String[] testSegments = testUri.segments();
-		int i = testSegments.length;
-		int j = sourceSegments.length;
-		if (j >= i) {
-			boolean test = true;
-
-			while (test && i > 0) {
-				i--;
-				j--;
-				test = testSegments[i].equals(sourceSegments[j]);
-			}
-			return test;
-		}
-		return false;
-	}
-
-	public static String getName(EObject obj) {
-		if (obj == null)
-			return null;
-		if (obj instanceof ENamedElement)
-			return ((ENamedElement) obj).getName();
-		List allAtts = obj.eClass().getEAllAttributes();
-		int size = allAtts.size();
-		EAttribute att, nameAttribute = null;
-		for (int i = 0; i < size; i++) {
-			att = (EAttribute) allAtts.get(i);
-			if (NAME_ATTRIBUTE_STRING.equals(att.getName())) {
-				nameAttribute = att;
-				break;
-			}
-		}
-		if (nameAttribute != null)
-			return (String) obj.eGet(nameAttribute);
-		return null;
-	}
-
-	public static void addLoadingTag(Resource resource) {
-		resource.eAdapters().add(IsLoadingDetector.INSTANCE);
-	}
-
-	public static void removeLoadingTag(Resource resource) {
-		resource.eAdapters().remove(IsLoadingDetector.INSTANCE);
-	}
-
-	/**
-	 * Return true if the resource is currently being loaded. This is determined by checking for the
-	 * IsLoadingDector in the list of eAdapters on the resource.
-	 * 
-	 * @param resource
-	 * @return boolean
-	 * 
-	 * @see addLoadingTag(Resource)
-	 * @see removeLoadingTag(Resource)
-	 *  
-	 */
-	public static boolean isLoading(Resource resource) {
-		if (resource != null) {
-			return resource.eAdapters().contains(IsLoadingDetector.INSTANCE);
-		}
-		return false;
-	}
-
-	public static Adapter createAdapterForLoading(Adapter targetAdapter, EObject targetObject) {
-		Resource res = targetObject.eResource();
-		if (res == null || isLoading(res))
-			return new IsLoadingProxyAdapter(targetAdapter, targetObject);
-		return targetAdapter;
-	}
-
-	public static void preRegisterPackage(String nsPrefix, EPackage.Descriptor descriptor) {
-		if (!EPackage.Registry.INSTANCE.containsKey(nsPrefix))
-			EPackage.Registry.INSTANCE.put(nsPrefix, descriptor);
-	}
-
-	/**
-	 * Remove this object from it's container, and make it and all it's children proxies
-	 */
-	public static void unload(EObject root) {
-		Resource res = root.eResource();
-		EObject container = root.eContainer();
-		if (container == null)
-			if (res != null)
-				res.getContents().remove(root);
-			else {
-				EStructuralFeature feature = root.eContainmentFeature();
-				if (feature != null)
-					eUnsetOrRemove(container, feature, root);
-			}
-		if (root != null && res != null)
-			becomeProxy(root, res);
-	}
-
-	/**
-	 * Turns this object and all it's children to proxies, and removes adapters precondition: The
-	 * object has been removed from it's container
-	 */
-	public static void becomeProxy(EObject root, Resource res) {
-		Iterator iter = root.eAllContents();
-		while (iter.hasNext()) {
-			doBecomeProxy((InternalEObject) iter.next(), res);
-		}
-		doBecomeProxy((InternalEObject) root, res);
-	}
-
-	protected static void doBecomeProxy(InternalEObject p, Resource res) {
-		String id = res.getURIFragment(p);
-		p.eSetProxyURI(res.getURI().appendFragment(id));
-		if (res instanceof XMLResource) {
-			((XMLResource) res).setID(p,null);
-		}
-		p.eAdapters().clear();
-	}
-
-	public static void removeProxy(EObject root, Resource res) {
-		Iterator iter = root.eAllContents();
-		while (iter.hasNext()) {
-			doRemoveProxy((InternalEObject) iter.next(), res);
-		}
-		doRemoveProxy((InternalEObject) root, res);
-	}
-
-	protected static void doRemoveProxy(InternalEObject p, Resource res) {
-		String id = p.eProxyURI().fragment();
-		if (res instanceof XMLResource) {
-			((XMLResource) res).setID(p, id);
-		}
-		p.eSetProxyURI(null);
-	}
-
-
-	/**
-	 * Ensures the passed object is not a proxy; if it is, throws an exception indicating the bad
-	 * HREF. If the object is null, does nothing.
-	 * 
-	 * @param object
-	 * @throws DanglingHREFException
-	 */
-	public static void checkProxy(EObject object) throws DanglingHREFException {
-		if (object == null || !object.eIsProxy())
-			return;
-		String msg = WFTUtilsResourceHandler.getString(WFTUtilsResourceHandler.DANGLING_HREF_ERROR_, new Object[]{((InternalEObject) object).eProxyURI()}); //$NON-NLS-1$
-		throw new DanglingHREFException(msg);
-	}
-
-	/**
-	 * Return true if o1 and o2 are not the same values. This implementation takes into account that
-	 * either parameter can be null.
-	 * 
-	 * @param o1
-	 * @param o2
-	 * @return
-	 */
-	public static boolean valueChanged(Object o1, Object o2) {
-		return (o1 == null ^ o2 == null) || (o1 == null || !o1.equals(o2));
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/FeatureValueConversionException.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/FeatureValueConversionException.java
deleted file mode 100644
index 0525a1f..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/FeatureValueConversionException.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-public class FeatureValueConversionException extends RuntimeException {
-
-	/**
-	 * Constructor for FeatureValueConversionException.
-	 */
-	public FeatureValueConversionException() {
-		super();
-	}
-
-	/**
-	 * Constructor for FeatureValueConversionException.
-	 * 
-	 * @param s
-	 */
-	public FeatureValueConversionException(String s) {
-		super(s);
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/FeatureValueConverter.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/FeatureValueConverter.java
deleted file mode 100644
index 786a687..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/FeatureValueConverter.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * Insert the type's description here. Creation date: (5/10/2001 2:46:54 PM)
- * 
- * @author: Administrator
- */
-public interface FeatureValueConverter {
-	static final FeatureValueConverter DEFAULT = new DefaultFeatureValueConverter();
-
-	/**
-	 * Convert
-	 * 
-	 * @aValue to the type of
-	 * @aFeature.
-	 */
-	Object convertValue(Object aValue, EStructuralFeature aFeature);
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ICommand.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ICommand.java
deleted file mode 100644
index d040995..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ICommand.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * @author John Mourra
- */
-public interface ICommand {
-
-	/*
-	 * This will contain the multi-selection of objects to deploy. This selection could be used to
-	 * filter elements within a Module. Any other setup code should be done here...
-	 */
-	void init(Object[] selection);
-
-	/**
-	 * @param resource
-	 * @param delta
-	 * @param context
-	 * @return
-	 * @throws CoreException
-	 */
-	public boolean execute(IResource resource, IResourceDelta delta, ICommandContext context) throws CoreException;
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ICommandContext.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ICommandContext.java
deleted file mode 100644
index bee3f61..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ICommandContext.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-import java.util.Map;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-
-/**
- * @author John Mourra
- */
-public interface ICommandContext {
-
-	/**
-	 * @return
-	 */
-	public IProgressMonitor getProgressMonitor();
-
-	/**
-	 * @return
-	 */
-	public Map getConfigurationProperties();
-
-	/**
-	 * @return
-	 */
-	public ResourceSet getResourceSet();
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/IDUtil.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/IDUtil.java
deleted file mode 100644
index 374ae13..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/IDUtil.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-
-public class IDUtil {
-
-	/**
-	 * This method is invoked to assign a unique ID to the object. The object must be contained in a
-	 * resource.
-	 */
-	public static void assignID(EObject object) {
-		Resource aResource = object.eResource();
-		if (aResource instanceof XMLResource)
-			assignID(object, (XMLResource) aResource);
-
-	}
-
-	public static String getOrAssignID(EObject object) {
-		Resource aResource = object.eResource();
-		if (aResource instanceof XMLResource)
-			return getOrAssignID(object, (XMLResource) aResource);
-		return null;
-	}
-
-	public static String getOrAssignID(EObject object, XMLResource aResource) {
-		String id = aResource.getID(object);
-		if (id == null)
-			return assignID(object, aResource);
-		return id;
-	}
-
-	public static String assignID(EObject object, XMLResource aResource) {
-		String name = getBaseIDForAssignment(object);
-		if (name == null)
-			return null;
-		String id = ensureUniqueID(aResource, name);
-		aResource.setID(object, id);
-		return id;
-	}
-
-	protected static String ensureUniqueID(XMLResource aResource, String baseIDName) {
-		baseIDName += "_"; //$NON-NLS-1$
-		//Change to use the current time instead of incremental numbers to help
-		//support team development.
-		long currentTime = System.currentTimeMillis();
-		String id = baseIDName + currentTime;
-		while (aResource.getEObject(id) != null) {
-			++currentTime;
-			id = baseIDName + currentTime;
-		}
-		return id;
-	}
-
-	protected static String getBaseIDForAssignment(EObject object) {
-		EClass metaO = object.eClass();
-		return metaO.getName();
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/InvalidPasswordCipherException.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/InvalidPasswordCipherException.java
deleted file mode 100644
index 5ff513b..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/InvalidPasswordCipherException.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-
-import org.omg.CORBA.UserException;
-
-public class InvalidPasswordCipherException extends UserException {
-}
-
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/InvalidPasswordDecodingException.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/InvalidPasswordDecodingException.java
deleted file mode 100644
index 2e16808..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/InvalidPasswordDecodingException.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-
-import org.omg.CORBA.UserException;
-
-public class InvalidPasswordDecodingException extends UserException {
-}
-
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/InvalidPasswordEncodingException.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/InvalidPasswordEncodingException.java
deleted file mode 100644
index dd882d7..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/InvalidPasswordEncodingException.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-
-import org.omg.CORBA.UserException;
-
-public class InvalidPasswordEncodingException extends UserException {
-}
-
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/IsLoadingDetector.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/IsLoadingDetector.java
deleted file mode 100644
index d7d114c..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/IsLoadingDetector.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- **************************************************************************************************/
-/*
- * Created on Apr 1, 2003
- * 
- * To change the template for this generated file go to Window>Preferences>Java>Code Generation>Code
- * and Comments
- */
-package org.eclipse.wst.common.internal.emf.utilities;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-
-
-public class IsLoadingDetector implements Adapter {
-	public static final IsLoadingDetector INSTANCE = new IsLoadingDetector();
-
-	private IsLoadingDetector() {
-	}
-
-	public void notifyChanged(Notification notification) {
-	}
-
-	public Notifier getTarget() {
-		return null;
-	}
-
-	public void setTarget(Notifier newTarget) {
-	}
-
-	public boolean isAdapterForType(Object type) {
-		return type == this;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/IsLoadingProxyAdapter.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/IsLoadingProxyAdapter.java
deleted file mode 100644
index d90669b..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/IsLoadingProxyAdapter.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Apr 1, 2003
- *
- * To change the template for this generated file go to
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
-package org.eclipse.wst.common.internal.emf.utilities;
-
-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.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-
-/**
- * @author DABERG
- * 
- * To change the template for this generated type comment go to Window>Preferences>Java>Code
- * Generation>Code and Comments
- */
-public class IsLoadingProxyAdapter extends AdapterImpl {
-	private Resource resource;
-	private Adapter targetAdapter;
-	private EObject targetObject;
-
-	public IsLoadingProxyAdapter(Adapter aTargetAdapter, EObject aTargetObject) {
-		targetAdapter = aTargetAdapter;
-		targetObject = aTargetObject;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification msg) {
-		if (resource != null) {
-			//listen for the remove of the loading adapter
-			if (msg.getFeatureID(null) == Resource.RESOURCE__IS_LOADED && msg.getEventType() == Notification.SET) {
-				removeProxySupport();
-				reset();
-			}
-		} else if (cacheResource()) {
-			targetAdapter.notifyChanged(msg);
-			reset();
-		}
-	}
-
-	/**
-	 * Cache the resource variable and return true if we removed the proxy support.
-	 */
-	private boolean cacheResource() {
-		if (getTarget() != null) {
-			EObject eObj = (EObject) getTarget();
-			resource = eObj.eResource();
-			if (resource != null) {
-				eObj.eAdapters().remove(this);
-				if (ExtendedEcoreUtil.isLoading(resource))
-					resource.eAdapters().add(this);
-				else {
-					targetObject.eAdapters().add(targetAdapter);
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 *  
-	 */
-	private void removeProxySupport() {
-		getTarget().eAdapters().remove(this);
-		targetObject.eAdapters().add(targetAdapter);
-	}
-
-	private void reset() {
-		resource = null;
-		targetAdapter = null;
-		targetObject = null;
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/Namespace.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/Namespace.java
deleted file mode 100644
index 1a4a736..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/Namespace.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- **************************************************************************************************/
-/*
- * Created on Aug 20, 2003
- *  
- */
-package org.eclipse.wst.common.internal.emf.utilities;
-
-
-public class Namespace {
-
-	protected String prefix;
-	protected String nsURI;
-
-
-	public Namespace(String prefix, String uri) {
-		this.prefix = prefix;
-		this.nsURI = uri;
-	}
-
-	public String getNsURI() {
-		return nsURI;
-	}
-
-	public String getPrefix() {
-		return prefix;
-	}
-
-	public void setNsURI(String string) {
-		nsURI = string;
-	}
-
-	public void setPrefix(String string) {
-		prefix = string;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/NamespaceAdapter.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/NamespaceAdapter.java
deleted file mode 100644
index a21a016..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/NamespaceAdapter.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Aug 20, 2003
- *
- */
-package org.eclipse.wst.common.internal.emf.utilities;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.common.notify.impl.NotificationImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.EStructuralFeatureImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-
-
-/**
- * Internal class used to hold namespaces parsed from an XML file using the xmlns:prefix="aURI"
- * syntax
- */
-public class NamespaceAdapter extends AdapterImpl implements CloneablePublic {
-
-	protected final static String ADAPTER_TYPE = NamespaceAdapter.class.getName();
-	protected Map prefixesToNS;
-	protected List namespaces;
-
-	public final static EStructuralFeature NOTIFICATION_FEATURE = new EStructuralFeatureImpl() {
-	};
-
-	private static class Notification extends NotificationImpl {
-
-		/**
-		 * @param eventType
-		 * @param oldValue
-		 * @param newValue
-		 */
-		public Notification(int eventType, Object oldValue, Object newValue) {
-			super(eventType, oldValue, newValue);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.impl.NotificationImpl#getFeature()
-		 */
-		public Object getFeature() {
-			return NOTIFICATION_FEATURE;
-		}
-	}
-
-	protected NamespaceAdapter() {
-		super();
-	}
-
-	public static void addNamespace(String prefix, String uri, EObject obj) {
-		if (obj == null)
-			return;
-		NamespaceAdapter adapter = getAdapter(obj);
-		if (adapter != null)
-			adapter.addNamespace(prefix, uri);
-	}
-
-	public static void removeNamespace(String prefix, EObject obj) {
-		if (obj == null)
-			return;
-		NamespaceAdapter adapter = retrieveExistingAdapter(obj);
-		if (adapter != null)
-			adapter.removeNamespace(prefix);
-	}
-
-	/**
-	 * Facade method for resolving prefixes to an actual namespace URI. Used for objects contained
-	 * by instances of {@link com.ibm.etools.emf2xml.TranslatorResource}. Walks up the object
-	 * containment path until a namespace is found, or returns null.
-	 */
-	public static String getResolvedNamespaceURI(String prefix, EObject obj) {
-		if (prefix == null || obj == null)
-			return null;
-		EObject container = obj;
-		String nsURI;
-		while (container != null) {
-			nsURI = getNamespaceURIAtThisLevel(prefix, container);
-			if (nsURI != null)
-				return nsURI;
-			container = container.eContainer();
-		}
-		return null;
-	}
-
-	public static String getNamespaceURIAtThisLevel(String prefix, EObject obj) {
-		if (obj == null)
-			return null;
-		NamespaceAdapter adapter = retrieveExistingAdapter(obj);
-		return adapter == null ? null : adapter.getNamespaceURI(prefix);
-	}
-
-	public static List getNamespaces(EObject obj) {
-		if (obj == null)
-			return Collections.EMPTY_LIST;
-		NamespaceAdapter adapter = retrieveExistingAdapter(obj);
-		return adapter == null ? null : adapter.getNamespaces();
-
-	}
-
-	protected static NamespaceAdapter retrieveExistingAdapter(EObject obj) {
-		return (NamespaceAdapter) EcoreUtil.getExistingAdapter(obj, ADAPTER_TYPE);
-	}
-
-	protected static NamespaceAdapter getAdapter(EObject obj) {
-		NamespaceAdapter adapter = retrieveExistingAdapter(obj);
-		return adapter == null ? createAdapter(obj) : adapter;
-	}
-
-	protected static NamespaceAdapter createAdapter(EObject obj) {
-		NamespaceAdapter adapter = new NamespaceAdapter();
-		adapter.setTarget(obj);
-		obj.eAdapters().add(adapter);
-		return adapter;
-	}
-
-	protected void addNamespace(String prefix, String uri) {
-		Namespace ns = new Namespace(prefix, uri);
-		if (namespaces == null)
-			namespaces = new ArrayList();
-		if (prefixesToNS == null)
-			prefixesToNS = new HashMap();
-
-		prefixesToNS.put(prefix, ns);
-		namespaces.add(ns);
-		fireNotification(org.eclipse.emf.common.notify.Notification.ADD, null, ns);
-
-	}
-
-	protected void removeNamespace(String prefix) {
-		Namespace ns = null;
-		if (prefixesToNS != null)
-			ns = (Namespace) prefixesToNS.get(prefix);
-
-		if (ns != null)
-			namespaces.remove(ns);
-		fireNotification(org.eclipse.emf.common.notify.Notification.REMOVE, ns, null);
-	}
-
-	protected String getNamespaceURI(String prefix) {
-		if (prefixesToNS == null)
-			return null;
-		Namespace ns = (Namespace) prefixesToNS.get(prefix);
-		if (ns != null)
-			return ns.getNsURI();
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		return ADAPTER_TYPE.equals(type);
-	}
-
-	public List getNamespaces() {
-		return namespaces == null ? Collections.EMPTY_LIST : Collections.unmodifiableList(namespaces);
-	}
-
-	protected void fireNotification(int type, Object oldValue, Object newValue) {
-		if (target != null)
-			target.eNotify(new Notification(type, oldValue, newValue));
-	}
-
-	public boolean hasNamespaces() {
-		return namespaces != null && !namespaces.isEmpty();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf.ecore.utilities.CloneablePublic#clone()
-	 */
-	public Object clone() {
-		NamespaceAdapter result = new NamespaceAdapter();
-		if (hasNamespaces()) {
-			for (int i = 0; i < namespaces.size(); i++) {
-				Namespace ns = (Namespace) namespaces.get(i);
-				result.addNamespace(ns.getPrefix(), ns.getNsURI());
-			}
-		}
-		return result;
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/PassthruEncoderDecoder.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/PassthruEncoderDecoder.java
deleted file mode 100644
index e684059..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/PassthruEncoderDecoder.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-
-/**
- * A passthru EncoderDecoder implementation
- */
-public class PassthruEncoderDecoder extends EncoderDecoderAdapter implements EncoderDecoder {
-	public static final PassthruEncoderDecoder INSTANCE = new PassthruEncoderDecoder();
-	public static final String KEY = PassthruEncoderDecoder.class.getName();
-
-	/**
-	 * EncoderDecoderAdapter constructor comment.
-	 */
-	private PassthruEncoderDecoder() {
-		super();
-	}
-
-	/**
-	 * Returns a decoded version of the value.
-	 */
-	public String decode(String value) {
-		return value;
-	}
-
-	/**
-	 * Returns an encoded version of the value.
-	 */
-	public String encode(String value) {
-		return value;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/PasswordCipherUtil.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/PasswordCipherUtil.java
deleted file mode 100644
index f237158..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/PasswordCipherUtil.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-public class PasswordCipherUtil {
-	private static final String DEFAULT_SUPPORTED_CRYPTO_ALGORITHMS[] = {"xor"}; //$NON-NLS-1$
-	private static String _supported_crypto_algorithms[];
-
-	public PasswordCipherUtil() {
-	}
-
-	public static byte[] decipher(byte abyte0[], String s) throws InvalidPasswordCipherException, UnsupportedCryptoAlgorithmException {
-		if (s == null)
-			throw new UnsupportedCryptoAlgorithmException();
-		byte abyte1[] = null;
-		if (s.equalsIgnoreCase(DEFAULT_SUPPORTED_CRYPTO_ALGORITHMS[0]))
-			abyte1 = xor(abyte0);
-		else
-			throw new UnsupportedCryptoAlgorithmException();
-
-		if (abyte1 == null)
-			throw new InvalidPasswordCipherException();
-
-		return abyte1;
-	}
-
-	public static byte[] encipher(byte abyte0[], String s) throws InvalidPasswordCipherException, UnsupportedCryptoAlgorithmException {
-		if (s == null)
-			throw new UnsupportedCryptoAlgorithmException();
-		byte abyte1[] = null;
-		if (s.equalsIgnoreCase(DEFAULT_SUPPORTED_CRYPTO_ALGORITHMS[0]))
-			abyte1 = xor(abyte0);
-		else
-			throw new UnsupportedCryptoAlgorithmException();
-
-		if (abyte1 == null)
-			throw new InvalidPasswordCipherException();
-		return abyte1;
-	}
-
-	public static String[] getSupportedCryptoAlgorithms() {
-		return _supported_crypto_algorithms;
-	}
-
-	private static byte[] xor(byte abyte0[]) {
-		byte abyte1[] = null;
-		if (abyte0 != null) {
-			abyte1 = new byte[abyte0.length];
-			for (int i = 0; i < abyte0.length; i++)
-				abyte1[i] = (byte) (0x5f ^ abyte0[i]);
-		}
-		return abyte1;
-	}
-
-	static {
-		_supported_crypto_algorithms = null;
-		if (_supported_crypto_algorithms == null)
-			_supported_crypto_algorithms = DEFAULT_SUPPORTED_CRYPTO_ALGORITHMS;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/PasswordEncoderDecoder.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/PasswordEncoderDecoder.java
deleted file mode 100644
index 2c82ced..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/PasswordEncoderDecoder.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-public class PasswordEncoderDecoder extends EncoderDecoderAdapter implements EncoderDecoder {
-	public static final String KEY = "password-security-coder"; //$NON-NLS-1$
-
-	public PasswordEncoderDecoder() {
-	}
-
-	public String decode(String s) {
-		return PasswordUtil.passwordDecode(s);
-	}
-
-	public String encode(String s) {
-		return PasswordUtil.passwordEncode(s);
-	}
-
-	public Object getKey() {
-		return KEY;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/PasswordUtil.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/PasswordUtil.java
deleted file mode 100644
index 012f2c2..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/PasswordUtil.java
+++ /dev/null
@@ -1,331 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-
-import java.io.UnsupportedEncodingException;
-
-public class PasswordUtil {
-	public static final String STRING_CONVERSION_CODE = "UTF8"; //$NON-NLS-1$
-	public static final String EMPTY_STRING = ""; //$NON-NLS-1$
-	public static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
-	public static final String DEFAULT_CRYPTO_ALGORITHM;
-	private static final String SUPPORTED_CRYPTO_ALGORITHMS[];
-	private static final byte BASE64_ENCODE_MAP[];
-	private static final byte BASE64_DECODE_MAP[];
-
-	public PasswordUtil() {
-	}
-
-	public static String decode(String s) throws InvalidPasswordDecodingException, UnsupportedCryptoAlgorithmException {
-		if (s == null)
-			throw new InvalidPasswordDecodingException();
-		String s1 = getCryptoAlgorithm(s);
-		if (s1 == null)
-			throw new InvalidPasswordDecodingException();
-
-		if (!isValidCryptoAlgorithm(s1))
-			throw new UnsupportedCryptoAlgorithmException();
-
-		String s2 = decode_password(removeCryptoAlgorithmTag(s), s1);
-		if (s2 == null)
-			throw new InvalidPasswordDecodingException();
-		return s2;
-	}
-
-	public static String encode(String s) throws InvalidPasswordEncodingException, UnsupportedCryptoAlgorithmException {
-		return encode(s, DEFAULT_CRYPTO_ALGORITHM);
-	}
-
-	public static String encode(String s, String s1) throws InvalidPasswordEncodingException, UnsupportedCryptoAlgorithmException {
-		if (!isValidCryptoAlgorithm(s1))
-			throw new UnsupportedCryptoAlgorithmException();
-		if (s == null)
-			throw new InvalidPasswordEncodingException();
-
-		if (getCryptoAlgorithm(s) != null)
-			throw new InvalidPasswordEncodingException();
-
-		String s2 = encode_password(s.trim(), s1.trim());
-		if (s2 == null)
-			throw new InvalidPasswordEncodingException();
-		return s2;
-	}
-
-	public static String getCryptoAlgorithm(String s) {
-		String s1 = null;
-		if (s != null) {
-			s = s.trim();
-			if (s.length() >= 2) {
-				int i = s.indexOf("{"); //$NON-NLS-1$
-				if (i == 0) {
-					int j = s.indexOf("}", ++i); //$NON-NLS-1$
-					if (j > 0)
-						if (i < j)
-							s1 = s.substring(i, j).trim();
-						else
-							s1 = EMPTY_STRING;
-				}
-			}
-		}
-		return s1;
-	}
-
-	public static String getCryptoAlgorithmTag(String s) {
-		String s1 = null;
-		String s2 = getCryptoAlgorithm(s);
-		if (s2 != null) {
-			StringBuffer stringbuffer = new StringBuffer("{"); //$NON-NLS-1$
-			if (s2.length() > 0)
-				stringbuffer.append(s2);
-			stringbuffer.append("}"); //$NON-NLS-1$
-			s1 = stringbuffer.toString();
-		}
-		return s1;
-	}
-
-	public static boolean isValidCryptoAlgorithm(String s) {
-		if (s != null) {
-			s = s.trim();
-			if (s.length() == 0)
-				return true;
-			for (int i = 0; i < SUPPORTED_CRYPTO_ALGORITHMS.length; i++)
-				if (s.equalsIgnoreCase(SUPPORTED_CRYPTO_ALGORITHMS[i]))
-					return true;
-		}
-		return false;
-	}
-
-	public static boolean isValidCryptoAlgorithmTag(String s) {
-		return isValidCryptoAlgorithm(getCryptoAlgorithm(s));
-	}
-
-	public static String passwordDecode(String s) {
-		if (s == null)
-			return null;
-		String s1 = getCryptoAlgorithm(s);
-		if (s1 == null)
-			return s;
-		if (!isValidCryptoAlgorithm(s1))
-			return null;
-		return decode_password(removeCryptoAlgorithmTag(s), s1);
-	}
-
-	public static String passwordEncode(String s) {
-		return passwordEncode(s, DEFAULT_CRYPTO_ALGORITHM);
-	}
-
-	public static String passwordEncode(String s, String s1) {
-		if (!isValidCryptoAlgorithm(s1))
-			return null;
-		if (s == null)
-			return null;
-		String s2 = getCryptoAlgorithm(s);
-		if (s2 != null) {
-			if (s2.equalsIgnoreCase(s1.trim()))
-				return s.trim();
-			return null;
-		}
-		return encode_password(s.trim(), s1.trim());
-	}
-
-	public static String removeCryptoAlgorithmTag(String s) {
-		String s1 = null;
-		if (s != null) {
-			s = s.trim();
-			if (s.length() >= 2) {
-				int i = s.indexOf("{"); //$NON-NLS-1$
-				if (i == 0) {
-					int j = s.indexOf("}", ++i); //$NON-NLS-1$
-					if (j > 0)
-						if (++j < s.length())
-							s1 = s.substring(j).trim();
-						else
-							s1 = EMPTY_STRING;
-				}
-			}
-		}
-		return s1;
-	}
-
-	private static byte[] convert_to_bytes(String s) {
-		byte abyte0[] = null;
-		if (s != null)
-			if (s.length() == 0)
-				abyte0 = EMPTY_BYTE_ARRAY;
-			else
-				try {
-					abyte0 = s.getBytes(STRING_CONVERSION_CODE);
-				} catch (UnsupportedEncodingException unsupportedencodingexception) {
-					abyte0 = null;
-				}
-		return abyte0;
-	}
-
-	private static String convert_to_string(byte abyte0[]) {
-		String s = null;
-		if (abyte0 != null)
-			if (abyte0.length == 0)
-				s = EMPTY_STRING;
-			else
-				try {
-					s = new String(abyte0, STRING_CONVERSION_CODE);
-				} catch (UnsupportedEncodingException unsupportedencodingexception) {
-					s = null;
-				}
-		return s;
-	}
-
-	private static byte[] convert_viewable_to_bytes(String s) {
-		byte abyte0[] = null;
-		if (s != null)
-			if (s.length() == 0)
-				abyte0 = EMPTY_BYTE_ARRAY;
-			else
-				try {
-					abyte0 = base64Decode(convert_to_bytes(s));
-				} catch (Exception exception) {
-					abyte0 = null;
-				}
-		return abyte0;
-	}
-
-	private static byte[] base64Decode(byte abyte0[]) {
-		int i;
-		for (i = abyte0.length; abyte0[--i] == 61;);
-		byte abyte1[] = new byte[(i + 1) - abyte0.length / 4];
-		for (int j = 0; j < abyte0.length; j++)
-			abyte0[j] = BASE64_DECODE_MAP[abyte0[j]];
-		int k = abyte1.length - 2;
-		int l = 0;
-		int i1;
-		for (i1 = 0; l < k; i1 += 4) {
-			abyte1[l] = (byte) (abyte0[i1] << 2 & 0xff | abyte0[i1 + 1] >>> 4 & 0x3);
-			abyte1[l + 1] = (byte) (abyte0[i1 + 1] << 4 & 0xff | abyte0[i1 + 2] >>> 2 & 0xf);
-			abyte1[l + 2] = (byte) (abyte0[i1 + 2] << 6 & 0xff | abyte0[i1 + 3] & 0x3f);
-			l += 3;
-		}
-		if (l < abyte1.length) {
-			abyte1[l++] = (byte) (abyte0[i1] << 2 & 0xff | abyte0[i1 + 1] >>> 4 & 0x3);
-			if (l < abyte1.length)
-				abyte1[l] = (byte) (abyte0[i1 + 1] << 4 & 0xff | abyte0[i1 + 2] >>> 2 & 0xf);
-		}
-		return abyte1;
-	}
-
-	private static String convert_viewable_to_string(byte abyte0[]) {
-		String s = null;
-		if (abyte0 != null)
-			if (abyte0.length == 0)
-				s = EMPTY_STRING;
-			else
-				try {
-					s = convert_to_string(base64Encode(abyte0));
-				} catch (Exception exception) {
-					s = null;
-				}
-		return s;
-	}
-
-	private static byte[] base64Encode(byte abyte0[]) {
-		byte abyte1[] = new byte[((abyte0.length + 2) / 3) * 4];
-		int i = 0;
-		int j = 0;
-		for (; i < abyte0.length - 2; i += 3) {
-			abyte1[j++] = BASE64_ENCODE_MAP[abyte0[i] >>> 2 & 0x3f];
-			abyte1[j++] = BASE64_ENCODE_MAP[abyte0[i + 1] >>> 4 & 0xf | abyte0[i] << 4 & 0x3f];
-			abyte1[j++] = BASE64_ENCODE_MAP[abyte0[i + 2] >>> 6 & 0x3 | abyte0[i + 1] << 2 & 0x3f];
-			abyte1[j++] = BASE64_ENCODE_MAP[abyte0[i + 2] & 0x3f];
-		}
-		if (i < abyte0.length) {
-			abyte1[j++] = BASE64_ENCODE_MAP[abyte0[i] >>> 2 & 0x3f];
-			if (i < abyte0.length - 1) {
-				abyte1[j++] = BASE64_ENCODE_MAP[abyte0[i + 1] >>> 4 & 0xf | abyte0[i] << 4 & 0x3f];
-				abyte1[j++] = BASE64_ENCODE_MAP[abyte0[i + 1] << 2 & 0x3f];
-			} else {
-				abyte1[j++] = BASE64_ENCODE_MAP[abyte0[i] << 4 & 0x3f];
-			}
-		}
-		for (; j < abyte1.length; j++)
-			abyte1[j] = 61;
-		return abyte1;
-	}
-
-	private static String decode_password(String s, String s1) {
-		StringBuffer stringbuffer = new StringBuffer();
-		if (s1.length() == 0) {
-			stringbuffer.append(s);
-		} else {
-			String s2 = null;
-			if (s.length() > 0) {
-				byte abyte0[] = convert_viewable_to_bytes(s);
-				if (abyte0 == null)
-					return null;
-				if (abyte0.length > 0) {
-					byte abyte1[] = null;
-					try {
-						abyte1 = PasswordCipherUtil.decipher(abyte0, s1);
-					} catch (InvalidPasswordCipherException invalidpasswordcipherexception) {
-						return null;
-					} catch (UnsupportedCryptoAlgorithmException unsupportedcryptoalgorithmexception) {
-						return null;
-					}
-					if (abyte1 != null && abyte1.length > 0)
-						s2 = convert_to_string(abyte1);
-				}
-			}
-			if (s2 != null && s2.length() > 0)
-				stringbuffer.append(s2);
-		}
-		return stringbuffer.toString();
-	}
-
-	private static String encode_password(String s, String s1) {
-		StringBuffer stringbuffer = new StringBuffer("{"); //$NON-NLS-1$
-		if (s1.length() == 0) {
-			stringbuffer.append("}").append(s); //$NON-NLS-1$
-		} else {
-			stringbuffer.append(s1).append("}"); //$NON-NLS-1$
-			String s2 = null;
-			if (s.length() > 0) {
-				byte abyte0[] = convert_to_bytes(s);
-				if (abyte0.length > 0) {
-					byte abyte1[] = null;
-					try {
-						abyte1 = PasswordCipherUtil.encipher(abyte0, s1);
-					} catch (InvalidPasswordCipherException invalidpasswordcipherexception) {
-						return null;
-					} catch (UnsupportedCryptoAlgorithmException unsupportedcryptoalgorithmexception) {
-						return null;
-					}
-					if (abyte1 != null && abyte1.length > 0) {
-						s2 = convert_viewable_to_string(abyte1);
-						if (s2 == null)
-							return null;
-					}
-				}
-			}
-			if (s2 != null && s2.length() > 0)
-				stringbuffer.append(s2);
-		}
-		return stringbuffer.toString();
-	}
-
-	static {
-		SUPPORTED_CRYPTO_ALGORITHMS = PasswordCipherUtil.getSupportedCryptoAlgorithms();
-		DEFAULT_CRYPTO_ALGORITHM = SUPPORTED_CRYPTO_ALGORITHMS[0];
-		byte abyte0[] = {65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47};
-		BASE64_ENCODE_MAP = abyte0;
-		BASE64_DECODE_MAP = new byte[128];
-		for (int i = 0; i < BASE64_DECODE_MAP.length; i++)
-			BASE64_DECODE_MAP[i] = -1;
-		for (int j = 0; j < BASE64_ENCODE_MAP.length; j++)
-			BASE64_DECODE_MAP[BASE64_ENCODE_MAP[j]] = (byte) j;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/PleaseMigrateYourCodeError.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/PleaseMigrateYourCodeError.java
deleted file mode 100644
index 784991d..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/PleaseMigrateYourCodeError.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-
-
-/**
- * @author mdelder
- *  
- */
-public class PleaseMigrateYourCodeError extends Error {
-
-	//TODO Delete me
-	public PleaseMigrateYourCodeError() {
-		super(WFTUtilsResourceHandler.PleaseMigrateYourCodeError_ERROR_0); //$NON-NLS-1$
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ResourceDependencyRegister.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ResourceDependencyRegister.java
deleted file mode 100644
index 34ff643..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ResourceDependencyRegister.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-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.ecore.resource.URIConverter;
-
-public class ResourceDependencyRegister {
-	protected static Map GLOBAL_DEPENDENCIES = new HashMap();
-	private static String RESOURCE_DEPENDENCY_TYPE = "ResourceDependencyAdapter"; //$NON-NLS-1$
-	protected Map localDependencies = new HashMap();
-
-	class ResourceDependencyAdapter extends AdapterImpl {
-		Resource dependentResource;
-
-		ResourceDependencyAdapter(Resource aDependentResource) {
-			dependentResource = aDependentResource;
-			dependentResource.eAdapters().add(this);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#isAdapterForType(java.lang.Object)
-		 */
-		public boolean isAdapterForType(Object type) {
-			return RESOURCE_DEPENDENCY_TYPE.equals(type);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(org.eclipse.emf.common.notify.Notification)
-		 */
-		public void notifyChanged(Notification msg) {
-			//Listen for unloads and removes
-			switch (msg.getFeatureID(null)) {
-				case Resource.RESOURCE__IS_LOADED :
-					if (msg.getNotifier() != dependentResource && msg.getOldBooleanValue() && !msg.getNewBooleanValue())
-						dependentResource.unload();
-					break;
-				case Resource.RESOURCE__RESOURCE_SET :
-					if (msg.getOldValue() != null && msg.getNewValue() == null) {
-						if (msg.getNotifier() == dependentResource)
-							((Resource) getTarget()).eAdapters().remove(this);
-						else {
-							ResourceSet set = dependentResource.getResourceSet();
-							if (set != null)
-								set.getResources().remove(dependentResource);
-						}
-					}
-					break;
-			}
-		}
-	}
-
-	class ResourceSetListener extends AdapterImpl {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(org.eclipse.emf.common.notify.Notification)
-		 */
-		public void notifyChanged(Notification msg) {
-			if (msg.getEventType() == Notification.ADD)
-				proccessAddedResource((ResourceSet) msg.getNotifier(), (Resource) msg.getNewValue());
-		}
-	}
-
-	/**
-	 * Register a dependency between two URIs. The first parameter, aURIString, is the one that
-	 * dependentUriString depends on.
-	 * 
-	 * @param aUriString
-	 *            java.lang.String
-	 * @param dependentUriString
-	 *            java.lang.String
-	 */
-	public static void registerDependency(URI targetURI, URI dependentURI) {
-		if (targetURI != null && dependentURI != null) {
-			GLOBAL_DEPENDENCIES.put(dependentURI, targetURI);
-		}
-	}
-
-	public ResourceDependencyRegister(ResourceSet aResourceSet) {
-		initialize(aResourceSet);
-	}
-
-
-	ResourceDependencyRegister() {
-		super();
-	}
-
-	/**
-	 * @param aResourceSet
-	 */
-	protected void initialize(ResourceSet aResourceSet) {
-		if (aResourceSet == null)
-			throw new NullPointerException("The ResourceSet cannot be null."); //$NON-NLS-1$
-		initializeLocalDependencies(aResourceSet);
-		setupDependencyAdapters(aResourceSet);
-		setupResourceSetListener(aResourceSet);
-	}
-
-	/**
-	 * @param aResourceSet
-	 */
-	protected void setupResourceSetListener(ResourceSet aResourceSet) {
-		aResourceSet.eAdapters().add(new ResourceSetListener());
-	}
-
-	/**
-	 * @param aResourceSet
-	 * @return
-	 */
-	protected void setupDependencyAdapters(ResourceSet aResourceSet) {
-		if (!aResourceSet.getResources().isEmpty()) {
-			Iterator it = localDependencies.entrySet().iterator();
-			Map.Entry entry;
-			URI dependentURI, targetURI;
-			while (it.hasNext()) {
-				entry = (Map.Entry) it.next();
-				dependentURI = (URI) entry.getKey();
-				targetURI = (URI) entry.getValue();
-				setupDependencyAdapter(aResourceSet, dependentURI, targetURI);
-			}
-		}
-	}
-
-	/**
-	 * @param aResourceSet
-	 * @param dependentURI
-	 * @param targetURI
-	 * @return
-	 */
-	protected void setupDependencyAdapter(ResourceSet aResourceSet, URI dependentURI, URI targetURI) {
-		Resource dependent = aResourceSet.getResource(dependentURI, false);
-		if (dependent != null)
-			setupDependencyAdapter(dependent, targetURI, aResourceSet);
-	}
-
-	protected void setupDependencyAdapter(Resource dependent, URI targetURI, ResourceSet aResourceSet) {
-		Resource target = aResourceSet.getResource(targetURI, false);
-		if (target == null)
-			target = aResourceSet.createResource(targetURI);
-		target.eAdapters().add(new ResourceDependencyAdapter(dependent));
-	}
-
-	/**
-	 * @param aResourceSet
-	 */
-	protected void initializeLocalDependencies(ResourceSet aResourceSet) {
-		URIConverter converter = aResourceSet.getURIConverter();
-		initializeLocalDependencies(converter);
-	}
-
-	/**
-	 * @param aResourceSet
-	 */
-	protected void initializeLocalDependencies(URIConverter aConverter) {
-		Iterator it = GLOBAL_DEPENDENCIES.entrySet().iterator();
-		Map resolved = new HashMap();
-		Map.Entry entry;
-		URI key, value;
-		while (it.hasNext()) {
-			entry = (Map.Entry) it.next();
-			key = (URI) entry.getKey();
-			value = (URI) entry.getValue();
-			key = normalize(key, aConverter, resolved);
-			value = normalize(value, aConverter, resolved);
-			localDependencies.put(key, value);
-		}
-	}
-
-	/**
-	 * @param relativeURI
-	 * @param converter
-	 * @param resolved
-	 * @return
-	 */
-	protected URI normalize(URI relativeURI, URIConverter converter, Map resolved) {
-		URI result = (URI) resolved.get(relativeURI);
-		if (result == null) {
-			result = converter.normalize(relativeURI);
-			resolved.put(relativeURI, result);
-		}
-		return result;
-	}
-
-	/**
-	 * @param set
-	 * @param resource
-	 */
-	protected void proccessAddedResource(ResourceSet set, Resource resource) {
-		URI targetURI = (URI) localDependencies.get(resource.getURI());
-		if (targetURI != null)
-			setupDependencyAdapter(resource, targetURI, set);
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/Revisit.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/Revisit.java
deleted file mode 100644
index 2ec67d4..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/Revisit.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-
-public class Revisit {
-
-	/**
-	 * Revisit constructor comment.
-	 */
-	public Revisit() {
-		super();
-	}
-
-	public static void revisit() {
-	}
-
-
-	public static void unComment() {
-	}
-
-	public static void toDo() {
-	}
-
-	public static void refactor() {
-	}
-
-	public static void removeDeprecatedMethod() {
-	}
-
-	public static void deleteMe() {
-	}
-
-	public static void reviewDesign() {
-	}
-}
-
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/StringUtil.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/StringUtil.java
deleted file mode 100644
index d1f2308..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/StringUtil.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Mar 18, 2003
- *
- * To change this generated comment go to 
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
-package org.eclipse.wst.common.internal.emf.utilities;
-
-/**
- * @author schacher
- * 
- * To change this generated comment go to Window>Preferences>Java>Code Generation>Code and Comments
- */
-public class StringUtil {
-	/**
-	 * Enhanced equality check for two string parameters, that takes into consideration null values.
-	 * If both values are null, this will return true.
-	 * 
-	 * @param s1
-	 * @param s2
-	 * @return boolean
-	 */
-	public static boolean stringsEqual(String s1, String s2) {
-		if (s1 == null)
-			return s2 == null;
-		return s1.equals(s2);
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/UnsupportedCryptoAlgorithmException.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/UnsupportedCryptoAlgorithmException.java
deleted file mode 100644
index f71c66d..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/UnsupportedCryptoAlgorithmException.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-
-import org.omg.CORBA.UserException;
-
-public class UnsupportedCryptoAlgorithmException extends UserException {
-}
-
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/WFTUtilsResourceHandler.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/WFTUtilsResourceHandler.java
deleted file mode 100644
index 0ed13f8..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/WFTUtilsResourceHandler.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-
-import org.eclipse.osgi.util.NLS;
-
-public class WFTUtilsResourceHandler extends NLS {
-	private static final String BUNDLE_NAME = "wftutils";//$NON-NLS-1$
-
-	private WFTUtilsResourceHandler() {
-		// Do not instantiate
-	}
-
-	public static String DANGLING_HREF_ERROR_;
-	public static String Integer_UI_;
-	public static String Failed_to_convert__0__to___ERROR_;
-	public static String Enumeration_UI_;
-	public static String Short_UI_;
-	public static String Character_UI_;
-	public static String Long_UI_;
-	public static String Double_UI_;
-	public static String ResourceDependencyRegister_ERROR_0;
-	public static String Float_UI_;
-	public static String Byte_UI_;
-	public static String Warning__Could_not_write_b_WARN_;
-	public static String Boolean_UI_;
-	public static String Stack_trace_of_nested_exce_ERROR_;
-	public static String MofObject_UI_;
-	public static String PleaseMigrateYourCodeError_ERROR_0;
-	public static String EMF2DOMAdapterImpl_ERROR_0;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, WFTUtilsResourceHandler.class);
-	}
-
-	public static String getString(String key, Object[] args) {
-		return NLS.bind(key, args);
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/WriteBackHelper.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/WriteBackHelper.java
deleted file mode 100644
index 4ebaf35..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/WriteBackHelper.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-
-
-/**
- * @deprecated This class will be deleted. If you still need to use this class, please contact the
- *             WCCM team. A class which can be used in conjunction with Encoder/Decoders to save
- *             resources if they are made dirty by automatic encoding support. Usage Example:
- * 
- * <pre>
- * 
- * 
- * // Use the standard WebSphere password value encoder/decoder.
- * EncoderDecoderRegistry.getDefaultRegistry().setDefaultEncoderDecoder(new com.ibm.ejs.security.util.WASEncoderDecoder());
- * // Begin tracking changes...
- * WriteBackHelper.begin();
- * // Load a resource which may have un-encoded values...
- * // Note: The WCCM will attempt to detect un-encoded values.  If unencoded values
- * // are found, the value will be encoded, and the resource will be added to the
- * // WriteBackHelper.
- * Resource res = resourceSet.load(&quot;myResource&quot;);
- * // Ensure that any changes due to encoding are written back out.
- * WriteBackHelper.end();
- * </pre>
- */
-public class WriteBackHelper {
-	private Set dirtyObjects = new HashSet();
-	private boolean trackingChanges = false;
-	private static WriteBackHelper _instance;
-	static {
-		//Deprecated class
-		Revisit.deleteMe();
-	}
-
-	/**
-	 * Private constructor ensures proper usage through singleton.
-	 */
-	private WriteBackHelper() {
-		super();
-	}
-
-	/**
-	 * Adds a resource which is dirty, and needs to be saved.
-	 */
-	public void addDirtyObject(EObject dirtyObject) {
-		dirtyObjects.add(dirtyObject);
-	}
-
-	/**
-	 * Begin collecting objects which have changed.
-	 */
-	public void begin() {
-		trackingChanges = true;
-	}
-
-	/**
-	 * Attempts to save all dirty resources (if possible), then marks the resources as non-dirty.
-	 */
-	public void end() {
-		saveDirtyResources();
-		reset();
-		trackingChanges = false;
-	}
-
-	/**
-	 * Returns true if changes to mof objects are currently being tracked.
-	 */
-	public boolean isActive() {
-		return trackingChanges;
-	}
-
-	/**
-	 * Clears the list of dirty resources.
-	 */
-	protected void reset() {
-		dirtyObjects.clear();
-	}
-
-	/**
-	 * Attempts to save all dirty resources (if possible), then marks the resources as non-dirty.
-	 */
-	protected void saveDirtyResources() {
-		Set dirtyResources = new HashSet();
-		Iterator dirtyObjIter = dirtyObjects.iterator();
-		while (dirtyObjIter.hasNext()) {
-			EObject dirtyObject = (EObject) dirtyObjIter.next();
-			if (dirtyObject.eResource() != null && !dirtyResources.contains(dirtyObject)) {
-				dirtyResources.add(dirtyObject.eResource());
-			}
-		}
-		Iterator dirtyIter = dirtyResources.iterator();
-		while (dirtyIter.hasNext()) {
-			Resource dirtyResource = (Resource) dirtyIter.next();
-			try {
-				dirtyResource.save(Collections.EMPTY_MAP);
-			} catch (Exception e) {
-				warn(dirtyResource, e);
-			}
-		}
-	}
-
-	/**
-	 * Adds a resource which is dirty, and needs to be saved.
-	 */
-	public static WriteBackHelper singleton() {
-		if (_instance == null) {
-			_instance = new WriteBackHelper();
-		}
-		return _instance;
-	}
-
-	/**
-	 * Warn the user of problems during save.
-	 */
-	protected void warn(Resource res, Exception e) {
-		System.err.println(WFTUtilsResourceHandler.getString(WFTUtilsResourceHandler.Warning__Could_not_write_b_WARN_, new Object[]{res.getURI()})); //$NON-NLS-1$
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/XMLValueEncoderDecoder.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/XMLValueEncoderDecoder.java
deleted file mode 100644
index d9a1d2c..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/XMLValueEncoderDecoder.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emf.utilities;
-
-
-/**
- * An XML value escaping EncoderDecoder implementation
- */
-public class XMLValueEncoderDecoder extends EncoderDecoderAdapter implements EncoderDecoder {
-	/**
-	 * Identifies the last printable character in the Unicode range that is supported by the
-	 * encoding used with this serializer. For 8-bit encodings this will be either 0x7E or 0xFF. For
-	 * 16-bit encodings this will be 0xFFFF. Characters that are not printable will be escaped using
-	 * character references.
-	 */
-	private int _lastPrintable = 0x7E;
-	protected static XMLValueEncoderDecoder _singleton;
-
-	/**
-	 * EncoderDecoderAdapter constructor comment.
-	 */
-	public XMLValueEncoderDecoder() {
-		super();
-	}
-
-	/**
-	 * Returns a decoded version of the value.
-	 */
-	public String decode(String value) {
-		// NOT_IMPLEMENTED
-		return value;
-	}
-
-	/**
-	 * Escapes a string so it may be printed as text content or attribute value. Non printable
-	 * characters are escaped using character references. Where the format specifies a deault entity
-	 * reference, that reference is used (e.g. <tt>&amp;lt;</tt>).
-	 * 
-	 * @param source
-	 *            The string to escape
-	 */
-	public String encode(String value) {
-		StringBuffer sbuf = new StringBuffer(value.length());
-		String charRef = null;
-		char ch;
-		for (int i = 0; i < value.length(); ++i) {
-			ch = value.charAt(i);
-			// If there is a suitable entity reference for this
-			// character, print it. The list of available entity
-			// references is almost but not identical between
-			// XML and HTML.
-			charRef = getEntityRef(ch);
-			if (charRef != null) {
-				sbuf.append('&');
-				sbuf.append(charRef);
-				sbuf.append(';');
-			} else if ((ch >= ' ' && ch <= _lastPrintable && ch != 0xF7) || ch == '\n' || ch == '\r' || ch == '\t') {
-				// If the character is not printable, print as character reference.
-				// Non printables are below ASCII space but not tab or line
-				// terminator, ASCII delete, or above a certain Unicode threshold.
-				sbuf.append(ch);
-			} else {
-				sbuf.append("&#");//$NON-NLS-1$
-				sbuf.append(Integer.toString(ch));
-				sbuf.append(';');
-			}
-		}
-		return sbuf.toString();
-	}
-
-	public static String escape(String value) {
-		if (_singleton == null) {
-			_singleton = new XMLValueEncoderDecoder();
-		}
-		return _singleton.encode(value);
-	}
-
-	/**
-	 * Returns the suitable entity reference for this character value, or null if no such entity
-	 * exists. Calling this method with <tt>'&amp;'</tt> will return <tt>"&amp;amp;"</tt>.
-	 * 
-	 * @param ch
-	 *            Character value
-	 * @return Character entity name, or null
-	 */
-	protected String getEntityRef(char ch) {
-		// Encode special XML characters into the equivalent character references.
-		// These five are defined by default for all XML documents.
-		switch (ch) {
-			case '<' :
-				return "lt";//$NON-NLS-1$
-			case '>' :
-				return "gt";//$NON-NLS-1$
-			case '"' :
-				return "quot";//$NON-NLS-1$
-			case '\'' :
-				return "apos";//$NON-NLS-1$
-			case '&' :
-				return "amp";//$NON-NLS-1$
-		}
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/wftutils.properties b/plugins/org.eclipse.wst.common.emf/wtpemf/wftutils.properties
deleted file mode 100644
index 8c7b45a..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/wftutils.properties
+++ /dev/null
@@ -1,28 +0,0 @@
-###############################################################################
-# Copyright (c) 2003, 2004 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-# IBM Corporation - initial API and implementation
-###############################################################################
-Warning__Could_not_write_b_WARN_=IWAE0008W Warning: Could not write back {0}
-Stack_trace_of_nested_exce_ERROR_=IWAE0009E Stack trace of nested exception:
-Enumeration_UI_=Enumeration
-Double_UI_=Double
-Float_UI_=Float
-Long_UI_=Long
-Short_UI_=Short
-Boolean_UI_=Boolean
-Integer_UI_=Integer
-Character_UI_=Character
-Byte_UI_=Byte
-Failed_to_convert__0__to___ERROR_=IWAE0014E Failed to convert {0} to {1}.
-DANGLING_HREF_ERROR_=IWAE0001E Unable to resolve HREF {0}. Check the descriptor files and ensure the ids are valid.
-MofObject_UI_=MofObject_UI_
-PleaseMigrateYourCodeError_ERROR_0=PleaseMigrateYourCodeError_ERROR_0
-EMF2DOMAdapterImpl_ERROR_0=EMF2DOMAdapterImpl_ERROR_0
-
-ResourceDependencyRegister_ERROR_0=IWAE0002E The ResourceSet cannot be null.
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/.classpath b/plugins/org.eclipse.wst.common.emfworkbench.integration/.classpath
deleted file mode 100644
index 377edbf..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="property_file"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/.cvsignore b/plugins/org.eclipse.wst.common.emfworkbench.integration/.cvsignore
deleted file mode 100644
index 73ba5fb..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/.cvsignore
+++ /dev/null
@@ -1,6 +0,0 @@
-bin
-temp.folder
-build.xml
-emfworkbenchedit.jar
-@dot
-src.zip
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/.project b/plugins/org.eclipse.wst.common.emfworkbench.integration/.project
deleted file mode 100644
index afef01a..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.common.emfworkbench.integration</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/plugins/org.eclipse.wst.common.emfworkbench.integration/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.common.emfworkbench.integration/META-INF/MANIFEST.MF
deleted file mode 100644
index d5d9e9a..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,24 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: EMF Workbench Edit Plug-in
-Bundle-SymbolicName: org.eclipse.wst.common.emfworkbench.integration; singleton:=true
-Bundle-Version: 1.0.1.qualifier
-Bundle-Activator: org.eclipse.wst.common.internal.emfworkbench.integration.EMFWorkbenchEditPlugin
-Bundle-Vendor: Eclipse.org
-Bundle-Localization: plugin
-Export-Package: .,
- org.eclipse.wst.common.internal.emfworkbench,
- org.eclipse.wst.common.internal.emfworkbench.edit,
- org.eclipse.wst.common.internal.emfworkbench.integration,
- org.eclipse.wst.common.internal.emfworkbench.validateedit
-Require-Bundle: org.eclipse.wst.common.frameworks,
- org.eclipse.jem.util,
- org.eclipse.emf.edit,
- org.eclipse.emf.ecore.xmi,
- org.eclipse.wst.common.emf,
- org.eclipse.core.runtime,
- org.eclipse.core.resources,
- org.eclipse.xsd,
- org.eclipse.wst.validation,
- org.eclipse.wst.common.project.facet.core
-Eclipse-AutoStart: true
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/about.html b/plugins/org.eclipse.wst.common.emfworkbench.integration/about.html
deleted file mode 100644
index 6f6b96c..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/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>February 24, 2005</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/plugins/org.eclipse.wst.common.emfworkbench.integration/build.properties b/plugins/org.eclipse.wst.common.emfworkbench.integration/build.properties
deleted file mode 100644
index a288ad7..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/build.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-###############################################################################
-# Copyright (c) 2003, 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
-###############################################################################
-source.. = src/,\
-                              property_file/
-output.. = bin/
-bin.includes = plugin.xml,\
-               .,\
-               META-INF/,\
-               about.html,\
-               plugin.properties
-src.includes = schema/
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/plugin.properties b/plugins/org.eclipse.wst.common.emfworkbench.integration/plugin.properties
deleted file mode 100644
index 2b001fd..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/plugin.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-###############################################################################
-# Copyright (c) 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
-###############################################################################
-EMF_Resource_Edit_Model=EMF Resource Edit Model
-Edit_Model_Extensions=Edit Model Extensions
-Adapter_Factory_Extension=Adapter Factory Extension
-ModifierHelperFactory=ModifierHelperFactory
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/plugin.xml b/plugins/org.eclipse.wst.common.emfworkbench.integration/plugin.xml
deleted file mode 100644
index f27b788..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/plugin.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-     <extension-point id="editModel" name="%EMF_Resource_Edit_Model" schema="schema/editModel.exsd"/>
-   <extension-point id="editModelExtension" name="%Edit_Model_Extensions" schema="schema/editModelExtension.exsd"/>
-   <extension-point id="adapterFactory" name="%Adapter_Factory_Extension" schema="schema/adapterFactory.exsd"/>
-   <extension-point id="ModifierHelperFactory" name="%ModifierHelperFactory" schema="schema/modifierHelperFactory.exsd"/>
-
-   <extension
-         point="org.eclipse.jem.util.internalWorkbenchContextFactory">
-      <factoryClass
-            name="org.eclipse.wst.common.internal.emfworkbench.edit.EMFWorkbenchEditContextFactory">
-      </factoryClass>
-   </extension>
-   
-   <extension
-        id="emfValidationHandler"
-        name="emfValidationHandler"
-        point="org.eclipse.wst.validation.validationSelectionHandler">
-      <validationSelectionHandler
-        id="emfValidationHandler"
-        handlerClass="org.eclipse.wst.common.internal.emfworkbench.EmfValidationHandler"
-        selectionType="org.eclipse.emf.ecore.EObject"/>
-   </extension>
-   
-</plugin>
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/prepareforpii.xml b/plugins/org.eclipse.wst.common.emfworkbench.integration/prepareforpii.xml
deleted file mode 100644
index 26d1d46..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/prepareforpii.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<project name="PrepareForPII" default="main" basedir=".">
-		
-	<!-- Setup temp variables -->
-	<target name="init">
-		<property name="nlsDir" value="d:/NLS/Corona/0526"/>
-		<property name="plugin" value="com.ibm.wtp.emf.workbench.edit"/>
-		<property name="plugindir" value="d:/workspaceCorona/${plugin}"/>
-		<property name="outputDir" value="${nlsDir}/${plugin}"/>
-		
-	
-	</target>
-
-	<!-- Create the destination dir -->
-	<target name="nlsDir" depends="init">
-		<mkdir dir="${nlsDir}"/>
-	</target>
-	
-	<!-- Create the destination dir -->
-	<target name="plugindir" depends="nlsDir">
-		<delete dir="${outputDir}"/>
-		<mkdir dir="${outputDir}"/>
-	</target>
-
-	<!-- Move the files to the correct locations in the workspace. -->
-	<target name="main" depends="plugindir">
-	
-		<messageIdGen folderPath = "${plugindir}" componentId = "E" />
-		
-		<copy todir = "${outputDir}/property_file" >
-			 <fileset dir="${plugindir}/property_file">
-           	  <include name="**/*.properties"/>
-  			 </fileset>
-  		</copy>
-
-  		
-	</target>
-</project>
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/property_file/emftosed.properties b/plugins/org.eclipse.wst.common.emfworkbench.integration/property_file/emftosed.properties
deleted file mode 100644
index 77d84df..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/property_file/emftosed.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 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
-###############################################################################
-Unexpected_IO_exception_occurred_creating_xml_document_1_EXC_=IWAE0017E Unexpected IO exception occurred creating xml document
-EMF2DOMSedRenderer_UI_0={0} should not use an OutputStream for loading
-EMF2DOMSedRenderer_UI_1={0} should not use an InputStream for loading
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/property_file/emfworkbenchedit.properties b/plugins/org.eclipse.wst.common.emfworkbench.integration/property_file/emfworkbenchedit.properties
deleted file mode 100644
index 631d1c3..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/property_file/emfworkbenchedit.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-###############################################################################
-# Copyright (c) 2003, 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
-###############################################################################
-DynamicAdapterFactory_ERROR_0=IWAE0010E A null EPackage will not be tied to any Adapter Factory.
-ClientAccessRegistryException_UI_0=There are at least {0} improperly released edit models.
-ClientAccessRegistryException_UI_1=This exception was generated to indicate an invalid usage of reference counts.\n Typically, this occurs on attempts to open an already open artifact edit.\n Make sure the dispose method is called when done accessing.\n Please examine the stack trace.\n Client Access Exception of type {0} \n
-ClientAccessRegistry_ERROR_0=IWAE0011E Key already used to access Resource
-ClientAccessRegistry_ERROR_1=IWAE0012E Key has not properly accessed Resource.
-EditModelRegistry_ERROR_0=IWAE0013E The inheritance hierarchy for the Edit Model \"{0}\" contains a cycle. Please correct the entries in your plugin.xml files.
-EditModelRegistry_ERROR_1=IWAE0014E Could not create factory because IConfigurationElement is null.
-EditModelRegistry_ERROR_2=IWAE0015E No EditModelFactory for key \"{0}\"
-Snapshot_ERROR_0=IWAE0016E Locking Insurance Stack Trace
-AdapterFactoryDescriptor_ERROR_0=IWAE0017E A packageURI is required for all Adapter Factories
-AdapterFactoryDescriptor_ERROR_1=IWAE0018E An id is required for all Adapter Factories. Check all adapter factories defined in \"{0}\".
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/rose/ModuleCore.genmodel b/plugins/org.eclipse.wst.common.emfworkbench.integration/rose/ModuleCore.genmodel
deleted file mode 100644
index 5d6bddd..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/rose/ModuleCore.genmodel
+++ /dev/null
@@ -1,47 +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.wst.common.emfworkbench.integration/src"
-    editDirectory="/org.eclipse.wst.common.emfworkbench.integration.edit/src" editorDirectory="/org.eclipse.wst.common.emfworkbench.integration.editor/src"
-    modelPluginID="org.eclipse.wst.common.emfworkbench.integration" runtimeJar="true"
-    modelName="ProjectModule" editPluginClass="org.eclipse.wst.projectmodule.provider.ModuleCoreEditPlugin"
-    editorPluginClass="org.eclipse.wst.projectmodule.presentation.ModuleCoreEditorPlugin"
-    runtimeCompatibility="false">
-  <foreignModel>moduleCore.mdl</foreignModel>
-  <foreignModel>WORKSPACE_ROOT</foreignModel>
-  <foreignModel>D:\work\WTP</foreignModel>
-  <genPackages prefix="ModuleCore" basePackage="org.eclipse.wst.common" disposableProviderFactory="true"
-      ecorePackage="moduleCore.ecore#/">
-    <genEnums ecoreEnum="moduleCore.ecore#//DependencyType">
-      <genEnumLiterals ecoreEnumLiteral="moduleCore.ecore#//DependencyType/uses"/>
-      <genEnumLiterals ecoreEnumLiteral="moduleCore.ecore#//DependencyType/consumes"/>
-    </genEnums>
-    <genDataTypes ecoreDataType="moduleCore.ecore#//URI"/>
-    <genClasses ecoreClass="moduleCore.ecore#//WorkbenchModule">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute moduleCore.ecore#//WorkbenchModule/handle"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute moduleCore.ecore#//WorkbenchModule/deployedName"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference moduleCore.ecore#//WorkbenchModule/resources"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference moduleCore.ecore#//WorkbenchModule/moduleType"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference moduleCore.ecore#//WorkbenchModule/modules"/>
-    </genClasses>
-    <genClasses ecoreClass="moduleCore.ecore#//WorkbenchModuleResource">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute moduleCore.ecore#//WorkbenchModuleResource/sourcePath"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute moduleCore.ecore#//WorkbenchModuleResource/deployedPath"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute moduleCore.ecore#//WorkbenchModuleResource/exclusions"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference moduleCore.ecore#//WorkbenchModuleResource/module"/>
-    </genClasses>
-    <genClasses ecoreClass="moduleCore.ecore#//ModuleType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute moduleCore.ecore#//ModuleType/metadataResources"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute moduleCore.ecore#//ModuleType/moduleTypeId"/>
-    </genClasses>
-    <genClasses ecoreClass="moduleCore.ecore#//ProjectModules">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute moduleCore.ecore#//ProjectModules/projectName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference moduleCore.ecore#//ProjectModules/workbenchModules"/>
-    </genClasses>
-    <genClasses ecoreClass="moduleCore.ecore#//DependentModule">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute moduleCore.ecore#//DependentModule/handle"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute moduleCore.ecore#//DependentModule/deployedPath"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute moduleCore.ecore#//DependentModule/dependencyType"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/rose/moduleCore.cat b/plugins/org.eclipse.wst.common.emfworkbench.integration/rose/moduleCore.cat
deleted file mode 100644
index 330f5b8..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/rose/moduleCore.cat
+++ /dev/null
@@ -1,1065 +0,0 @@
-
-(object Petal
-    version    	50
-    _written   	"Rose 8.3.0407.2800"
-    charSet    	0)
-
-(object Class_Category "moduleCore"
-    is_unit    	TRUE
-    is_loaded  	TRUE
-    attributes 	(list Attribute_Set
-	(object Attribute
-	    tool       	"Ecore"
-	    name       	"basePackage"
-	    value      	(value Text "org.eclipse.wst.common"))
-	(object Attribute
-	    tool       	"Ecore"
-	    name       	"prefix"
-	    value      	(value Text "ModuleCore"))
-	(object Attribute
-	    tool       	"Ecore"
-	    name       	"nsURI"
-	    value      	(value Text "modulecore.xmi")))
-    quid       	"3A0DB68B0046"
-    visible_categories 	(list visibility_relationship_list
-	(object Visibility_Relationship
-	    quid       	"3F2E8236025A"
-	    supplier   	"Logical View::ejbext"
-	    quidu      	"39AA86660190")
-	(object Visibility_Relationship
-	    quid       	"3F2E8236025B"
-	    supplier   	"Logical View::webappext"
-	    quidu      	"39B534FD024C")
-	(object Visibility_Relationship
-	    quid       	"3F2E8236025C"
-	    supplier   	"Logical View::ejbbnd"
-	    quidu      	"39B960FC03CA")
-	(object Visibility_Relationship
-	    quid       	"3F2E82360264"
-	    supplier   	"Logical View::webappbnd"
-	    quidu      	"39B961060107")
-	(object Visibility_Relationship
-	    quid       	"3F2E82360265"
-	    supplier   	"Logical View::clientbnd"
-	    quidu      	"39B9614F031F")
-	(object Visibility_Relationship
-	    quid       	"3F2E82360266"
-	    supplier   	"Logical View::applicationext"
-	    quidu      	"3A22E6080303")
-	(object Visibility_Relationship
-	    quid       	"3F2E82360267"
-	    supplier   	"Logical View::applicationbnd"
-	    quidu      	"39B9611502A4")
-	(object Visibility_Relationship
-	    quid       	"3F2E82360268"
-	    supplier   	"Logical View::j2cbnd"
-	    quidu      	"39B9632E038C"))
-    exportControl 	"Public"
-    logical_models 	(list unit_reference_list
-	(object Class "WorkbenchModule"
-	    quid       	"41E3DF5801FA"
-	    class_attributes 	(list class_attribute_list
-		(object ClassAttribute "handle"
-		    quid       	"41EC1D71015D"
-		    type       	"URI"
-		    quidu      	"41EC26DA027A"
-		    exportControl 	"Public")
-		(object ClassAttribute "deployedName"
-		    quid       	"4201471D0208"
-		    type       	"String"
-		    exportControl 	"Public")))
-	(object Class "WorkbenchModuleResource"
-	    quid       	"41E3DF670039"
-	    class_attributes 	(list class_attribute_list
-		(object ClassAttribute "sourcePath"
-		    quid       	"41E3DF970128"
-		    type       	"URI"
-		    quidu      	"41EC26DA027A"
-		    exportControl 	"Public")
-		(object ClassAttribute "deployedPath"
-		    quid       	"41EEC640025B"
-		    type       	"URI"
-		    quidu      	"41EC26DA027A"
-		    exportControl 	"Public")
-		(object ClassAttribute "exclusions"
-		    quid       	"41E3DF9E011E"
-		    stereotype 	"0..*"
-		    type       	"URI"
-		    quidu      	"41EC26DA027A"
-		    exportControl 	"Public")))
-	(object Class "ModuleType"
-	    quid       	"41EC1D5103E2"
-	    class_attributes 	(list class_attribute_list
-		(object ClassAttribute "metadataResources"
-		    quid       	"41EC1DF0021E"
-		    stereotype 	"0..*"
-		    type       	"URI"
-		    quidu      	"41EC26DA027A"
-		    exportControl 	"Public")
-		(object ClassAttribute "moduleTypeId"
-		    quid       	"41EC21340357"
-		    type       	"String"
-		    exportControl 	"Public")))
-	(object Class "URI"
-	    quid       	"41EC26DA027A"
-	    stereotype 	"datatype"
-	    class_attributes 	(list class_attribute_list
-		(object ClassAttribute "org.eclipse.emf.common.util.URI"
-		    quid       	"41EC270803AC"
-		    stereotype 	"javaclass"
-		    exportControl 	"Public")))
-	(object Class "ProjectModules"
-	    quid       	"41F566DB0251"
-	    class_attributes 	(list class_attribute_list
-		(object ClassAttribute "projectName"
-		    quid       	"41F567FD023A"
-		    type       	"String"
-		    exportControl 	"Public")))
-	(object Class "DependentModule"
-	    quid       	"41F6C24B023D"
-	    class_attributes 	(list class_attribute_list
-		(object ClassAttribute "handle"
-		    quid       	"420145F001C9"
-		    type       	"URI"
-		    quidu      	"41EC26DA027A"
-		    exportControl 	"Public")
-		(object ClassAttribute "deployedPath"
-		    quid       	"420145FA0015"
-		    type       	"URI"
-		    quidu      	"41EC26DA027A"
-		    exportControl 	"Public")
-		(object ClassAttribute "dependencyType"
-		    quid       	"42039243016E"
-		    type       	"DependencyType"
-		    quidu      	"420394F50185"
-		    exportControl 	"Public")))
-	(object Class "DependencyType"
-	    quid       	"420394F50185"
-	    documentation 	
-|uses=0
-|consumes=1
-	    
-	    stereotype 	"enumeration"
-	    class_attributes 	(list class_attribute_list
-		(object ClassAttribute "uses"
-		    quid       	"42039938018D"
-		    exportControl 	"Public")
-		(object ClassAttribute "consumes"
-		    quid       	"42039A6E0139"
-		    exportControl 	"Public")))
-	(object Association "$UNNAMED$0"
-	    quid       	"41E3E14B01E3"
-	    roles      	(list role_list
-		(object Role "resources"
-		    quid       	"41E3E14D031D"
-		    label      	"resources"
-		    supplier   	"Logical View::moduleCore::WorkbenchModuleResource"
-		    quidu      	"41E3DF670039"
-		    client_cardinality 	(value cardinality "0..*")
-		    Containment 	"By Value"
-		    is_navigable 	TRUE)
-		(object Role "module"
-		    quid       	"41E3E14D031F"
-		    label      	"module"
-		    supplier   	"Logical View::moduleCore::WorkbenchModule"
-		    quidu      	"41E3DF5801FA"
-		    client_cardinality 	(value cardinality "1")
-		    is_navigable 	TRUE
-		    is_aggregate 	TRUE)))
-	(object Association "$UNNAMED$1"
-	    quid       	"41EC1D9802C2"
-	    roles      	(list role_list
-		(object Role "moduleType"
-		    quid       	"41EC1D990241"
-		    label      	"moduleType"
-		    supplier   	"Logical View::moduleCore::ModuleType"
-		    quidu      	"41EC1D5103E2"
-		    client_cardinality 	(value cardinality "1")
-		    is_navigable 	TRUE)
-		(object Role "$UNNAMED$2"
-		    quid       	"41EC1D990243"
-		    supplier   	"Logical View::moduleCore::WorkbenchModule"
-		    quidu      	"41E3DF5801FA")))
-	(object Association "$UNNAMED$3"
-	    quid       	"41F5672000E8"
-	    roles      	(list role_list
-		(object Role "workbenchModules"
-		    quid       	"41F567210111"
-		    label      	"workbenchModules"
-		    supplier   	"Logical View::moduleCore::WorkbenchModule"
-		    quidu      	"41E3DF5801FA"
-		    client_cardinality 	(value cardinality "0..*")
-		    Containment 	"By Value"
-		    is_navigable 	TRUE)
-		(object Role "$UNNAMED$4"
-		    quid       	"41F567210113"
-		    supplier   	"Logical View::moduleCore::ProjectModules"
-		    quidu      	"41F566DB0251"
-		    Containment 	"By Reference"
-		    is_aggregate 	TRUE)))
-	(object Association "$UNNAMED$5"
-	    quid       	"420146A502E2"
-	    roles      	(list role_list
-		(object Role "modules"
-		    quid       	"420146A6027F"
-		    label      	"modules"
-		    supplier   	"Logical View::moduleCore::DependentModule"
-		    quidu      	"41F6C24B023D"
-		    client_cardinality 	(value cardinality "0..*")
-		    is_navigable 	TRUE)
-		(object Role "$UNNAMED$6"
-		    quid       	"420146A60281"
-		    supplier   	"Logical View::moduleCore::WorkbenchModule"
-		    quidu      	"41E3DF5801FA"))))
-    logical_presentations 	(list unit_reference_list
-	(object ClassDiagram "Main"
-	    quid       	"41E3DF060210"
-	    title      	"Main"
-	    zoom       	100
-	    max_height 	28350
-	    max_width  	21600
-	    origin_x   	100
-	    origin_y   	0
-	    items      	(list diagram_item_list
-		(object ClassView "Class" "Logical View::moduleCore::URI" @1
-		    ShowCompartmentStereotypes 	TRUE
-		    IncludeAttribute 	TRUE
-		    IncludeOperation 	TRUE
-		    location   	(1920, 1648)
-		    font       	(object Font
-			size       	10
-			face       	"Arial"
-			bold       	FALSE
-			italics    	FALSE
-			underline  	FALSE
-			strike     	FALSE
-			color      	0
-			default_color 	TRUE)
-		    label      	(object ItemLabel
-			Parent_View 	@1
-			location   	(1460, 1589)
-			fill_color 	13434879
-			nlines     	1
-			max_width  	920
-			justify    	0
-			label      	"URI")
-		    stereotype 	(object ItemLabel
-			Parent_View 	@1
-			location   	(1460, 1539)
-			fill_color 	13434879
-			anchor     	10
-			nlines     	1
-			max_width  	920
-			justify    	0
-			label      	"<<datatype>>")
-		    icon_style 	"Icon"
-		    line_color 	3342489
-		    fill_color 	13434879
-		    quidu      	"41EC26DA027A"
-		    compartment 	(object Compartment
-			Parent_View 	@1
-			location   	(1460, 1650)
-			font       	(object Font
-			    size       	10
-			    face       	"Arial"
-			    bold       	FALSE
-			    italics    	FALSE
-			    underline  	FALSE
-			    strike     	FALSE
-			    color      	0
-			    default_color 	TRUE)
-			icon_style 	"Icon"
-			fill_color 	16777215
-			anchor     	2
-			nlines     	2
-			max_width  	925)
-		    width      	938
-		    height     	242
-		    annotation 	8
-		    autoResize 	TRUE)
-		(object NoteView @2
-		    location   	(448, 1264)
-		    font       	(object Font
-			size       	10
-			face       	"Arial"
-			bold       	FALSE
-			italics    	FALSE
-			underline  	FALSE
-			strike     	FALSE
-			color      	0
-			default_color 	TRUE)
-		    label      	(object ItemLabel
-			Parent_View 	@2
-			location   	(176, 1055)
-			fill_color 	13434879
-			nlines     	8
-			max_width  	508
-			label      	
-|The module "handle" URI will contain the special Module protocol, project name, and module identifier, and will be fully resolved to a full platform URI
-			)
-		    line_color 	3342489
-		    fill_color 	13434879
-		    width      	568
-		    height     	431)
-		(object ClassView "Class" "Logical View::moduleCore::WorkbenchModuleResource" @3
-		    ShowCompartmentStereotypes 	TRUE
-		    IncludeAttribute 	TRUE
-		    IncludeOperation 	TRUE
-		    location   	(992, 1744)
-		    font       	(object Font
-			size       	10
-			face       	"Arial"
-			bold       	FALSE
-			italics    	FALSE
-			underline  	FALSE
-			strike     	FALSE
-			color      	0
-			default_color 	TRUE)
-		    label      	(object ItemLabel
-			Parent_View 	@3
-			location   	(714, 1613)
-			fill_color 	13434879
-			nlines     	1
-			max_width  	556
-			justify    	0
-			label      	"WorkbenchModuleResource")
-		    icon_style 	"Icon"
-		    line_color 	3342489
-		    fill_color 	13434879
-		    quidu      	"41E3DF670039"
-		    compartment 	(object Compartment
-			Parent_View 	@3
-			location   	(714, 1674)
-			font       	(object Font
-			    size       	10
-			    face       	"Arial"
-			    bold       	FALSE
-			    italics    	FALSE
-			    underline  	FALSE
-			    strike     	FALSE
-			    color      	0
-			    default_color 	TRUE)
-			icon_style 	"Icon"
-			fill_color 	16777215
-			anchor     	2
-			nlines     	4
-			max_width  	531)
-		    width      	574
-		    height     	286
-		    annotation 	8
-		    autoResize 	TRUE)
-		(object ClassView "Class" "Logical View::moduleCore::ModuleType" @4
-		    ShowCompartmentStereotypes 	TRUE
-		    IncludeAttribute 	TRUE
-		    IncludeOperation 	TRUE
-		    location   	(1856, 1136)
-		    font       	(object Font
-			size       	10
-			face       	"Arial"
-			bold       	FALSE
-			italics    	FALSE
-			underline  	FALSE
-			strike     	FALSE
-			color      	0
-			default_color 	TRUE)
-		    label      	(object ItemLabel
-			Parent_View 	@4
-			location   	(1509, 1030)
-			fill_color 	13434879
-			nlines     	1
-			max_width  	694
-			justify    	0
-			label      	"ModuleType")
-		    icon_style 	"Icon"
-		    line_color 	3342489
-		    fill_color 	13434879
-		    quidu      	"41EC1D5103E2"
-		    compartment 	(object Compartment
-			Parent_View 	@4
-			location   	(1509, 1091)
-			font       	(object Font
-			    size       	10
-			    face       	"Arial"
-			    bold       	FALSE
-			    italics    	FALSE
-			    underline  	FALSE
-			    strike     	FALSE
-			    color      	0
-			    default_color 	TRUE)
-			icon_style 	"Icon"
-			fill_color 	16777215
-			anchor     	2
-			nlines     	3
-			max_width  	700)
-		    width      	712
-		    height     	236
-		    annotation 	8
-		    autoResize 	TRUE)
-		(object ClassView "Class" "Logical View::moduleCore::ProjectModules" @5
-		    ShowCompartmentStereotypes 	TRUE
-		    IncludeAttribute 	TRUE
-		    IncludeOperation 	TRUE
-		    location   	(416, 368)
-		    font       	(object Font
-			size       	10
-			face       	"Arial"
-			bold       	FALSE
-			italics    	FALSE
-			underline  	FALSE
-			strike     	FALSE
-			color      	0
-			default_color 	TRUE)
-		    label      	(object ItemLabel
-			Parent_View 	@5
-			location   	(204, 287)
-			fill_color 	13434879
-			nlines     	1
-			max_width  	424
-			justify    	0
-			label      	"ProjectModules")
-		    icon_style 	"Icon"
-		    line_color 	3342489
-		    fill_color 	13434879
-		    quidu      	"41F566DB0251"
-		    compartment 	(object Compartment
-			Parent_View 	@5
-			location   	(204, 348)
-			font       	(object Font
-			    size       	10
-			    face       	"Arial"
-			    bold       	FALSE
-			    italics    	FALSE
-			    underline  	FALSE
-			    strike     	FALSE
-			    color      	0
-			    default_color 	TRUE)
-			icon_style 	"Icon"
-			fill_color 	16777215
-			anchor     	2
-			nlines     	2
-			max_width  	431)
-		    width      	442
-		    height     	186
-		    annotation 	8
-		    autoResize 	TRUE)
-		(object ClassView "Class" "Logical View::moduleCore::DependentModule" @6
-		    ShowCompartmentStereotypes 	TRUE
-		    IncludeAttribute 	TRUE
-		    IncludeOperation 	TRUE
-		    location   	(1824, 480)
-		    font       	(object Font
-			size       	10
-			face       	"Arial"
-			bold       	FALSE
-			italics    	FALSE
-			underline  	FALSE
-			strike     	FALSE
-			color      	0
-			default_color 	TRUE)
-		    label      	(object ItemLabel
-			Parent_View 	@6
-			location   	(1470, 349)
-			fill_color 	13434879
-			nlines     	1
-			max_width  	708
-			justify    	0
-			label      	"DependentModule")
-		    icon_style 	"Icon"
-		    line_color 	3342489
-		    fill_color 	13434879
-		    quidu      	"41F6C24B023D"
-		    compartment 	(object Compartment
-			Parent_View 	@6
-			location   	(1470, 410)
-			font       	(object Font
-			    size       	10
-			    face       	"Arial"
-			    bold       	FALSE
-			    italics    	FALSE
-			    underline  	FALSE
-			    strike     	FALSE
-			    color      	0
-			    default_color 	TRUE)
-			icon_style 	"Icon"
-			fill_color 	13434879
-			anchor     	2
-			nlines     	4
-			max_width  	715)
-		    width      	726
-		    height     	286
-		    annotation 	8
-		    autoResize 	TRUE)
-		(object ClassView "Class" "Logical View::moduleCore::WorkbenchModule" @7
-		    ShowCompartmentStereotypes 	TRUE
-		    IncludeAttribute 	TRUE
-		    IncludeOperation 	TRUE
-		    location   	(944, 752)
-		    font       	(object Font
-			size       	10
-			face       	"Arial"
-			bold       	FALSE
-			italics    	FALSE
-			underline  	FALSE
-			strike     	FALSE
-			color      	0
-			default_color 	TRUE)
-		    label      	(object ItemLabel
-			Parent_View 	@7
-			location   	(712, 646)
-			fill_color 	13434879
-			nlines     	1
-			max_width  	464
-			justify    	0
-			label      	"WorkbenchModule")
-		    icon_style 	"Icon"
-		    line_color 	3342489
-		    fill_color 	13434879
-		    quidu      	"41E3DF5801FA"
-		    compartment 	(object Compartment
-			Parent_View 	@7
-			location   	(712, 707)
-			font       	(object Font
-			    size       	10
-			    face       	"Arial"
-			    bold       	FALSE
-			    italics    	FALSE
-			    underline  	FALSE
-			    strike     	FALSE
-			    color      	0
-			    default_color 	TRUE)
-			icon_style 	"Icon"
-			fill_color 	16777215
-			anchor     	2
-			nlines     	3
-			max_width  	471)
-		    width      	482
-		    height     	236
-		    annotation 	8
-		    autoResize 	TRUE)
-		(object AssociationViewNew "$UNNAMED$0" @8
-		    location   	(940, 1235)
-		    font       	(object Font
-			size       	10
-			face       	"Arial"
-			bold       	FALSE
-			italics    	FALSE
-			underline  	FALSE
-			strike     	FALSE
-			color      	0
-			default_color 	TRUE)
-		    stereotype 	TRUE
-		    line_color 	3342489
-		    quidu      	"41E3E14B01E3"
-		    roleview_list 	(list RoleViews
-			(object RoleView "resources" @9
-			    Parent_View 	@8
-			    location   	(460, 355)
-			    font       	(object Font
-				size       	10
-				face       	"Arial"
-				bold       	FALSE
-				italics    	FALSE
-				underline  	FALSE
-				strike     	FALSE
-				color      	0
-				default_color 	TRUE)
-			    label      	(object SegLabel @10
-				Parent_View 	@9
-				location   	(1075, 1501)
-				font       	(object Font
-				    size       	10
-				    face       	"Arial"
-				    bold       	FALSE
-				    italics    	FALSE
-				    underline  	FALSE
-				    strike     	FALSE
-				    color      	0
-				    default_color 	TRUE)
-				anchor     	1
-				anchor_loc 	1
-				nlines     	1
-				max_width  	216
-				justify    	0
-				label      	"+resources"
-				pctDist    	0.726776
-				height     	135
-				orientation 	0)
-			    stereotype 	TRUE
-			    line_color 	3342489
-			    quidu      	"41E3E14D031D"
-			    client     	@8
-			    supplier   	@3
-			    vertices   	(list Points
-				(940, 1235)
-				(940, 1601))
-			    line_style 	3
-			    origin_attachment 	(940, 1235)
-			    terminal_attachment 	(940, 1601)
-			    label      	(object SegLabel @11
-				Parent_View 	@9
-				location   	(861, 1495)
-				font       	(object Font
-				    size       	10
-				    face       	"Arial"
-				    bold       	FALSE
-				    italics    	FALSE
-				    underline  	FALSE
-				    strike     	FALSE
-				    color      	0
-				    default_color 	TRUE)
-				anchor     	2
-				anchor_loc 	1
-				nlines     	1
-				max_width  	15
-				justify    	0
-				label      	"0..*"
-				pctDist    	0.710383
-				height     	79
-				orientation 	1))
-			(object RoleView "module" @12
-			    Parent_View 	@8
-			    location   	(460, 355)
-			    font       	(object Font
-				size       	10
-				face       	"Arial"
-				bold       	FALSE
-				italics    	FALSE
-				underline  	FALSE
-				strike     	FALSE
-				color      	0
-				default_color 	TRUE)
-			    label      	(object SegLabel @13
-				Parent_View 	@12
-				location   	(1043, 972)
-				font       	(object Font
-				    size       	10
-				    face       	"Arial"
-				    bold       	FALSE
-				    italics    	FALSE
-				    underline  	FALSE
-				    strike     	FALSE
-				    color      	0
-				    default_color 	TRUE)
-				anchor     	1
-				anchor_loc 	1
-				nlines     	1
-				max_width  	172
-				justify    	0
-				label      	"+module"
-				pctDist    	0.720824
-				height     	103
-				orientation 	1)
-			    stereotype 	TRUE
-			    line_color 	3342489
-			    quidu      	"41E3E14D031F"
-			    client     	@8
-			    supplier   	@7
-			    vertices   	(list Points
-				(940, 1235)
-				(940, 870))
-			    line_style 	3
-			    origin_attachment 	(940, 1235)
-			    terminal_attachment 	(940, 870)
-			    label      	(object SegLabel @14
-				Parent_View 	@12
-				location   	(868, 976)
-				font       	(object Font
-				    size       	10
-				    face       	"Arial"
-				    bold       	FALSE
-				    italics    	FALSE
-				    underline  	FALSE
-				    strike     	FALSE
-				    color      	0
-				    default_color 	TRUE)
-				anchor     	2
-				anchor_loc 	1
-				nlines     	1
-				max_width  	15
-				justify    	0
-				label      	"1"
-				pctDist    	0.709382
-				height     	73
-				orientation 	0))))
-		(object AssociationViewNew "$UNNAMED$1" @15
-		    location   	(1634, 791)
-		    font       	(object Font
-			size       	10
-			face       	"Arial"
-			bold       	FALSE
-			italics    	FALSE
-			underline  	FALSE
-			strike     	FALSE
-			color      	0
-			default_color 	TRUE)
-		    stereotype 	TRUE
-		    line_color 	3342489
-		    quidu      	"41EC1D9802C2"
-		    roleview_list 	(list RoleViews
-			(object RoleView "moduleType" @16
-			    Parent_View 	@15
-			    location   	(1298, -137)
-			    font       	(object Font
-				size       	10
-				face       	"Arial"
-				bold       	FALSE
-				italics    	FALSE
-				underline  	FALSE
-				strike     	FALSE
-				color      	0
-				default_color 	TRUE)
-			    label      	(object SegLabel @17
-				Parent_View 	@16
-				location   	(2010, 977)
-				font       	(object Font
-				    size       	10
-				    face       	"Arial"
-				    bold       	FALSE
-				    italics    	FALSE
-				    underline  	FALSE
-				    strike     	FALSE
-				    color      	0
-				    default_color 	TRUE)
-				anchor     	1
-				anchor_loc 	1
-				nlines     	1
-				max_width  	260
-				justify    	0
-				label      	"+moduleType"
-				pctDist    	0.911573
-				height     	153
-				orientation 	0)
-			    stereotype 	TRUE
-			    line_color 	3342489
-			    quidu      	"41EC1D990241"
-			    client     	@15
-			    supplier   	@4
-			    vertices   	(list Points
-				(1634, 791)
-				(1857, 791)
-				(1857, 1018))
-			    line_style 	3
-			    origin_attachment 	(1634, 791)
-			    terminal_attachment 	(1857, 1018)
-			    label      	(object SegLabel @18
-				Parent_View 	@16
-				location   	(1804, 972)
-				font       	(object Font
-				    size       	10
-				    face       	"Arial"
-				    bold       	FALSE
-				    italics    	FALSE
-				    underline  	FALSE
-				    strike     	FALSE
-				    color      	0
-				    default_color 	TRUE)
-				anchor     	2
-				anchor_loc 	1
-				nlines     	1
-				max_width  	15
-				justify    	0
-				label      	"1"
-				pctDist    	0.900000
-				height     	54
-				orientation 	1))
-			(object RoleView "$UNNAMED$2" @19
-			    Parent_View 	@15
-			    location   	(1298, -137)
-			    stereotype 	TRUE
-			    line_color 	3342489
-			    quidu      	"41EC1D990243"
-			    client     	@15
-			    supplier   	@7
-			    vertices   	(list Points
-				(1634, 791)
-				(1185, 791))
-			    line_style 	3
-			    origin_attachment 	(1634, 791)
-			    terminal_attachment 	(1185, 791))))
-		(object AttachView "" @20
-		    stereotype 	TRUE
-		    line_color 	3342489
-		    client     	@2
-		    supplier   	@7
-		    vertices   	(list Points
-			(657, 1048)
-			(829, 870))
-		    line_style 	0)
-		(object AssociationViewNew "$UNNAMED$3" @21
-		    location   	(399, 691)
-		    font       	(object Font
-			size       	10
-			face       	"Arial"
-			bold       	FALSE
-			italics    	FALSE
-			underline  	FALSE
-			strike     	FALSE
-			color      	0
-			default_color 	TRUE)
-		    stereotype 	TRUE
-		    line_color 	3342489
-		    quidu      	"41F5672000E8"
-		    roleview_list 	(list RoleViews
-			(object RoleView "workbenchModules" @22
-			    Parent_View 	@21
-			    location   	(-33, 403)
-			    font       	(object Font
-				size       	10
-				face       	"Arial"
-				bold       	FALSE
-				italics    	FALSE
-				underline  	FALSE
-				strike     	FALSE
-				color      	0
-				default_color 	TRUE)
-			    label      	(object SegLabel @23
-				Parent_View 	@22
-				location   	(476, 747)
-				font       	(object Font
-				    size       	10
-				    face       	"Arial"
-				    bold       	FALSE
-				    italics    	FALSE
-				    underline  	FALSE
-				    strike     	FALSE
-				    color      	0
-				    default_color 	TRUE)
-				anchor     	1
-				anchor_loc 	1
-				nlines     	1
-				max_width  	373
-				justify    	0
-				label      	"+workbenchModules"
-				pctDist    	0.253289
-				height     	56
-				orientation 	1)
-			    stereotype 	TRUE
-			    line_color 	3342489
-			    quidu      	"41F567210111"
-			    client     	@21
-			    supplier   	@7
-			    vertices   	(list Points
-				(399, 691)
-				(703, 691))
-			    line_style 	3
-			    origin_attachment 	(399, 691)
-			    terminal_attachment 	(703, 691)
-			    label      	(object SegLabel @24
-				Parent_View 	@22
-				location   	(640, 632)
-				font       	(object Font
-				    size       	10
-				    face       	"Arial"
-				    bold       	FALSE
-				    italics    	FALSE
-				    underline  	FALSE
-				    strike     	FALSE
-				    color      	0
-				    default_color 	TRUE)
-				anchor     	2
-				anchor_loc 	1
-				nlines     	1
-				max_width  	15
-				justify    	0
-				label      	"0..*"
-				pctDist    	0.792763
-				height     	59
-				orientation 	0))
-			(object RoleView "$UNNAMED$4" @25
-			    Parent_View 	@21
-			    location   	(-33, 403)
-			    stereotype 	TRUE
-			    line_color 	3342489
-			    quidu      	"41F567210113"
-			    client     	@21
-			    supplier   	@5
-			    vertices   	(list Points
-				(399, 691)
-				(325, 691)
-				(325, 461))
-			    line_style 	3
-			    origin_attachment 	(399, 691)
-			    terminal_attachment 	(325, 461))))
-		(object AssociationViewNew "$UNNAMED$5" @26
-		    location   	(1322, 633)
-		    font       	(object Font
-			size       	10
-			face       	"Arial"
-			bold       	FALSE
-			italics    	FALSE
-			underline  	FALSE
-			strike     	FALSE
-			color      	0
-			default_color 	TRUE)
-		    stereotype 	TRUE
-		    line_color 	3342489
-		    quidu      	"420146A502E2"
-		    roleview_list 	(list RoleViews
-			(object RoleView "modules" @27
-			    Parent_View 	@26
-			    location   	(490, -711)
-			    font       	(object Font
-				size       	10
-				face       	"Arial"
-				bold       	FALSE
-				italics    	FALSE
-				underline  	FALSE
-				strike     	FALSE
-				color      	0
-				default_color 	TRUE)
-			    label      	(object SegLabel @28
-				Parent_View 	@27
-				location   	(1367, 545)
-				font       	(object Font
-				    size       	10
-				    face       	"Arial"
-				    bold       	FALSE
-				    italics    	FALSE
-				    underline  	FALSE
-				    strike     	FALSE
-				    color      	0
-				    default_color 	TRUE)
-				anchor     	1
-				anchor_loc 	1
-				nlines     	1
-				max_width  	180
-				justify    	0
-				label      	"+modules"
-				pctDist    	0.475736
-				height     	72
-				orientation 	0)
-			    stereotype 	TRUE
-			    line_color 	3342489
-			    quidu      	"420146A6027F"
-			    client     	@26
-			    supplier   	@6
-			    vertices   	(list Points
-				(1322, 633)
-				(1460, 589))
-			    line_style 	0
-			    label      	(object SegLabel @29
-				Parent_View 	@27
-				location   	(1427, 662)
-				font       	(object Font
-				    size       	10
-				    face       	"Arial"
-				    bold       	FALSE
-				    italics    	FALSE
-				    underline  	FALSE
-				    strike     	FALSE
-				    color      	0
-				    default_color 	TRUE)
-				anchor     	2
-				anchor_loc 	1
-				nlines     	1
-				max_width  	15
-				justify    	0
-				label      	"0..*"
-				pctDist    	0.636077
-				height     	59
-				orientation 	1))
-			(object RoleView "$UNNAMED$6" @30
-			    Parent_View 	@26
-			    location   	(490, -711)
-			    stereotype 	TRUE
-			    line_color 	3342489
-			    quidu      	"420146A60281"
-			    client     	@26
-			    supplier   	@7
-			    vertices   	(list Points
-				(1322, 633)
-				(1185, 675))
-			    line_style 	0)))
-		(object NoteView @31
-		    location   	(2784, 416)
-		    font       	(object Font
-			size       	10
-			face       	"Arial"
-			bold       	FALSE
-			italics    	FALSE
-			underline  	FALSE
-			strike     	FALSE
-			color      	0
-			default_color 	TRUE)
-		    label      	(object ItemLabel
-			Parent_View 	@31
-			location   	(2387, 166)
-			fill_color 	13434879
-			nlines     	10
-			max_width  	759
-			label      	
-|The dependent module "handle" must be resolvable to a WorkbenchModule.
-|
-|The DeployedPath specifies the location of the referenced module in this deployment structure.
-|
-|The dependencyType specifies how the dependent module is assembled.
-			)
-		    line_color 	3342489
-		    fill_color 	13434879
-		    width      	819
-		    height     	513)
-		(object ClassView "Class" "Logical View::moduleCore::DependencyType" @32
-		    ShowCompartmentStereotypes 	TRUE
-		    IncludeAttribute 	TRUE
-		    IncludeOperation 	TRUE
-		    location   	(2560, 944)
-		    font       	(object Font
-			size       	10
-			face       	"Arial"
-			bold       	FALSE
-			italics    	FALSE
-			underline  	FALSE
-			strike     	FALSE
-			color      	0
-			default_color 	TRUE)
-		    label      	(object ItemLabel
-			Parent_View 	@32
-			location   	(2387, 860)
-			fill_color 	13434879
-			nlines     	1
-			max_width  	346
-			justify    	0
-			label      	"DependencyType")
-		    stereotype 	(object ItemLabel
-			Parent_View 	@32
-			location   	(2387, 810)
-			fill_color 	13434879
-			anchor     	10
-			nlines     	1
-			max_width  	346
-			justify    	0
-			label      	"<<enumeration>>")
-		    icon_style 	"Icon"
-		    line_color 	3342489
-		    fill_color 	13434879
-		    quidu      	"420394F50185"
-		    compartment 	(object Compartment
-			Parent_View 	@32
-			location   	(2387, 921)
-			font       	(object Font
-			    size       	10
-			    face       	"Arial"
-			    bold       	FALSE
-			    italics    	FALSE
-			    underline  	FALSE
-			    strike     	FALSE
-			    color      	0
-			    default_color 	TRUE)
-			icon_style 	"Icon"
-			fill_color 	13434879
-			anchor     	2
-			nlines     	3
-			max_width  	237)
-		    width      	364
-		    height     	292
-		    annotation 	8
-		    autoResize 	TRUE)
-		(object AttachView "" @33
-		    stereotype 	TRUE
-		    line_color 	3342489
-		    client     	@6
-		    supplier   	@31
-		    vertices   	(list Points
-			(2187, 455)
-			(2374, 443))
-		    line_style 	0)))))
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/rose/moduleCore.ecore b/plugins/org.eclipse.wst.common.emfworkbench.integration/rose/moduleCore.ecore
deleted file mode 100644
index 00723f2..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/rose/moduleCore.ecore
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="modulecore"
-    nsURI="modulecore.xmi" nsPrefix="org.eclipse.wst.common.modulecore">
-  <eClassifiers xsi:type="ecore:EClass" name="WorkbenchModule">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="handle" eType="#//URI"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="deployedName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="resources" upperBound="-1"
-        eType="#//WorkbenchModuleResource" containment="true" eOpposite="#//WorkbenchModuleResource/module"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="moduleType" lowerBound="1"
-        eType="#//ModuleType"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="modules" upperBound="-1"
-        eType="#//DependentModule"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkbenchModuleResource">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="sourcePath" eType="#//URI"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="deployedPath" eType="#//URI"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="exclusions" upperBound="-1"
-        eType="#//URI"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="module" lowerBound="1"
-        eType="#//WorkbenchModule" transient="true" eOpposite="#//WorkbenchModule/resources"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ModuleType">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="metadataResources" upperBound="-1"
-        eType="#//URI"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="moduleTypeId" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="URI" instanceClassName="org.eclipse.emf.common.util.URI"/>
-  <eClassifiers xsi:type="ecore:EClass" name="ProjectModules">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="projectName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="workbenchModules" upperBound="-1"
-        eType="#//WorkbenchModule" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DependentModule">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="handle" eType="#//URI"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="deployedPath" eType="#//URI"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="dependencyType" eType="#//DependencyType"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EEnum" name="DependencyType">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="uses=0&#xD;&#xA;consumes=1"/>
-    </eAnnotations>
-    <eLiterals name="uses"/>
-    <eLiterals name="consumes" value="1"/>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/rose/moduleCore.mdl b/plugins/org.eclipse.wst.common.emfworkbench.integration/rose/moduleCore.mdl
deleted file mode 100644
index 7e9b4c5..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/rose/moduleCore.mdl
+++ /dev/null
@@ -1,8839 +0,0 @@
-
-(object Petal
-    version    	50
-    _written   	"Rose 8.3.0407.2800"
-    charSet    	0)
-
-(object Design "Logical View"
-    is_unit    	TRUE
-    is_loaded  	TRUE
-    attributes 	(list Attribute_Set
-	(object Attribute
-	    tool       	"Java"
-	    name       	"IDE"
-	    value      	"Internal Editor")
-	(object Attribute
-	    tool       	"Java"
-	    name       	"UserDefineTagName1"
-	    value      	"")
-	(object Attribute
-	    tool       	"Java"
-	    name       	"UserDefineTagText1"
-	    value      	"")
-	(object Attribute
-	    tool       	"Java"
-	    name       	"UserDefineTagApply1"
-	    value      	"")
-	(object Attribute
-	    tool       	"Java"
-	    name       	"UserDefineTagName2"
-	    value      	"")
-	(object Attribute
-	    tool       	"Java"
-	    name       	"UserDefineTagText2"
-	    value      	"")
-	(object Attribute
-	    tool       	"Java"
-	    name       	"UserDefineTagApply2"
-	    value      	"")
-	(object Attribute
-	    tool       	"Java"
-	    name       	"UserDefineTagName3"
-	    value      	"")
-	(object Attribute
-	    tool       	"Java"
-	    name       	"UserDefineTagText3"
-	    value      	"")
-	(object Attribute
-	    tool       	"Java"
-	    name       	"UserDefineTagApply3"
-	    value      	""))
-    quid       	"3A0B2474025F"
-    enforceClosureAutoLoad 	FALSE
-    defaults   	(object defaults
-	rightMargin 	0.250000
-	leftMargin 	0.250000
-	topMargin  	0.250000
-	bottomMargin 	0.500000
-	pageOverlap 	0.250000
-	clipIconLabels 	TRUE
-	autoResize 	TRUE
-	snapToGrid 	TRUE
-	gridX      	16
-	gridY      	16
-	defaultFont 	(object Font
-	    size       	10
-	    face       	"Arial"
-	    bold       	FALSE
-	    italics    	FALSE
-	    underline  	FALSE
-	    strike     	FALSE
-	    color      	0
-	    default_color 	TRUE)
-	showMessageNum 	1
-	showClassOfObject 	TRUE
-	notation   	"Unified")
-    root_usecase_package 	(object Class_Category "Use Case View"
-	quid       	"3A0B2474026A"
-	exportControl 	"Public"
-	global     	TRUE
-	logical_models 	(list unit_reference_list)
-	logical_presentations 	(list unit_reference_list
-	    (object UseCaseDiagram "Main"
-		quid       	"3A0B24790339"
-		title      	"Main"
-		zoom       	100
-		max_height 	28350
-		max_width  	21600
-		origin_x   	0
-		origin_y   	0
-		items      	(list diagram_item_list))))
-    root_category 	(object Class_Category "Logical View"
-	quid       	"3A0B24740269"
-	exportControl 	"Public"
-	global     	TRUE
-	subsystem  	"Component View"
-	quidu      	"3A0B2474027D"
-	logical_models 	(list unit_reference_list
-	    (object Class_Category "moduleCore"
-		is_unit    	TRUE
-		is_loaded  	FALSE
-		file_name  	"$WORKSPACE_ROOT\\org.eclipse.wst.common.emfworkbench.integration\\rose\\moduleCore.cat"
-		quid       	"3A0DB68B0046"))
-	logical_presentations 	(list unit_reference_list
-	    (object ClassDiagram "PackageView"
-		quid       	"3A0B24790360"
-		title      	"PackageView"
-		zoom       	100
-		max_height 	28350
-		max_width  	21600
-		origin_x   	650
-		origin_y   	0
-		items      	(list diagram_item_list
-		    (object CategoryView "Logical View::moduleCore" @1
-			location   	(352, 320)
-			font       	(object Font
-			    size       	10
-			    face       	"Arial"
-			    bold       	FALSE
-			    italics    	FALSE
-			    underline  	FALSE
-			    strike     	FALSE
-			    color      	0
-			    default_color 	TRUE)
-			label      	(object ItemLabel
-			    Parent_View 	@1
-			    location   	(208, 236)
-			    fill_color 	13434879
-			    nlines     	2
-			    max_width  	288
-			    justify    	0
-			    label      	"moduleCore")
-			icon_style 	"Label"
-			line_color 	3342489
-			fill_color 	13434879
-			quidu      	"3A0DB68B0046"
-			width      	300
-			height     	180)))))
-    root_subsystem 	(object SubSystem "Component View"
-	quid       	"3A0B2474027D"
-	physical_models 	(list unit_reference_list)
-	physical_presentations 	(list unit_reference_list
-	    (object Module_Diagram "Main"
-		quid       	"3A0B24790338"
-		title      	"Main"
-		zoom       	100
-		max_height 	28350
-		max_width  	21600
-		origin_x   	0
-		origin_y   	0
-		items      	(list diagram_item_list)))
-	category   	"Logical View"
-	quidu      	"41EC1C3B00A4")
-    process_structure 	(object Processes
-	quid       	"3A0B2474027E"
-	ProcsNDevs 	(list
-	    (object Process_Diagram "Deployment View"
-		quid       	"3A0B24740291"
-		title      	"Deployment View"
-		zoom       	100
-		max_height 	28350
-		max_width  	21600
-		origin_x   	0
-		origin_y   	0
-		items      	(list diagram_item_list))))
-    properties 	(object Properties
-	attributes 	(list Attribute_Set
-	    (object Attribute
-		tool       	"Ecore"
-		name       	"roseId"
-		value      	"753117540")
-	    (object Attribute
-		tool       	"Ecore"
-		name       	"propertyId"
-		value      	"809135966")
-	    (object Attribute
-		tool       	"Ecore"
-		name       	"default__Category"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"prefix"
-			value      	"")
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"packageName"
-			value      	"")
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"basePackage"
-			value      	"")
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"nsName"
-			value      	"")
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"nsURI"
-			value      	"")))
-	    (object Attribute
-		tool       	"Ecore"
-		name       	"default__Category"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"packageName"
-			value      	"")
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"prefix"
-			value      	"")
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"basePackage"
-			value      	"")
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"nsName"
-			value      	"")
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"nsURI"
-			value      	"")))
-	    (object Attribute
-		tool       	"Ecore"
-		name       	"default__Category"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"basePackage"
-			value      	"")
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"prefix"
-			value      	"")
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"packageName"
-			value      	"")
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"nsName"
-			value      	"")
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"nsURI"
-			value      	"")))
-	    (object Attribute
-		tool       	"Ecore"
-		name       	"default__Category"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"nsName"
-			value      	"")
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"prefix"
-			value      	"")
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"packageName"
-			value      	"")
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"basePackage"
-			value      	"")
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"nsURI"
-			value      	"")))
-	    (object Attribute
-		tool       	"Ecore"
-		name       	"default__Category"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"nsURI"
-			value      	"")
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"prefix"
-			value      	"")
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"packageName"
-			value      	"")
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"basePackage"
-			value      	"")
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"nsName"
-			value      	"")))
-	    (object Attribute
-		tool       	"Ecore"
-		name       	"default__Attribute"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"isTransient"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"isVolatile"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"isChangeable"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"isUnsettable"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"isUnique"
-			value      	TRUE)))
-	    (object Attribute
-		tool       	"Ecore"
-		name       	"default__Role"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"isTransient"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"isVolatile"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"isChangeable"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"isUnsettable"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ecore"
-			name       	"isResolveProxies"
-			value      	TRUE)))
-	    (object Attribute
-		tool       	"Cplusplus"
-		name       	"propertyId"
-		value      	"809135966")
-	    (object Attribute
-		tool       	"Cplusplus"
-		name       	"default__Role"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"Synchronize"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"CodeName"
-			value      	"")
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"Const"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"InitialValue"
-			value      	"")))
-	    (object Attribute
-		tool       	"Cplusplus"
-		name       	"default__Inherit"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"Synchronize"
-			value      	TRUE)))
-	    (object Attribute
-		tool       	"Cplusplus"
-		name       	"default__Module-Spec"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"Synchronize"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"Copyright"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"RootPackage"
-			value      	"C++ Reverse Engineered")
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"InitialHeaderIncludes"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"InitialBodyIncludes"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"RevEngRootDirectory"
-			value      	"")
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"RevEngDirectoriesAsPackages"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"HeaderFileExtension"
-			value      	".h")
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"ImplementationFileExtension"
-			value      	".cpp")
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"NewHeaderFileDirectory"
-			value      	"")
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"NewImplementationFileDirectory"
-			value      	"")
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"FileCapitalization"
-			value      	("FileCapitalizationSet" 0))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"CodeGenExtraDirectories"
-			value      	("CodeGenExtraDirectoriesSet" 0))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"StripClassPrefix"
-			value      	"")
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"UseTabs"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"TabWidth"
-			value      	8)
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"IndentWidth"
-			value      	4)
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"AccessIndentation"
-			value      	-2)
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"ModelIdCommentRules"
-			value      	("ModelIdCommentRulesSet" 1))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"PageWidth"
-			value      	80)
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"ClassMemberOrder"
-			value      	("MemberOrderSet" 1))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"OneParameterPerLine"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"NamespaceBraceStyle"
-			value      	("BraceStyleSet" 2))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"ClassBraceStyle"
-			value      	("BraceStyleSet" 2))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"FunctionBraceStyle"
-			value      	("BraceStyleSet" 2))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"CodeGenExtraDirectoriesSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"None"
-				value      	0)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Namespaces"
-				value      	1)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Packages"
-				value      	2)))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"FileCapitalizationSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Same as model"
-				value      	0)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Lower case"
-				value      	1)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Upper case"
-				value      	2)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Lower case with underscores"
-				value      	3)))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"BraceStyleSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"B1"
-				value      	1)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"B2"
-				value      	2)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"B3"
-				value      	3)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"B4"
-				value      	4)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"B5"
-				value      	5)))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"MemberOrderSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Public First"
-				value      	1)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Private First"
-				value      	2)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Order by kind"
-				value      	3)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Unordered"
-				value      	4)))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"ModelIdCommentRulesSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Code generation only"
-				value      	1)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Code generation and reverse engineering"
-				value      	2)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Never generate model IDs"
-				value      	3)))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"CreateBackupFiles"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"CommentRules"
-			value      	("CommentRulesSet" 1))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"CommentRulesSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Always synchronize"
-				value      	1)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Code generation only"
-				value      	2)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Reverse engineering only"
-				value      	3)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Never synchronize"
-				value      	4)))))
-	    (object Attribute
-		tool       	"Cplusplus"
-		name       	"default__Param"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"CodeName"
-			value      	"")))
-	    (object Attribute
-		tool       	"Cplusplus"
-		name       	"default__Attribute"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"Synchronize"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"CodeName"
-			value      	"")))
-	    (object Attribute
-		tool       	"Cplusplus"
-		name       	"default__Operation"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"Synchronize"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"CodeName"
-			value      	"")
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"InitialCodeBody"
-			value      	"")
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"Inline"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"GenerateFunctionBody"
-			value      	("GenerateFunctionBodySet" 2))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"GenerateFunctionBodySet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Default"
-				value      	2)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"True"
-				value      	1)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"False"
-				value      	0)))))
-	    (object Attribute
-		tool       	"Cplusplus"
-		name       	"default__Class"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"Synchronize"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"CodeName"
-			value      	"")
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"ImplementationType"
-			value      	"")
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"HeaderSourceFile"
-			value      	"")
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"BodySourceFile"
-			value      	"")))
-	    (object Attribute
-		tool       	"Cplusplus"
-		name       	"default__Category"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"CodeName"
-			value      	"")
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"IsNamespace"
-			value      	FALSE)))
-	    (object Attribute
-		tool       	"Cplusplus"
-		name       	"HiddenTool"
-		value      	FALSE)
-	    (object Attribute
-		tool       	"ANSI C++ Event Watcher"
-		name       	"HiddenTool"
-		value      	FALSE)
-	    (object Attribute
-		tool       	"ANSIConvert"
-		name       	"HiddenTool"
-		value      	FALSE)
-	    (object Attribute
-		tool       	"Ada83"
-		name       	"propertyId"
-		value      	"838326200")
-	    (object Attribute
-		tool       	"Ada83"
-		name       	"default__Project"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"SpecFileExtension"
-			value      	"1.ada")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"SpecFileBackupExtension"
-			value      	"1.ad~")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"SpecFileTemporaryExtension"
-			value      	"1.ad#")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"BodyFileExtension"
-			value      	"2.ada")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"BodyFileBackupExtension"
-			value      	"2.ad~")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"BodyFileTemporaryExtension"
-			value      	"2.ad#")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"CreateMissingDirectories"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"GenerateBodies"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"GenerateAccessorOperations"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"GenerateStandardOperations"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"ImplicitParameter"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"CommentWidth"
-			value      	60)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"StopOnError"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"ErrorLimit"
-			value      	30)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"UseFileName"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"Directory"
-			value      	"$ROSEADA83_SOURCE")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"DefaultCodeBody"
-			value      	"[statement]")))
-	    (object Attribute
-		tool       	"Ada83"
-		name       	"default__Class"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"CodeName"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"ClassName"
-			value      	"Object")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"ClassAccess"
-			value      	("ImplementationSet" 43))
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"ImplementationType"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"IsSubtype"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"PolymorphicUnit"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"HandleName"
-			value      	"Handle")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"HandleAccess"
-			value      	("ImplementationSet" 45))
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"Discriminant"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"Variant"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"EnumerationLiteralPrefix"
-			value      	"A_")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"RecordFieldPrefix"
-			value      	"The_")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"GenerateAccessorOperations"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"GenerateStandardOperations"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"ImplicitParameter"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"ClassParameterName"
-			value      	"This")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"DefaultConstructorKind"
-			value      	("ConstructorKindSet" 199))
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"DefaultConstructorName"
-			value      	"Create")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"InlineDefaultConstructor"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"CopyConstructorKind"
-			value      	("ConstructorKindSet" 199))
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"CopyConstructorName"
-			value      	"Copy")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"InlineCopyConstructor"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"DestructorName"
-			value      	"Free")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"InlineDestructor"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"ClassEqualityOperation"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"HandleEqualityOperation"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"InlineEquality"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"IsTask"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"Representation"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"ImplementationSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"Public"
-				value      	45)
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"Private"
-				value      	43)
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"LimitedPrivate"
-				value      	200)
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"DoNotCreate"
-				value      	201)))
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"ConstructorKindSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"Procedure"
-				value      	202)
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"Function"
-				value      	199)
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"DoNotCreate"
-				value      	201)))))
-	    (object Attribute
-		tool       	"Ada83"
-		name       	"default__Module-Spec"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"Generate"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"CopyrightNotice"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"FileName"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"ReturnType"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"GenericFormalParameters"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"AdditionalWiths"
-			value      	(value Text ""))))
-	    (object Attribute
-		tool       	"Ada83"
-		name       	"default__Module-Body"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"Generate"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"CopyrightNotice"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"FileName"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"ReturnType"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"AdditionalWiths"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"IsSubunit"
-			value      	FALSE)))
-	    (object Attribute
-		tool       	"Ada83"
-		name       	"default__Operation"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"CodeName"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"SubprogramImplementation"
-			value      	("SubprogramImplementationSet" 2))
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"ClassParameterMode"
-			value      	("ParameterModeSet" 203))
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"Inline"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"EntryCode"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"ExitCode"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"Representation"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"SubprogramImplementationSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"Spec"
-				value      	1)
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"Body"
-				value      	2)
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"Renaming"
-				value      	3)
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"Separate"
-				value      	4)))
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"ParameterModeSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"In"
-				value      	204)
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"Out"
-				value      	205)
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"InOut"
-				value      	203)
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"FunctionReturn"
-				value      	206)
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"DoNotCreate"
-				value      	201)))
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"Renames"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"InitialCodeBody"
-			value      	"${default}")))
-	    (object Attribute
-		tool       	"Ada83"
-		name       	"default__Has"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"CodeName"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"NameIfUnlabeled"
-			value      	"The_${supplier}")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"DataMemberName"
-			value      	"${relationship}")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"GetName"
-			value      	"Get_${relationship}")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"InlineGet"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"SetName"
-			value      	"Set_${relationship}")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"InlineSet"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"IsConstant"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"InitialValue"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"Variant"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"ContainerGeneric"
-			value      	"List")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"ContainerType"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"ContainerDeclarations"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"SelectorName"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"SelectorType"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"Declare"
-			value      	("DeclareSet" 234))
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"DeclareSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"Before"
-				value      	233)
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"After"
-				value      	234)))))
-	    (object Attribute
-		tool       	"Ada83"
-		name       	"default__Attribute"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"CodeName"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"DataMemberName"
-			value      	"${attribute}")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"GetName"
-			value      	"Get_${attribute}")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"InlineGet"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"SetName"
-			value      	"Set_${attribute}")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"InlineSet"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"IsConstant"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"InitialValue"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"Variant"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"Representation"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"Declare"
-			value      	("DeclareSet" 234))
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"DeclareSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"Before"
-				value      	233)
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"After"
-				value      	234)))))
-	    (object Attribute
-		tool       	"Ada83"
-		name       	"default__Association"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"NameIfUnlabeled"
-			value      	"The_${targetClass}")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"GetName"
-			value      	"Get_${association}")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"InlineGet"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"SetName"
-			value      	"Set_${association}")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"InlineSet"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"GenerateAssociate"
-			value      	("ProcedureKindSet" 202))
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"AssociateName"
-			value      	"Associate")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"InlineAssociate"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"GenerateDissociate"
-			value      	("ProcedureKindSet" 202))
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"DissociateName"
-			value      	"Dissociate")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"InlineDissociate"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"ProcedureKindSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"Procedure"
-				value      	202)
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"DoNotCreate"
-				value      	201)))
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"FunctionKindSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"Function"
-				value      	199)
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"DoNotCreate"
-				value      	201)))))
-	    (object Attribute
-		tool       	"Ada83"
-		name       	"default__Role"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"CodeName"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"NameIfUnlabeled"
-			value      	"The_${targetClass}")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"DataMemberName"
-			value      	"${target}")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"GetName"
-			value      	"Get_${target}")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"InlineGet"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"SetName"
-			value      	"Set_${target}")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"InlineSet"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"IsConstant"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"InitialValue"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"ContainerGeneric"
-			value      	"List")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"ContainerType"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"ContainerDeclarations"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"SelectorName"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"SelectorType"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"ProcedureKindSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"Procedure"
-				value      	202)
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"DoNotCreate"
-				value      	201)))
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"Declare"
-			value      	("DeclareSet" 234))
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"DeclareSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"Before"
-				value      	233)
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"After"
-				value      	234)))
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"Representation"
-			value      	(value Text ""))))
-	    (object Attribute
-		tool       	"Ada83"
-		name       	"default__Subsystem"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"Directory"
-			value      	"AUTO GENERATE")))
-	    (object Attribute
-		tool       	"Ada83"
-		name       	"HiddenTool"
-		value      	FALSE)
-	    (object Attribute
-		tool       	"Ada95"
-		name       	"propertyId"
-		value      	"838326200")
-	    (object Attribute
-		tool       	"Ada95"
-		name       	"default__Project"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"SpecFileExtension"
-			value      	"1.ada")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"SpecFileBackupExtension"
-			value      	"1.ad~")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"SpecFileTemporaryExtension"
-			value      	"1.ad#")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"BodyFileExtension"
-			value      	"2.ada")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"BodyFileBackupExtension"
-			value      	"2.ad~")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"BodyFileTemporaryExtension"
-			value      	"2.ad#")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"CreateMissingDirectories"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"UseColonNotation"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GenerateBodies"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GenerateAccessorOperations"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GenerateStandardOperations"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ImplicitParameter"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"CommentWidth"
-			value      	60)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"StopOnError"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ErrorLimit"
-			value      	30)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"UseFileName"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"Directory"
-			value      	"$ROSEADA95_SOURCE")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"DefaultCodeBody"
-			value      	"[statement]")))
-	    (object Attribute
-		tool       	"Ada95"
-		name       	"default__Class"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"CodeName"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"TypeName"
-			value      	"Object")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"TypeVisibility"
-			value      	("TypeVisibilitySet" 43))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"TypeImplementation"
-			value      	("TypeImplementationSet" 208))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"TypeControl"
-			value      	("TypeControlSet" 225))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"TypeControlName"
-			value      	"Controlled_${type}")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"TypeDefinition"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"RecordImplementation"
-			value      	("RecordImplementationSet" 209))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"RecordKindPackageName"
-			value      	"${class}_Record_Kinds")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"IsLimited"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"IsSubtype"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GenerateAccessType"
-			value      	("GenerateAccessTypeSet" 230))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"AccessTypeName"
-			value      	"Handle")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"AccessTypeVisibility"
-			value      	("TypeVisibilitySet" 45))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"AccessTypeDefinition"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"AccessClassWide"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"MaybeAliased"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ParameterizedImplementation"
-			value      	("ParameterizedImplementationSet" 11))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ParentClassName"
-			value      	"Superclass")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"EnumerationLiteralPrefix"
-			value      	"A_")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"RecordFieldPrefix"
-			value      	"The_")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ArrayOfTypeName"
-			value      	"Array_Of_${type}")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"AccessArrayOfTypeName"
-			value      	"Access_Array_Of_${type}")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ArrayOfAccessTypeName"
-			value      	"Array_Of_${access_type}")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"AccessArrayOfAccessTypeName"
-			value      	"Access_Array_Of_${access_type}")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ArrayIndexDefinition"
-			value      	"Positive range <>")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GenerateAccessorOperations"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GenerateStandardOperations"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ImplicitParameter"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ImplicitParameterName"
-			value      	"This")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GenerateDefaultConstructor"
-			value      	("SubprogramKindSet" 199))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"DefaultConstructorName"
-			value      	"Create")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"InlineDefaultConstructor"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GenerateCopyConstructor"
-			value      	("SubprogramKindSet" 199))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"CopyConstructorName"
-			value      	"Copy")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"InlineCopyConstructor"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GenerateDestructor"
-			value      	("ProcedureKindSet" 202))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"DestructorName"
-			value      	"Free")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"InlineDestructor"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GenerateTypeEquality"
-			value      	("FunctionKindSet" 201))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"TypeEqualityName"
-			value      	"${quote}=${quote}")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"InlineEquality"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"Representation"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"TypeImplementationSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Tagged"
-				value      	208)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Record"
-				value      	210)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Mixin"
-				value      	211)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Protected"
-				value      	44)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Task"
-				value      	212)))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"RecordImplementationSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"SingleType"
-				value      	209)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"MultipleTypes"
-				value      	213)))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ParameterizedImplementationSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Generic"
-				value      	11)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Unconstrained"
-				value      	214)))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"TypeVisibilitySet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Public"
-				value      	45)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Private"
-				value      	43)))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"SubprogramKindSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Procedure"
-				value      	202)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Function"
-				value      	199)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"DoNotCreate"
-				value      	201)))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ProcedureKindSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Procedure"
-				value      	202)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"DoNotCreate"
-				value      	201)))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"FunctionKindSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Function"
-				value      	199)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"DoNotCreate"
-				value      	201)))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"TypeControlSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"None"
-				value      	225)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"InitializationOnly"
-				value      	226)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"AssignmentFinalizationOnly"
-				value      	227)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"All"
-				value      	228)))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GenerateAccessTypeSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Always"
-				value      	229)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Auto"
-				value      	230)))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"IncompleteType"
-			value      	("IncompleteTypeSet" 1))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"TypeControlVisibility"
-			value      	("TypeVisibilitySet" 43))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"IncompleteTypeSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"DoNotDeclare"
-				value      	1)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"NoDiscriminantPart"
-				value      	2)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"UnknownDiscriminantPart"
-				value      	3)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"KnownDiscriminantPart"
-				value      	4)))))
-	    (object Attribute
-		tool       	"Ada95"
-		name       	"default__Module-Spec"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"Generate"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"CopyrightNotice"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"FileName"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ReturnType"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GenericFormalParameters"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"AdditionalWiths"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"IsPrivate"
-			value      	FALSE)))
-	    (object Attribute
-		tool       	"Ada95"
-		name       	"default__Module-Body"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"Generate"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"CopyrightNotice"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"FileName"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ReturnType"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"AdditionalWiths"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"IsSubunit"
-			value      	FALSE)))
-	    (object Attribute
-		tool       	"Ada95"
-		name       	"default__Operation"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"CodeName"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"SubprogramImplementation"
-			value      	("SubprogramImplementationSet" 2))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"Renames"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GenerateOverriding"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ImplicitParameterMode"
-			value      	("ParameterModeSet" 203))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ImplicitParameterClassWide"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GenerateAccessOperation"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"Inline"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"EntryCode"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ExitCode"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"EntryBarrierCondition"
-			value      	"True")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"Representation"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"SubprogramImplementationSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Spec"
-				value      	1)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Body"
-				value      	2)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Abstract"
-				value      	3)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Renaming"
-				value      	4)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"RenamingAsBody"
-				value      	5)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Separate"
-				value      	6)))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ParameterModeSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"In"
-				value      	204)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Out"
-				value      	205)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"InOut"
-				value      	203)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Access"
-				value      	220)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"DoNotCreate"
-				value      	201)))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"InitialCodeBody"
-			value      	"${default}")))
-	    (object Attribute
-		tool       	"Ada95"
-		name       	"default__Has"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"CodeName"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"NameIfUnlabeled"
-			value      	"The_${supplier}")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"RecordFieldImplementation"
-			value      	("RecordFieldImplementationSet" 216))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"RecordFieldName"
-			value      	"${relationship}")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GenerateGet"
-			value      	("FunctionKindSet" 199))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GenerateAccessGet"
-			value      	("FunctionKindSet" 201))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GetName"
-			value      	"Get_${relationship}")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"InlineGet"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GenerateSet"
-			value      	("ProcedureKindSet" 202))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GenerateAccessSet"
-			value      	("ProcedureKindSet" 201))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"SetName"
-			value      	"Set_${relationship}")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"InlineSet"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"IsAliased"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"IsConstant"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"InitialValue"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ContainerImplementation"
-			value      	("ContainerImplementationSet" 217))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ContainerGeneric"
-			value      	"List")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ContainerType"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ContainerDeclarations"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"SelectorName"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"SelectorType"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"RecordFieldImplementationSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Component"
-				value      	216)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Discriminant"
-				value      	218)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"AccessDiscriminant"
-				value      	219)))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ContainerImplementationSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Array"
-				value      	217)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Generic"
-				value      	11)))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ProcedureKindSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Procedure"
-				value      	202)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"DoNotCreate"
-				value      	201)))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"FunctionKindSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Function"
-				value      	199)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"DoNotCreate"
-				value      	201)))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"Declare"
-			value      	("DeclareSet" 234))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"DeclareSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Before"
-				value      	233)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"After"
-				value      	234)))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"AccessDiscriminantClassWide"
-			value      	FALSE)))
-	    (object Attribute
-		tool       	"Ada95"
-		name       	"default__Attribute"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"CodeName"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"RecordFieldImplementation"
-			value      	("RecordFieldImplementationSet" 216))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"RecordFieldName"
-			value      	"${attribute}")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GenerateGet"
-			value      	("FunctionKindSet" 199))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GenerateAccessGet"
-			value      	("FunctionKindSet" 201))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GetName"
-			value      	"Get_${attribute}")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"InlineGet"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GenerateSet"
-			value      	("ProcedureKindSet" 202))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GenerateAccessSet"
-			value      	("ProcedureKindSet" 201))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"SetName"
-			value      	"Set_${attribute}")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"InlineSet"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"IsAliased"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"IsConstant"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"InitialValue"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"Representation"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"RecordFieldImplementationSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Component"
-				value      	216)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Discriminant"
-				value      	218)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"AccessDiscriminant"
-				value      	219)))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ProcedureKindSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Procedure"
-				value      	202)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"DoNotCreate"
-				value      	201)))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"FunctionKindSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Function"
-				value      	199)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"DoNotCreate"
-				value      	201)))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"Declare"
-			value      	("DeclareSet" 234))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"DeclareSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Before"
-				value      	233)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"After"
-				value      	234)))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"AccessDiscriminantClassWide"
-			value      	FALSE)))
-	    (object Attribute
-		tool       	"Ada95"
-		name       	"default__Association"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"NameIfUnlabeled"
-			value      	"The_${targetClass}")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GenerateGet"
-			value      	("FunctionKindSet" 199))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GetName"
-			value      	"Get_${association}")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"InlineGet"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GenerateSet"
-			value      	("ProcedureKindSet" 202))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"SetName"
-			value      	"Set_${association}")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"InlineSet"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GenerateAssociate"
-			value      	("ProcedureKindSet" 202))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"AssociateName"
-			value      	"Associate")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"InlineAssociate"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GenerateDissociate"
-			value      	("ProcedureKindSet" 202))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"DissociateName"
-			value      	"Dissociate")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"InlineDissociate"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ProcedureKindSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Procedure"
-				value      	202)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"DoNotCreate"
-				value      	201)))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"FunctionKindSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Function"
-				value      	199)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"DoNotCreate"
-				value      	201)))))
-	    (object Attribute
-		tool       	"Ada95"
-		name       	"default__Role"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"CodeName"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"NameIfUnlabeled"
-			value      	"The_${targetClass}")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"RecordFieldImplementation"
-			value      	("RecordFieldImplementationSet" 216))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"RecordFieldName"
-			value      	"${target}")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GenerateGet"
-			value      	("FunctionKindSet" 199))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GenerateAccessGet"
-			value      	("FunctionKindSet" 201))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GetName"
-			value      	"Get_${target}")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"InlineGet"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GenerateSet"
-			value      	("ProcedureKindSet" 202))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"GenerateAccessSet"
-			value      	("ProcedureKindSet" 201))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"SetName"
-			value      	"Set_${target}")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"InlineSet"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"IsAliased"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"IsConstant"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"InitialValue"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ContainerImplementation"
-			value      	("ContainerImplementationSet" 217))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ContainerGeneric"
-			value      	"List")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ContainerType"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ContainerDeclarations"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"SelectorName"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"SelectorType"
-			value      	"")
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ProcedureKindSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Procedure"
-				value      	202)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"DoNotCreate"
-				value      	201)))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"RecordFieldImplementationSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Component"
-				value      	216)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Discriminant"
-				value      	218)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"AccessDiscriminant"
-				value      	219)))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ContainerImplementationSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Array"
-				value      	217)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Generic"
-				value      	11)))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"FunctionKindSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Function"
-				value      	199)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"DoNotCreate"
-				value      	201)))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"Declare"
-			value      	("DeclareSet" 234))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"DeclareSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Before"
-				value      	233)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"After"
-				value      	234)))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"AccessDiscriminantClassWide"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"Representation"
-			value      	(value Text ""))))
-	    (object Attribute
-		tool       	"Ada95"
-		name       	"default__Subsystem"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"Directory"
-			value      	"AUTO GENERATE")))
-	    (object Attribute
-		tool       	"Ada95"
-		name       	"HiddenTool"
-		value      	FALSE)
-	    (object Attribute
-		tool       	"CORBA"
-		name       	"propertyId"
-		value      	"809135966")
-	    (object Attribute
-		tool       	"CORBA"
-		name       	"default__Project"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"CreateMissingDirectories"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"Editor"
-			value      	("EditorType" 100))
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"IncludePath"
-			value      	"")
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"StopOnError"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"EditorType"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"CORBA"
-				name       	"BuiltIn"
-				value      	100)
-			    (object Attribute
-				tool       	"CORBA"
-				name       	"WindowsShell"
-				value      	101)))
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"PathSeparator"
-			value      	"")))
-	    (object Attribute
-		tool       	"CORBA"
-		name       	"default__Class"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"ArrayDimensions"
-			value      	"")
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"ConstValue"
-			value      	"")
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"ImplementationType"
-			value      	"")))
-	    (object Attribute
-		tool       	"CORBA"
-		name       	"default__Module-Spec"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"AdditionalIncludes"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"CmIdentification"
-			value      	(value Text "  %X% %Q% %Z% %W%"))
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"CopyrightNotice"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"InclusionProtectionSymbol"
-			value      	"AUTO GENERATE")))
-	    (object Attribute
-		tool       	"CORBA"
-		name       	"default__Module-Body"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"AdditionalIncludes"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"CmIdentification"
-			value      	(value Text "  %X% %Q% %Z% %W%"))
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"CopyrightNotice"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"InclusionProtectionSymbol"
-			value      	"AUTO GENERATE")))
-	    (object Attribute
-		tool       	"CORBA"
-		name       	"default__Operation"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"Context"
-			value      	"")
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"OperationIsOneWay"
-			value      	FALSE)))
-	    (object Attribute
-		tool       	"CORBA"
-		name       	"default__Attribute"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"ArrayDimensions"
-			value      	"")
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"CaseSpecifier"
-			value      	"")
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"IsReadOnly"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"Order"
-			value      	"")))
-	    (object Attribute
-		tool       	"CORBA"
-		name       	"default__Role"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"ArrayDimensions"
-			value      	"")
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"CaseSpecifier"
-			value      	"")
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"GenerateForwardReference"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"IsReadOnly"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"Order"
-			value      	"")
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"BoundedRoleType"
-			value      	("AssocTypeSet" 47))
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"AssocTypeSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"CORBA"
-				name       	"Array"
-				value      	24)
-			    (object Attribute
-				tool       	"CORBA"
-				name       	"Sequence"
-				value      	47)))))
-	    (object Attribute
-		tool       	"CORBA"
-		name       	"default__Uses"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"GenerateForwardReference"
-			value      	FALSE)))
-	    (object Attribute
-		tool       	"CORBA"
-		name       	"HiddenTool"
-		value      	FALSE)
-	    (object Attribute
-		tool       	"Data Modeler"
-		name       	"propertyId"
-		value      	"809135966")
-	    (object Attribute
-		tool       	"Data Modeler"
-		name       	"default__Project"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"project"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"TableCounter"
-			value      	0)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"DomainCounter"
-			value      	0)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"SPPackageCounter"
-			value      	0)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"TriggerCounter"
-			value      	0)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IndexCounter"
-			value      	0)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"ConstraintCounter"
-			value      	0)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"StoreProcedureCounter"
-			value      	0)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"PrimaryKeyCounter"
-			value      	0)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"ForeignKeyCounter"
-			value      	0)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"TablePrefix"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"DomainPrefix"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"TriggerPrefix"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IndexPrefix"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"ConstraintPrefix"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"StoreProcedurePrefix"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"PrimaryKeyPrefix"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"ForeignKeyPrefix"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"ViewCounter"
-			value      	0)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"JoinCounter"
-			value      	0)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"TableSpaceCounter"
-			value      	0)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"cONTAINERCounter"
-			value      	0)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"ViewPrefix"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"TableSpacePrefix"
-			value      	"")))
-	    (object Attribute
-		tool       	"Data Modeler"
-		name       	"default__Module-Spec"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"dmItem"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"DMName"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsDatabase"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"TargetDatabase"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"Location"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsTableSpace"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"TableSpaceType"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsDeault"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"BufferPool"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"ExtentSize"
-			value      	1)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"PrefetchSize"
-			value      	1)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"PageSize"
-			value      	4)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"ManagedBy"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"ContainerList"
-			value      	"")))
-	    (object Attribute
-		tool       	"Data Modeler"
-		name       	"default__Category"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"dmItem"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"DMName"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"dmSchema"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"dmDomainPackage"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsSchema"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsDomainPackage"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsRootSchema"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsRootDomainPackage"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsSchemaPackage"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"DatabaseID"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"DBMS"
-			value      	"")))
-	    (object Attribute
-		tool       	"Data Modeler"
-		name       	"default__Class"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"dmItem"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"DMName"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsTable"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsView"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsDomain"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsSPPackage"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"Synonymns"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"TableSpace"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"SourceId"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"SourceType"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"SelectClause"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsUpdatable"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"CheckOption"
-			value      	0)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"PersistToServer"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"TableSpaceID"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"CorrelationName"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsUpdateable"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsSnapShot"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsDistinct"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsPackage"
-			value      	FALSE)))
-	    (object Attribute
-		tool       	"Data Modeler"
-		name       	"default__Attribute"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"dmItem"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"DMName"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"Ordinal"
-			value      	0)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsIdentity"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsUnique"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"NullsAllowed"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"Length"
-			value      	0)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"Scale"
-			value      	0)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"ColumnType"
-			value      	"Native")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"ForBitData"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"DefaultValueType"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"DefaultValue"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"SourceId"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"SourceType"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"OID"
-			value      	FALSE)))
-	    (object Attribute
-		tool       	"Data Modeler"
-		name       	"default__Association"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"dmItem"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"DMName"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsRelationship"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"SourceId"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"SourceType"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"RIMethod"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"ParentUpdateRule"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"ParentUpdateRuleName"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"ParentDeleteRule"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"ParentDeleteRuleName"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"ChildInsertRestrict"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"ChildInsertRestrictName"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"ChildMultiplicity"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"ChildMultiplicityName"
-			value      	"")))
-	    (object Attribute
-		tool       	"Data Modeler"
-		name       	"default__Role"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"dmItem"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"DMName"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"ConstraintName"
-			value      	"")))
-	    (object Attribute
-		tool       	"Data Modeler"
-		name       	"default__Operation"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"dmItem"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"DMName"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsConstraint"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"ConstraintType"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsIndex"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsTrigger"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsStoredProcedure"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsCluster"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"TableSpace"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"FillFactor"
-			value      	0)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"KeyList"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"CheckPredicate"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsUnique"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"DeferalMode"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"InitialCheckTime"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"TriggerType"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsInsertEvent"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsUpdateEvent"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsDeleteEvent"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"RefOldTable"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"RefNewTable"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"RefOldRow"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"RefNewRow"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsRow"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"WhenClause"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"Language"
-			value      	"SQL")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"ProcType"
-			value      	"Procedure")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsDeterministic"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"ParameterStyle"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"ReturnedNull"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"ExternalName"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"Length"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"Scale"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"ForBitData"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"DefaultValue"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"DefaultValueType"
-			value      	"")))
-	    (object Attribute
-		tool       	"Data Modeler"
-		name       	"default__Parameter"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"dmItem"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"DMName"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsInParameter"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"IsOutParameter"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"Ordinal"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"Length"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"Scale"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"ForBitData"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"DefaultValueType"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"DefaultValue"
-			value      	"")
-		    (object Attribute
-			tool       	"Data Modeler"
-			name       	"OperationID"
-			value      	"")))
-	    (object Attribute
-		tool       	"Data Modeler"
-		name       	"HiddenTool"
-		value      	FALSE)
-	    (object Attribute
-		tool       	"Data Modeler Communicator"
-		name       	"HiddenTool"
-		value      	FALSE)
-	    (object Attribute
-		tool       	"framework"
-		name       	"HiddenTool"
-		value      	FALSE)
-	    (object Attribute
-		tool       	"Java"
-		name       	"propertyId"
-		value      	"809135966")
-	    (object Attribute
-		tool       	"Java"
-		name       	"default__Project"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Java"
-			name       	"RootDir"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"CreateMissingDirectories"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"StopOnError"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"UsePrefixes"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"AutoSync"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ShowCodegenDlg"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"JavadocDefaultAuthor"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"JavadocDefaultVersion"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"JavadocDefaultSince"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"JavadocNumAsterisks"
-			value      	0)
-		    (object Attribute
-			tool       	"Java"
-			name       	"MaxNumChars"
-			value      	80)
-		    (object Attribute
-			tool       	"Java"
-			name       	"Editor"
-			value      	("EditorType" 100))
-		    (object Attribute
-			tool       	"Java"
-			name       	"VM"
-			value      	("VMType" 200))
-		    (object Attribute
-			tool       	"Java"
-			name       	"ClassPath"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"EditorType"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Java"
-				name       	"BuiltIn"
-				value      	100)
-			    (object Attribute
-				tool       	"Java"
-				name       	"WindowsShell"
-				value      	101)))
-		    (object Attribute
-			tool       	"Java"
-			name       	"VMType"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Java"
-				name       	"Sun"
-				value      	200)
-			    (object Attribute
-				tool       	"Java"
-				name       	"Microsoft"
-				value      	201)
-			    (object Attribute
-				tool       	"Java"
-				name       	"IBM"
-				value      	202)))
-		    (object Attribute
-			tool       	"Java"
-			name       	"InstanceVariablePrefix"
-			value      	"m_")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ClassVariablePrefix"
-			value      	"s_")
-		    (object Attribute
-			tool       	"Java"
-			name       	"DefaultAttributeDataType"
-			value      	"int")
-		    (object Attribute
-			tool       	"Java"
-			name       	"DefaultOperationReturnType"
-			value      	"void")
-		    (object Attribute
-			tool       	"Java"
-			name       	"NoClassCustomDlg"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"GlobalImports"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Java"
-			name       	"OpenBraceClassStyle"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"OpenBraceMethodStyle"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"UseTabs"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"UseSpaces"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"SpacingItems"
-			value      	3)
-		    (object Attribute
-			tool       	"Java"
-			name       	"RoseDefaultCommentStyle"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"AsteriskCommentStyle"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"JavaCommentStyle"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"JavadocAuthor"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"JavadocSince"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"JavadocVersion"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"NotShowRoseIDDlg"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"GenerateRoseID"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"GenerateDefaultReturnLine"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"UserDefineTagName1"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"UserDefineTagApply1"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"UserDefineTagText1"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"UserDefineTagName2"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"UserDefineTagApply2"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"UserDefineTagText2"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"UserDefineTagName3"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"UserDefineTagApply3"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"UserDefineTagText3"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ReferenceClasspath"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"VAJavaWorkingFolder"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"BeanPrefix"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"BeanSuffix"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"RemotePrefix"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"RemoteSuffix"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"HomePrefix"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"HomeSuffix"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"PrimaryKeyPrefix"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"PrimaryKeySuffix"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBDTDLocation"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletDTDLocation"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"DefaultEJBVersion"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"DefaultServletVersion"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"GenerateDefaultJ2EEJavadoc"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"UserDefineJavaDocTags"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"LocalPrefix"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"LocalSuffix"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"LocalHomePrefix"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"LocalHomeSuffix"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"SourceControl"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"SCCSelected"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"SCCProjectSourceRoot"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"SCCProjectName"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"SCCComment"
-			value      	FALSE)))
-	    (object Attribute
-		tool       	"Java"
-		name       	"default__Class"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Java"
-			name       	"Final"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"Static"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"GenerateDefaultConstructor"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ConstructorIs"
-			value      	("Ctor_Set" 62))
-		    (object Attribute
-			tool       	"Java"
-			name       	"Ctor_Set"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Java"
-				name       	"public"
-				value      	62)
-			    (object Attribute
-				tool       	"Java"
-				name       	"protected"
-				value      	63)
-			    (object Attribute
-				tool       	"Java"
-				name       	"private"
-				value      	64)
-			    (object Attribute
-				tool       	"Java"
-				name       	"package"
-				value      	65)))
-		    (object Attribute
-			tool       	"Java"
-			name       	"GenerateFinalizer"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"GenerateStaticInitializer"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"GenerateInstanceInitializer"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"GenerateCode"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"DisableAutoSync"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ReadOnly"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletName"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletContextRef"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"IsSingleThread"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletInitParameter"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletInitParameterNames"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletIsSecure"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletRequestDispatcher"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletRequestDispatcherPath"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"DispatcherInclude"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"DispatcherForward"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletSecurityRoles"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletgetInfo"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletXMLFilePath"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletRequestAttribute"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletRequestAttributesNames"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"MethodForRequestAttributes"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletRequestParameter"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletRequestParameterNames"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"MethodForRequestParameters"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletHeader"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletHeaderNames"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"MethodForHeaders"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletIntHeader"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletDateHeader"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletCookie"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"MethodForCookie"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletContentType"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"GenerateHTML"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"Generate_XML_DD"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBCmpField"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBEnvironmentProperties"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBCnxFactory"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBReferences"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBSecurityRoles"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBNameInJAR"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBSessionType"
-			value      	("EJBSessionType_Set" 200))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBSessionType_Set"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Java"
-				name       	""
-				value      	200)
-			    (object Attribute
-				tool       	"Java"
-				name       	"Stateless"
-				value      	201)
-			    (object Attribute
-				tool       	"Java"
-				name       	"Stateful"
-				value      	202)))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBTransactionType"
-			value      	("EJBTransactionType_Set" 211))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBTransactionType_Set"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Java"
-				name       	"Container"
-				value      	211)
-			    (object Attribute
-				tool       	"Java"
-				name       	"Bean"
-				value      	212)))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBPersistenceType"
-			value      	("EJBPersistenceType_Set" 220))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBPersistenceType_Set"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Java"
-				name       	""
-				value      	220)
-			    (object Attribute
-				tool       	"Java"
-				name       	"Bean"
-				value      	221)
-			    (object Attribute
-				tool       	"Java"
-				name       	"Container"
-				value      	222)))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBReentrant"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBSessionSync"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBVersion"
-			value      	("EJBVersion_Set" 230))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBVersion_Set"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Java"
-				name       	"2.0"
-				value      	230)
-			    (object Attribute
-				tool       	"Java"
-				name       	"1.x"
-				value      	231)))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBXMLFilePath"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"BMP_Extend_CMP"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"Strictfp"
-			value      	FALSE)))
-	    (object Attribute
-		tool       	"Java"
-		name       	"Default_Servlet__Class"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletName"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletContextRef"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"IsSingleThread"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletInitParameter"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletInitParameterNames"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletIsSecure"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletRequestDispatcher"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletRequestDispatcherPath"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"DispatcherInclude"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"DispatcherForward"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletSecurityRoles"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletgetInfo"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"Final"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"Static"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"GenerateDefaultConstructor"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ConstructorIs"
-			value      	("Ctor_Set" 62))
-		    (object Attribute
-			tool       	"Java"
-			name       	"Ctor_Set"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Java"
-				name       	"public"
-				value      	62)
-			    (object Attribute
-				tool       	"Java"
-				name       	"protected"
-				value      	63)
-			    (object Attribute
-				tool       	"Java"
-				name       	"private"
-				value      	64)
-			    (object Attribute
-				tool       	"Java"
-				name       	"package"
-				value      	65)))
-		    (object Attribute
-			tool       	"Java"
-			name       	"GenerateFinalizer"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"GenerateStaticInitializer"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"GenerateInstanceInitializer"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"GenerateCode"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"DisableAutoSync"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ReadOnly"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletXMLFilePath"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletRequestAttribute"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletRequestAttributesNames"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"MethodForRequestAttributes"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletRequestParameter"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletRequestParameterNames"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"MethodForRequestParameters"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletHeader"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletHeaderNames"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"MethodForHeaders"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletIntHeader"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletDateHeader"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletCookie"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"MethodForCookie"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletContentType"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"GenerateHTML"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"Generate_XML_DD"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBCmpField"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBEnvironmentProperties"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBCnxFactory"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBReferences"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBSecurityRoles"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBNameInJAR"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBSessionType"
-			value      	("EJBSessionType_Set" 200))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBSessionType_Set"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Java"
-				name       	""
-				value      	200)
-			    (object Attribute
-				tool       	"Java"
-				name       	"Stateless"
-				value      	201)
-			    (object Attribute
-				tool       	"Java"
-				name       	"Stateful"
-				value      	202)))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBTransactionType"
-			value      	("EJBTransactionType_Set" 211))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBTransactionType_Set"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Java"
-				name       	"Container"
-				value      	211)
-			    (object Attribute
-				tool       	"Java"
-				name       	"Bean"
-				value      	212)))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBPersistenceType"
-			value      	("EJBPersistenceType_Set" 220))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBPersistenceType_Set"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Java"
-				name       	""
-				value      	220)
-			    (object Attribute
-				tool       	"Java"
-				name       	"Bean"
-				value      	221)
-			    (object Attribute
-				tool       	"Java"
-				name       	"Container"
-				value      	222)))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBReentrant"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBSessionSync"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBVersion"
-			value      	("EJBVersion_Set" 230))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBVersion_Set"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Java"
-				name       	"2.0"
-				value      	230)
-			    (object Attribute
-				tool       	"Java"
-				name       	"1.x"
-				value      	231)))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBXMLFilePath"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"BMP_Extend_CMP"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"Strictfp"
-			value      	FALSE)))
-	    (object Attribute
-		tool       	"Java"
-		name       	"Http_Servlet__Class"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletRequestAttribute"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletRequestAttributesNames"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"MethodForRequestAttributes"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletRequestParameter"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletRequestParameterNames"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"MethodForRequestParameters"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletHeader"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletHeaderNames"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"MethodForHeaders"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletIntHeader"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletDateHeader"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletCookie"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"MethodForCookie"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletContentType"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"GenerateHTML"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"Final"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"Static"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"GenerateDefaultConstructor"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ConstructorIs"
-			value      	("Ctor_Set" 62))
-		    (object Attribute
-			tool       	"Java"
-			name       	"Ctor_Set"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Java"
-				name       	"public"
-				value      	62)
-			    (object Attribute
-				tool       	"Java"
-				name       	"protected"
-				value      	63)
-			    (object Attribute
-				tool       	"Java"
-				name       	"private"
-				value      	64)
-			    (object Attribute
-				tool       	"Java"
-				name       	"package"
-				value      	65)))
-		    (object Attribute
-			tool       	"Java"
-			name       	"GenerateFinalizer"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"GenerateStaticInitializer"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"GenerateInstanceInitializer"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"GenerateCode"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"DisableAutoSync"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ReadOnly"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletName"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletContextRef"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"IsSingleThread"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletInitParameter"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletInitParameterNames"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletIsSecure"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletRequestDispatcher"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletRequestDispatcherPath"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"DispatcherInclude"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"DispatcherForward"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletSecurityRoles"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletgetInfo"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletXMLFilePath"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"Generate_XML_DD"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBCmpField"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBEnvironmentProperties"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBCnxFactory"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBReferences"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBSecurityRoles"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBNameInJAR"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBSessionType"
-			value      	("EJBSessionType_Set" 200))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBSessionType_Set"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Java"
-				name       	""
-				value      	200)
-			    (object Attribute
-				tool       	"Java"
-				name       	"Stateless"
-				value      	201)
-			    (object Attribute
-				tool       	"Java"
-				name       	"Stateful"
-				value      	202)))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBTransactionType"
-			value      	("EJBTransactionType_Set" 211))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBTransactionType_Set"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Java"
-				name       	"Container"
-				value      	211)
-			    (object Attribute
-				tool       	"Java"
-				name       	"Bean"
-				value      	212)))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBPersistenceType"
-			value      	("EJBPersistenceType_Set" 220))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBPersistenceType_Set"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Java"
-				name       	""
-				value      	220)
-			    (object Attribute
-				tool       	"Java"
-				name       	"Bean"
-				value      	221)
-			    (object Attribute
-				tool       	"Java"
-				name       	"Container"
-				value      	222)))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBReentrant"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBSessionSync"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBVersion"
-			value      	("EJBVersion_Set" 230))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBVersion_Set"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Java"
-				name       	"2.0"
-				value      	230)
-			    (object Attribute
-				tool       	"Java"
-				name       	"1.x"
-				value      	231)))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBXMLFilePath"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"BMP_Extend_CMP"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"Strictfp"
-			value      	FALSE)))
-	    (object Attribute
-		tool       	"Java"
-		name       	"Default_EJB__Class"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Java"
-			name       	"Generate_XML_DD"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBCmpField"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBEnvironmentProperties"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBCnxFactory"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBReferences"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBSecurityRoles"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBNameInJAR"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBSessionType"
-			value      	("EJBSessionType_Set" 200))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBSessionType_Set"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Java"
-				name       	""
-				value      	200)
-			    (object Attribute
-				tool       	"Java"
-				name       	"Stateless"
-				value      	201)
-			    (object Attribute
-				tool       	"Java"
-				name       	"Stateful"
-				value      	202)))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBTransactionType"
-			value      	("EJBTransactionType_Set" 211))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBTransactionType_Set"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Java"
-				name       	"Container"
-				value      	211)
-			    (object Attribute
-				tool       	"Java"
-				name       	"Bean"
-				value      	212)))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBPersistenceType"
-			value      	("EJBPersistenceType_Set" 220))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBPersistenceType_Set"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Java"
-				name       	""
-				value      	220)
-			    (object Attribute
-				tool       	"Java"
-				name       	"Bean"
-				value      	221)
-			    (object Attribute
-				tool       	"Java"
-				name       	"Container"
-				value      	222)))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBReentrant"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"BMP_Extend_CMP"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"Final"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"Static"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"GenerateDefaultConstructor"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ConstructorIs"
-			value      	("Ctor_Set" 62))
-		    (object Attribute
-			tool       	"Java"
-			name       	"Ctor_Set"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Java"
-				name       	"public"
-				value      	62)
-			    (object Attribute
-				tool       	"Java"
-				name       	"protected"
-				value      	63)
-			    (object Attribute
-				tool       	"Java"
-				name       	"private"
-				value      	64)
-			    (object Attribute
-				tool       	"Java"
-				name       	"package"
-				value      	65)))
-		    (object Attribute
-			tool       	"Java"
-			name       	"GenerateFinalizer"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"GenerateStaticInitializer"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"GenerateInstanceInitializer"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"GenerateCode"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"DisableAutoSync"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ReadOnly"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletName"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletContextRef"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"IsSingleThread"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletInitParameter"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletInitParameterNames"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletIsSecure"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletRequestDispatcher"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletRequestDispatcherPath"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"DispatcherInclude"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"DispatcherForward"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletSecurityRoles"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletgetInfo"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletXMLFilePath"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletRequestAttribute"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletRequestAttributesNames"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"MethodForRequestAttributes"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletRequestParameter"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletRequestParameterNames"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"MethodForRequestParameters"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletHeader"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletHeaderNames"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"MethodForHeaders"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletIntHeader"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletDateHeader"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletCookie"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"MethodForCookie"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"ServletContentType"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"GenerateHTML"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBSessionSync"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBVersion"
-			value      	("EJBVersion_Set" 230))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBVersion_Set"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Java"
-				name       	"2.0"
-				value      	230)
-			    (object Attribute
-				tool       	"Java"
-				name       	"1.x"
-				value      	231)))
-		    (object Attribute
-			tool       	"Java"
-			name       	"EJBXMLFilePath"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"Strictfp"
-			value      	FALSE)))
-	    (object Attribute
-		tool       	"Java"
-		name       	"default__Module-Spec"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Java"
-			name       	"CmIdentification"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Java"
-			name       	"CopyrightNotice"
-			value      	(value Text ""))))
-	    (object Attribute
-		tool       	"Java"
-		name       	"default__Module-Body"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Java"
-			name       	"CmIdentification"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Java"
-			name       	"CopyrightNotice"
-			value      	(value Text ""))))
-	    (object Attribute
-		tool       	"Java"
-		name       	"default__Operation"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Java"
-			name       	"Abstract"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"Static"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"Final"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"Native"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"Synchronized"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"GenerateFullyQualifiedReturn"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"ReplaceExistingCode"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"Strictfp"
-			value      	FALSE)))
-	    (object Attribute
-		tool       	"Java"
-		name       	"default__Attribute"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Java"
-			name       	"Final"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"Transient"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"Volatile"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"PropertyType"
-			value      	("BeanProperty_Set" 71))
-		    (object Attribute
-			tool       	"Java"
-			name       	"BeanProperty_Set"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Java"
-				name       	"Not A Property"
-				value      	71)
-			    (object Attribute
-				tool       	"Java"
-				name       	"Simple"
-				value      	72)
-			    (object Attribute
-				tool       	"Java"
-				name       	"Bound"
-				value      	73)
-			    (object Attribute
-				tool       	"Java"
-				name       	"Constrained"
-				value      	74)))
-		    (object Attribute
-			tool       	"Java"
-			name       	"IndividualChangeMgt"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"Read/Write"
-			value      	("Read/Write_Set" 81))
-		    (object Attribute
-			tool       	"Java"
-			name       	"Read/Write_Set"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Java"
-				name       	"Read & Write"
-				value      	81)
-			    (object Attribute
-				tool       	"Java"
-				name       	"Read Only"
-				value      	82)
-			    (object Attribute
-				tool       	"Java"
-				name       	"Write Only"
-				value      	83)))
-		    (object Attribute
-			tool       	"Java"
-			name       	"GenerateFullyQualifiedTypes"
-			value      	FALSE)))
-	    (object Attribute
-		tool       	"Java"
-		name       	"default__Role"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Java"
-			name       	"ContainerClass"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"InitialValue"
-			value      	"")
-		    (object Attribute
-			tool       	"Java"
-			name       	"Final"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"Transient"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"Volatile"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"PropertyType"
-			value      	("BeanProperty_Set" 71))
-		    (object Attribute
-			tool       	"Java"
-			name       	"BeanProperty_Set"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Java"
-				name       	"Not A Property"
-				value      	71)
-			    (object Attribute
-				tool       	"Java"
-				name       	"Simple"
-				value      	72)
-			    (object Attribute
-				tool       	"Java"
-				name       	"Bound"
-				value      	73)
-			    (object Attribute
-				tool       	"Java"
-				name       	"Constrained"
-				value      	74)))
-		    (object Attribute
-			tool       	"Java"
-			name       	"IndividualChangeMgt"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"Read/Write"
-			value      	("Read/Write_Set" 81))
-		    (object Attribute
-			tool       	"Java"
-			name       	"Read/Write_Set"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Java"
-				name       	"Read & Write"
-				value      	81)
-			    (object Attribute
-				tool       	"Java"
-				name       	"Read Only"
-				value      	82)
-			    (object Attribute
-				tool       	"Java"
-				name       	"Write Only"
-				value      	83)))
-		    (object Attribute
-			tool       	"Java"
-			name       	"GenerateFullyQualifiedTypes"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Java"
-			name       	"IsNavigable"
-			value      	TRUE)))
-	    (object Attribute
-		tool       	"Java"
-		name       	"HiddenTool"
-		value      	FALSE)
-	    (object Attribute
-		tool       	"Oracle8"
-		name       	"propertyId"
-		value      	"360000002")
-	    (object Attribute
-		tool       	"Oracle8"
-		name       	"default__Project"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"DDLScriptFilename"
-			value      	"DDL1.SQL")
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"DropClause"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"PrimaryKeyColumnName"
-			value      	"_ID")
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"PrimaryKeyColumnType"
-			value      	"NUMBER(5,0)")
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"SchemaNamePrefix"
-			value      	"")
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"SchemaNameSuffix"
-			value      	"")
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"TableNamePrefix"
-			value      	"")
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"TableNameSuffix"
-			value      	"")
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"TypeNamePrefix"
-			value      	"")
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"TypeNameSuffix"
-			value      	"")
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"ViewNamePrefix"
-			value      	"")
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"ViewNameSuffix"
-			value      	"")
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"VarrayNamePrefix"
-			value      	"")
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"VarrayNameSuffix"
-			value      	"")
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"NestedTableNamePrefix"
-			value      	"")
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"NestedTableNameSuffix"
-			value      	"")
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"ObjectTableNamePrefix"
-			value      	"")
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"ObjectTableNameSuffix"
-			value      	"")))
-	    (object Attribute
-		tool       	"Oracle8"
-		name       	"default__Module-Spec"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"IsSchema"
-			value      	FALSE)))
-	    (object Attribute
-		tool       	"Oracle8"
-		name       	"default__Class"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"OID"
-			value      	"")
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"WhereClause"
-			value      	"")
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"CheckConstraint"
-			value      	"")
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"CollectionTypeLength"
-			value      	"")
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"CollectionTypePrecision"
-			value      	"")
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"CollectionTypeScale"
-			value      	"")
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"CollectionOfREFS"
-			value      	FALSE)))
-	    (object Attribute
-		tool       	"Oracle8"
-		name       	"default__Operation"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"MethodKind"
-			value      	("MethodKindSet" 1903))
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"OverloadID"
-			value      	"")
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"OrderNumber"
-			value      	"")
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"IsReadNoDataState"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"IsReadNoProcessState"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"IsWriteNoDataState"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"IsWriteNoProcessState"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"IsSelfish"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"TriggerType"
-			value      	("TriggerTypeSet" 1801))
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"TriggerEvent"
-			value      	("TriggerEventSet" 1601))
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"TriggerText"
-			value      	"")
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"TriggerReferencingNames"
-			value      	"")
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"TriggerForEach"
-			value      	("TriggerForEachSet" 1701))
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"TriggerWhenClause"
-			value      	"")
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"MethodKindSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Oracle8"
-				name       	"MapMethod"
-				value      	1901)
-			    (object Attribute
-				tool       	"Oracle8"
-				name       	"OrderMethod"
-				value      	1902)
-			    (object Attribute
-				tool       	"Oracle8"
-				name       	"Function"
-				value      	1903)
-			    (object Attribute
-				tool       	"Oracle8"
-				name       	"Procedure"
-				value      	1904)
-			    (object Attribute
-				tool       	"Oracle8"
-				name       	"Operator"
-				value      	1905)
-			    (object Attribute
-				tool       	"Oracle8"
-				name       	"Constructor"
-				value      	1906)
-			    (object Attribute
-				tool       	"Oracle8"
-				name       	"Destructor"
-				value      	1907)
-			    (object Attribute
-				tool       	"Oracle8"
-				name       	"Trigger"
-				value      	1908)
-			    (object Attribute
-				tool       	"Oracle8"
-				name       	"Calculated"
-				value      	1909)))
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"TriggerTypeSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Oracle8"
-				name       	"AFTER"
-				value      	1801)
-			    (object Attribute
-				tool       	"Oracle8"
-				name       	"BEFORE"
-				value      	1802)
-			    (object Attribute
-				tool       	"Oracle8"
-				name       	"INSTEAD OF"
-				value      	1803)))
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"TriggerForEachSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Oracle8"
-				name       	"ROW"
-				value      	1701)
-			    (object Attribute
-				tool       	"Oracle8"
-				name       	"STATEMENT"
-				value      	1702)))
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"TriggerEventSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Oracle8"
-				name       	"INSERT"
-				value      	1601)
-			    (object Attribute
-				tool       	"Oracle8"
-				name       	"UPDATE"
-				value      	1602)
-			    (object Attribute
-				tool       	"Oracle8"
-				name       	"DELETE"
-				value      	1603)
-			    (object Attribute
-				tool       	"Oracle8"
-				name       	"INSERT OR UPDATE"
-				value      	1604)
-			    (object Attribute
-				tool       	"Oracle8"
-				name       	"INSERT OR DELETE"
-				value      	1605)
-			    (object Attribute
-				tool       	"Oracle8"
-				name       	"UPDATE OR DELETE"
-				value      	1606)
-			    (object Attribute
-				tool       	"Oracle8"
-				name       	"INSERT OR UPDATE OR DELETE"
-				value      	1607)))))
-	    (object Attribute
-		tool       	"Oracle8"
-		name       	"default__Role"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"OrderNumber"
-			value      	"")))
-	    (object Attribute
-		tool       	"Oracle8"
-		name       	"default__Attribute"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"OrderNumber"
-			value      	"")
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"IsUnique"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"NullsAllowed"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"Length"
-			value      	"")
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"Precision"
-			value      	"2")
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"Scale"
-			value      	"6")
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"IsIndex"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"IsPrimaryKey"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"CompositeUnique"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Oracle8"
-			name       	"CheckConstraint"
-			value      	"")))
-	    (object Attribute
-		tool       	"Oracle8"
-		name       	"HiddenTool"
-		value      	FALSE)
-	    (object Attribute
-		tool       	"R2Editor"
-		name       	"HiddenTool"
-		value      	FALSE)
-	    (object Attribute
-		tool       	"ComponentTest"
-		name       	"HiddenTool"
-		value      	FALSE)
-	    (object Attribute
-		tool       	"cg"
-		name       	"propertyId"
-		value      	"809135966")
-	    (object Attribute
-		tool       	"cg"
-		name       	"default__Project"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"cg"
-			name       	"AllowGenerateOverNewerAnnotations"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"AllowGenerateOverNewerVersion"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"UseMSVC"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"HeaderFileExtension"
-			value      	"h")
-		    (object Attribute
-			tool       	"cg"
-			name       	"HeaderFileBackupExtension"
-			value      	"h~")
-		    (object Attribute
-			tool       	"cg"
-			name       	"HeaderFileTemporaryExtension"
-			value      	"h#")
-		    (object Attribute
-			tool       	"cg"
-			name       	"CodeFileExtension"
-			value      	"cpp")
-		    (object Attribute
-			tool       	"cg"
-			name       	"CodeFileBackupExtension"
-			value      	"cp~")
-		    (object Attribute
-			tool       	"cg"
-			name       	"CodeFileTemporaryExtension"
-			value      	"cp#")
-		    (object Attribute
-			tool       	"cg"
-			name       	"CreateMissingDirectories"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"StopOnError"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"ErrorLimit"
-			value      	30)
-		    (object Attribute
-			tool       	"cg"
-			name       	"Directory"
-			value      	"$ROSECPP_SOURCE")
-		    (object Attribute
-			tool       	"cg"
-			name       	"PathSeparator"
-			value      	"")
-		    (object Attribute
-			tool       	"cg"
-			name       	"FileNameFormat"
-			value      	"128vx_b")
-		    (object Attribute
-			tool       	"cg"
-			name       	"BooleanType"
-			value      	"int")
-		    (object Attribute
-			tool       	"cg"
-			name       	"AllowTemplates"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"AllowExplicitInstantiations"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"AllowProtectedInheritance"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"CommentWidth"
-			value      	60)
-		    (object Attribute
-			tool       	"cg"
-			name       	"OneByValueContainer"
-			value      	"$targetClass")
-		    (object Attribute
-			tool       	"cg"
-			name       	"OneByReferenceContainer"
-			value      	"$targetClass *")
-		    (object Attribute
-			tool       	"cg"
-			name       	"OptionalByValueContainer"
-			value      	"OptionalByValue<$targetClass>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"OptionalByReferenceContainer"
-			value      	"$targetClass *")
-		    (object Attribute
-			tool       	"cg"
-			name       	"FixedByValueContainer"
-			value      	"$targetClass[$limit]")
-		    (object Attribute
-			tool       	"cg"
-			name       	"UnorderedFixedByValueContainer"
-			value      	"$targetClass[$limit]")
-		    (object Attribute
-			tool       	"cg"
-			name       	"FixedByReferenceContainer"
-			value      	"$targetClass *[$limit]")
-		    (object Attribute
-			tool       	"cg"
-			name       	"UnorderedFixedByReferenceContainer"
-			value      	"$targetClass *[$limit]")
-		    (object Attribute
-			tool       	"cg"
-			name       	"BoundedByValueContainer"
-			value      	"BoundedListByValue<$targetClass,$limit>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"UnorderedBoundedByValueContainer"
-			value      	"BoundedSetByValue<$targetClass,$limit>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"BoundedByReferenceContainer"
-			value      	"BoundedListByReference<$targetClass,$limit>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"UnorderedBoundedByReferenceContainer"
-			value      	"BoundedSetByReference<$targetClass,$limit>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"UnboundedByValueContainer"
-			value      	"UnboundedListByValue<$targetClass>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"UnorderedUnboundedByValueContainer"
-			value      	"UnboundedSetByValue<$targetClass>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"UnboundedByReferenceContainer"
-			value      	"UnboundedListByReference<$targetClass>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"UnorderedUnboundedByReferenceContainer"
-			value      	"UnboundedSetByReference<$targetClass>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"QualifiedByValueContainer"
-			value      	"AssociationByValue<$qualtype, $qualcont>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"UnorderedQualifiedByValueContainer"
-			value      	"DictionaryByValue<$qualtype, $qualcont>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"QualifiedByReferenceContainer"
-			value      	"AssociationByReference<$qualtype, $qualcont>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"UnorderedQualifiedByReferenceContainer"
-			value      	"DictionaryByReference<$qualtype, $qualcont>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"AlwaysKeepOrphanedCode"
-			value      	FALSE)))
-	    (object Attribute
-		tool       	"cg"
-		name       	"compiler2.1__Project"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"cg"
-			name       	"AllowGenerateOverNewerAnnotations"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"AllowGenerateOverNewerVersion"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"HeaderFileExtension"
-			value      	"h")
-		    (object Attribute
-			tool       	"cg"
-			name       	"HeaderFileBackupExtension"
-			value      	"h~")
-		    (object Attribute
-			tool       	"cg"
-			name       	"HeaderFileTemporaryExtension"
-			value      	"h#")
-		    (object Attribute
-			tool       	"cg"
-			name       	"CodeFileExtension"
-			value      	"cpp")
-		    (object Attribute
-			tool       	"cg"
-			name       	"CodeFileBackupExtension"
-			value      	"cp~")
-		    (object Attribute
-			tool       	"cg"
-			name       	"CodeFileTemporaryExtension"
-			value      	"cp#")
-		    (object Attribute
-			tool       	"cg"
-			name       	"CreateMissingDirectories"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"StopOnError"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"ErrorLimit"
-			value      	30)
-		    (object Attribute
-			tool       	"cg"
-			name       	"Directory"
-			value      	"$ROSECPP_SOURCE")
-		    (object Attribute
-			tool       	"cg"
-			name       	"BooleanType"
-			value      	"int")
-		    (object Attribute
-			tool       	"cg"
-			name       	"AllowTemplates"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"AllowExplicitInstantiations"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"AllowProtectedInheritance"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"OneByValueContainer"
-			value      	"$targetClass")
-		    (object Attribute
-			tool       	"cg"
-			name       	"OneByReferenceContainer"
-			value      	"$targetClass *")
-		    (object Attribute
-			tool       	"cg"
-			name       	"OptionalByValueContainer"
-			value      	"OptionalByValue<$targetClass>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"OptionalByReferenceContainer"
-			value      	"$targetClass *")
-		    (object Attribute
-			tool       	"cg"
-			name       	"FixedByValueContainer"
-			value      	"$targetClass[$limit]")
-		    (object Attribute
-			tool       	"cg"
-			name       	"UnorderedFixedByValueContainer"
-			value      	"$targetClass[$limit]")
-		    (object Attribute
-			tool       	"cg"
-			name       	"FixedByReferenceContainer"
-			value      	"$targetClass *[$limit]")
-		    (object Attribute
-			tool       	"cg"
-			name       	"UnorderedFixedByReferenceContainer"
-			value      	"$targetClass *[$limit]")
-		    (object Attribute
-			tool       	"cg"
-			name       	"BoundedByValueContainer"
-			value      	"BoundedListByValue<$targetClass,$limit>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"UnorderedBoundedByValueContainer"
-			value      	"BoundedSetByValue<$targetClass,$limit>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"BoundedByReferenceContainer"
-			value      	"BoundedListByReference<$targetClass,$limit>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"UnorderedBoundedByReferenceContainer"
-			value      	"BoundedSetByReference<$targetClass,$limit>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"UnboundedByValueContainer"
-			value      	"UnboundedListByValue<$targetClass>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"UnorderedUnboundedByValueContainer"
-			value      	"UnboundedSetByValue<$targetClass>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"UnboundedByReferenceContainer"
-			value      	"UnboundedListByReference<$targetClass>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"UnorderedUnboundedByReferenceContainer"
-			value      	"UnboundedSetByReference<$targetClass>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"QualifiedByValueContainer"
-			value      	"AssociationByValue<$qualtype, $qualcont>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"UnorderedQualifiedByValueContainer"
-			value      	"DictionaryByValue<$qualtype, $qualcont>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"QualifiedByReferenceContainer"
-			value      	"AssociationByReference<$qualtype, $qualcont>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"UnorderedQualifiedByReferenceContainer"
-			value      	"DictionaryByReference<$qualtype, $qualcont>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"PathSeparator"
-			value      	"")
-		    (object Attribute
-			tool       	"cg"
-			name       	"FileNameFormat"
-			value      	"128vx_b")
-		    (object Attribute
-			tool       	"cg"
-			name       	"AlwaysKeepOrphanedCode"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"UseMSVC"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"CommentWidth"
-			value      	60)))
-	    (object Attribute
-		tool       	"cg"
-		name       	"compiler3.0__Project"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"cg"
-			name       	"AllowGenerateOverNewerAnnotations"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"AllowGenerateOverNewerVersion"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"HeaderFileExtension"
-			value      	"h")
-		    (object Attribute
-			tool       	"cg"
-			name       	"HeaderFileBackupExtension"
-			value      	"h~")
-		    (object Attribute
-			tool       	"cg"
-			name       	"HeaderFileTemporaryExtension"
-			value      	"h#")
-		    (object Attribute
-			tool       	"cg"
-			name       	"CodeFileExtension"
-			value      	"cpp")
-		    (object Attribute
-			tool       	"cg"
-			name       	"CodeFileBackupExtension"
-			value      	"cp~")
-		    (object Attribute
-			tool       	"cg"
-			name       	"CodeFileTemporaryExtension"
-			value      	"cp#")
-		    (object Attribute
-			tool       	"cg"
-			name       	"CreateMissingDirectories"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"StopOnError"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"ErrorLimit"
-			value      	30)
-		    (object Attribute
-			tool       	"cg"
-			name       	"Directory"
-			value      	"$ROSECPP_SOURCE")
-		    (object Attribute
-			tool       	"cg"
-			name       	"BooleanType"
-			value      	"int")
-		    (object Attribute
-			tool       	"cg"
-			name       	"AllowTemplates"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"AllowExplicitInstantiations"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"AllowProtectedInheritance"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"OneByValueContainer"
-			value      	"$targetClass")
-		    (object Attribute
-			tool       	"cg"
-			name       	"OneByReferenceContainer"
-			value      	"$targetClass *")
-		    (object Attribute
-			tool       	"cg"
-			name       	"OptionalByValueContainer"
-			value      	"OptionalByValue<$targetClass>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"OptionalByReferenceContainer"
-			value      	"$targetClass *")
-		    (object Attribute
-			tool       	"cg"
-			name       	"FixedByValueContainer"
-			value      	"$targetClass[$limit]")
-		    (object Attribute
-			tool       	"cg"
-			name       	"UnorderedFixedByValueContainer"
-			value      	"$targetClass[$limit]")
-		    (object Attribute
-			tool       	"cg"
-			name       	"FixedByReferenceContainer"
-			value      	"$targetClass *[$limit]")
-		    (object Attribute
-			tool       	"cg"
-			name       	"UnorderedFixedByReferenceContainer"
-			value      	"$targetClass *[$limit]")
-		    (object Attribute
-			tool       	"cg"
-			name       	"BoundedByValueContainer"
-			value      	"BoundedListByValue<$targetClass,$limit>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"UnorderedBoundedByValueContainer"
-			value      	"BoundedSetByValue<$targetClass,$limit>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"BoundedByReferenceContainer"
-			value      	"BoundedListByReference<$targetClass,$limit>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"UnorderedBoundedByReferenceContainer"
-			value      	"BoundedSetByReference<$targetClass,$limit>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"UnboundedByValueContainer"
-			value      	"UnboundedListByValue<$targetClass>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"UnorderedUnboundedByValueContainer"
-			value      	"UnboundedSetByValue<$targetClass>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"UnboundedByReferenceContainer"
-			value      	"UnboundedListByReference<$targetClass>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"UnorderedUnboundedByReferenceContainer"
-			value      	"UnboundedSetByReference<$targetClass>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"QualifiedByValueContainer"
-			value      	"AssociationByValue<$qualtype, $qualcont>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"UnorderedQualifiedByValueContainer"
-			value      	"DictionaryByValue<$qualtype, $qualcont>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"QualifiedByReferenceContainer"
-			value      	"AssociationByReference<$qualtype, $qualcont>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"UnorderedQualifiedByReferenceContainer"
-			value      	"DictionaryByReference<$qualtype, $qualcont>")
-		    (object Attribute
-			tool       	"cg"
-			name       	"PathSeparator"
-			value      	"")
-		    (object Attribute
-			tool       	"cg"
-			name       	"FileNameFormat"
-			value      	"128vx_b")
-		    (object Attribute
-			tool       	"cg"
-			name       	"AlwaysKeepOrphanedCode"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"UseMSVC"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"CommentWidth"
-			value      	60)))
-	    (object Attribute
-		tool       	"cg"
-		name       	"default__Class"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"cg"
-			name       	"CodeName"
-			value      	"")
-		    (object Attribute
-			tool       	"cg"
-			name       	"ImplementationType"
-			value      	"")
-		    (object Attribute
-			tool       	"cg"
-			name       	"ClassKey"
-			value      	"class")
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateEmptyRegions"
-			value      	("GenerateEmptyRegionSet" 3))
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateEmptyRegionSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"cg"
-				name       	"None"
-				value      	0)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Preserved"
-				value      	1)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Unpreserved"
-				value      	2)
-			    (object Attribute
-				tool       	"cg"
-				name       	"All"
-				value      	3)))
-		    (object Attribute
-			tool       	"cg"
-			name       	"PutBodiesInSpec"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateDefaultConstructor"
-			value      	("GenerateSet" 199))
-		    (object Attribute
-			tool       	"cg"
-			name       	"DefaultConstructorVisibility"
-			value      	("VisibilitySet" 45))
-		    (object Attribute
-			tool       	"cg"
-			name       	"InlineDefaultConstructor"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"ExplicitDefaultConstructor"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateCopyConstructor"
-			value      	("GenerateSet" 199))
-		    (object Attribute
-			tool       	"cg"
-			name       	"CopyConstructorVisibility"
-			value      	("VisibilitySet" 45))
-		    (object Attribute
-			tool       	"cg"
-			name       	"InlineCopyConstructor"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"ExplicitCopyConstructor"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateDestructor"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"DestructorVisibility"
-			value      	("VisibilitySet" 45))
-		    (object Attribute
-			tool       	"cg"
-			name       	"DestructorKind"
-			value      	("ThreeKindSet" 200))
-		    (object Attribute
-			tool       	"cg"
-			name       	"InlineDestructor"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateAssignmentOperation"
-			value      	("GenerateSet" 199))
-		    (object Attribute
-			tool       	"cg"
-			name       	"AssignmentVisibility"
-			value      	("VisibilitySet" 45))
-		    (object Attribute
-			tool       	"cg"
-			name       	"AssignmentKind"
-			value      	("ThreeKindSet" 200))
-		    (object Attribute
-			tool       	"cg"
-			name       	"InlineAssignmentOperation"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateEqualityOperations"
-			value      	("GenerateSet" 199))
-		    (object Attribute
-			tool       	"cg"
-			name       	"EqualityVisibility"
-			value      	("VisibilitySet" 45))
-		    (object Attribute
-			tool       	"cg"
-			name       	"EqualityKind"
-			value      	("FriendKindSet" 200))
-		    (object Attribute
-			tool       	"cg"
-			name       	"InlineEqualityOperations"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateRelationalOperations"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"RelationalVisibility"
-			value      	("VisibilitySet" 45))
-		    (object Attribute
-			tool       	"cg"
-			name       	"RelationalKind"
-			value      	("FriendKindSet" 200))
-		    (object Attribute
-			tool       	"cg"
-			name       	"InlineRelationalOperations"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateStorageMgmtOperations"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"StorageMgmtVisibility"
-			value      	("VisibilitySet" 45))
-		    (object Attribute
-			tool       	"cg"
-			name       	"InlineStorageMgmtOperations"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateSubscriptOperation"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"SubscriptVisibility"
-			value      	("VisibilitySet" 45))
-		    (object Attribute
-			tool       	"cg"
-			name       	"SubscriptKind"
-			value      	("ThreeKindSet" 200))
-		    (object Attribute
-			tool       	"cg"
-			name       	"SubscriptResultType"
-			value      	"")
-		    (object Attribute
-			tool       	"cg"
-			name       	"InlineSubscriptOperation"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateDereferenceOperation"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"DereferenceVisibility"
-			value      	("VisibilitySet" 45))
-		    (object Attribute
-			tool       	"cg"
-			name       	"DereferenceKind"
-			value      	("ThreeKindSet" 200))
-		    (object Attribute
-			tool       	"cg"
-			name       	"DereferenceResultType"
-			value      	"")
-		    (object Attribute
-			tool       	"cg"
-			name       	"InlineDereferenceOperation"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateIndirectionOperation"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"IndirectionVisibility"
-			value      	("VisibilitySet" 45))
-		    (object Attribute
-			tool       	"cg"
-			name       	"IndirectionKind"
-			value      	("ThreeKindSet" 200))
-		    (object Attribute
-			tool       	"cg"
-			name       	"IndirectionResultType"
-			value      	"")
-		    (object Attribute
-			tool       	"cg"
-			name       	"InlineIndirectionOperation"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateStreamOperations"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"StreamVisibility"
-			value      	("VisibilitySet" 45))
-		    (object Attribute
-			tool       	"cg"
-			name       	"InlineStreamOperations"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"ThreeKindSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"cg"
-				name       	"Common"
-				value      	200)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Virtual"
-				value      	201)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Abstract"
-				value      	202)))
-		    (object Attribute
-			tool       	"cg"
-			name       	"KindSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"cg"
-				name       	"Common"
-				value      	200)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Virtual"
-				value      	201)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Abstract"
-				value      	202)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Static"
-				value      	203)))
-		    (object Attribute
-			tool       	"cg"
-			name       	"FriendKindSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"cg"
-				name       	"Common"
-				value      	200)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Virtual"
-				value      	201)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Abstract"
-				value      	202)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Friend"
-				value      	204)))
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"cg"
-				name       	"DeclareAndDefine"
-				value      	199)
-			    (object Attribute
-				tool       	"cg"
-				name       	"DeclareOnly"
-				value      	205)
-			    (object Attribute
-				tool       	"cg"
-				name       	"DoNotDeclare"
-				value      	206)))
-		    (object Attribute
-			tool       	"cg"
-			name       	"VisibilitySet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"cg"
-				name       	"Public"
-				value      	45)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Protected"
-				value      	44)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Private"
-				value      	43)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Implementation"
-				value      	14)))))
-	    (object Attribute
-		tool       	"cg"
-		name       	"default__Module-Spec"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"cg"
-			name       	"Generate"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateEmptyRegions"
-			value      	("GenerateEmptyRegionSet" 3))
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateEmptyRegionSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"cg"
-				name       	"None"
-				value      	0)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Preserved"
-				value      	1)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Unpreserved"
-				value      	2)
-			    (object Attribute
-				tool       	"cg"
-				name       	"All"
-				value      	3)))
-		    (object Attribute
-			tool       	"cg"
-			name       	"CmIdentification"
-			value      	(value Text "  %X% %Q% %Z% %W%"))
-		    (object Attribute
-			tool       	"cg"
-			name       	"CopyrightNotice"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"cg"
-			name       	"FileName"
-			value      	"AUTO GENERATE")
-		    (object Attribute
-			tool       	"cg"
-			name       	"AllowExtensionlessFileName"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"InclusionProtectionSymbol"
-			value      	"AUTO GENERATE")
-		    (object Attribute
-			tool       	"cg"
-			name       	"IncludeFormat"
-			value      	(value Text 
-|// $package
-|#include "$file"
-|
-			))
-		    (object Attribute
-			tool       	"cg"
-			name       	"IncludeBySimpleName"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"IncludePrecompiledHeader"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"IncludeOrder"
-			value      	"AMIR")
-		    (object Attribute
-			tool       	"cg"
-			name       	"AdditionalIncludes"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"cg"
-			name       	"InliningStyle"
-			value      	("InliningStyleSet" 207))
-		    (object Attribute
-			tool       	"cg"
-			name       	"InliningStyleSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"cg"
-				name       	"InClassDeclaration"
-				value      	208)
-			    (object Attribute
-				tool       	"cg"
-				name       	"FollowingClassDeclaration"
-				value      	207)))
-		    (object Attribute
-			tool       	"cg"
-			name       	"TypesDefined"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"cg"
-			name       	"IncludeClosure"
-			value      	(value Text ""))))
-	    (object Attribute
-		tool       	"cg"
-		name       	"default__Module-Body"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"cg"
-			name       	"Generate"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateEmptyRegions"
-			value      	("GenerateEmptyRegionSet" 3))
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateEmptyRegionSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"cg"
-				name       	"None"
-				value      	0)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Preserved"
-				value      	1)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Unpreserved"
-				value      	2)
-			    (object Attribute
-				tool       	"cg"
-				name       	"All"
-				value      	3)))
-		    (object Attribute
-			tool       	"cg"
-			name       	"CmIdentification"
-			value      	(value Text "  %X% %Q% %Z% %W%"))
-		    (object Attribute
-			tool       	"cg"
-			name       	"CopyrightNotice"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"cg"
-			name       	"FileName"
-			value      	"AUTO GENERATE")
-		    (object Attribute
-			tool       	"cg"
-			name       	"AllowExtensionlessFileName"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"IncludeFormat"
-			value      	(value Text 
-|// $package
-|#include "$file"
-|
-			))
-		    (object Attribute
-			tool       	"cg"
-			name       	"IncludeBySimpleName"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"IncludePrecompiledHeader"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"IncludeOrder"
-			value      	"AMIR")
-		    (object Attribute
-			tool       	"cg"
-			name       	"AdditionalIncludes"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"cg"
-			name       	"InliningStyle"
-			value      	("InliningStyleSet" 207))
-		    (object Attribute
-			tool       	"cg"
-			name       	"InliningStyleSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"cg"
-				name       	"InClassDeclaration"
-				value      	208)
-			    (object Attribute
-				tool       	"cg"
-				name       	"FollowingClassDeclaration"
-				value      	207)))
-		    (object Attribute
-			tool       	"cg"
-			name       	"TypesDefined"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"cg"
-			name       	"IncludeClosure"
-			value      	(value Text ""))))
-	    (object Attribute
-		tool       	"cg"
-		name       	"default__Operation"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"cg"
-			name       	"CodeName"
-			value      	"")
-		    (object Attribute
-			tool       	"cg"
-			name       	"OperationKind"
-			value      	("OperationKindSet" 200))
-		    (object Attribute
-			tool       	"cg"
-			name       	"OperationKindSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"cg"
-				name       	"Common"
-				value      	200)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Virtual"
-				value      	201)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Abstract"
-				value      	202)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Static"
-				value      	203)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Friend"
-				value      	204)))
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateAbstractBody"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"SpecialDeclReturnType"
-			value      	"")
-		    (object Attribute
-			tool       	"cg"
-			name       	"OperationIsConst"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"OperationIsExplicit"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"Inline"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"EntryCode"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"cg"
-			name       	"ExitCode"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"cg"
-			name       	"CCRegion"
-			value      	"")
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateEmptyRegions"
-			value      	("GenerateEmptyRegionSet" 3))
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateEmptyRegionSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"cg"
-				name       	"None"
-				value      	0)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Preserved"
-				value      	1)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Unpreserved"
-				value      	2)
-			    (object Attribute
-				tool       	"cg"
-				name       	"All"
-				value      	3)))
-		    (object Attribute
-			tool       	"cg"
-			name       	"BodyAnnotations"
-			value      	"")
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateFriendBody"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateFriendDecl"
-			value      	FALSE)))
-	    (object Attribute
-		tool       	"cg"
-		name       	"default__Has"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"cg"
-			name       	"CodeName"
-			value      	"")
-		    (object Attribute
-			tool       	"cg"
-			name       	"Ordered"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"NameIfUnlabeled"
-			value      	"the_$supplier")
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateDataMember"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"DataMemberName"
-			value      	"$relationship")
-		    (object Attribute
-			tool       	"cg"
-			name       	"DataMemberVisibility"
-			value      	("DataMemberVisibilitySet" 14))
-		    (object Attribute
-			tool       	"cg"
-			name       	"DataMemberVisibilitySet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"cg"
-				name       	"Public"
-				value      	45)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Protected"
-				value      	44)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Private"
-				value      	43)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Implementation"
-				value      	14)
-			    (object Attribute
-				tool       	"cg"
-				name       	"AtRelationshipVisibility"
-				value      	210)))
-		    (object Attribute
-			tool       	"cg"
-			name       	"DataMemberMutability"
-			value      	("DataMemberMutabilitySet" 0))
-		    (object Attribute
-			tool       	"cg"
-			name       	"DataMemberMutabilitySet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"cg"
-				name       	"Unrestricted"
-				value      	0)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Mutable"
-				value      	1)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Const"
-				value      	2)))
-		    (object Attribute
-			tool       	"cg"
-			name       	"DataMemberIsVolatile"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"DataMemberFieldSize"
-			value      	"")
-		    (object Attribute
-			tool       	"cg"
-			name       	"InitialValue"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateGetOperation"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateSetOperation"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"GetName"
-			value      	"get_$relationship")
-		    (object Attribute
-			tool       	"cg"
-			name       	"SetName"
-			value      	"set_$relationship")
-		    (object Attribute
-			tool       	"cg"
-			name       	"GetSetKinds"
-			value      	("GetSetKindsSet" 200))
-		    (object Attribute
-			tool       	"cg"
-			name       	"GetSetKindsSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"cg"
-				name       	"Common"
-				value      	200)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Virtual"
-				value      	201)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Abstract"
-				value      	202)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Static"
-				value      	203)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Friend"
-				value      	204)))
-		    (object Attribute
-			tool       	"cg"
-			name       	"ContainerClass"
-			value      	"")
-		    (object Attribute
-			tool       	"cg"
-			name       	"SelectorName"
-			value      	"")
-		    (object Attribute
-			tool       	"cg"
-			name       	"SelectorType"
-			value      	"")
-		    (object Attribute
-			tool       	"cg"
-			name       	"GetIsConst"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"GetResultIsConst"
-			value      	("GetResultIsConstSet" 2))
-		    (object Attribute
-			tool       	"cg"
-			name       	"GetResultIsConstSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"cg"
-				name       	"False"
-				value      	0)
-			    (object Attribute
-				tool       	"cg"
-				name       	"True"
-				value      	1)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Same_As_Function"
-				value      	2)))
-		    (object Attribute
-			tool       	"cg"
-			name       	"GetSetByReference"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"InlineGet"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"SetReturnsValue"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"InlineSet"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"ForwardReferenceOnly"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"HasRelTypeSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"cg"
-				name       	"Array"
-				value      	24)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Sequence"
-				value      	47)))))
-	    (object Attribute
-		tool       	"cg"
-		name       	"default__Association"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"cg"
-			name       	"NameIfUnlabeled"
-			value      	"the_$targetClass")))
-	    (object Attribute
-		tool       	"cg"
-		name       	"default__Inherit"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"cg"
-			name       	"InstanceArguments"
-			value      	"")))
-	    (object Attribute
-		tool       	"cg"
-		name       	"default__Role"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"cg"
-			name       	"CodeName"
-			value      	"")
-		    (object Attribute
-			tool       	"cg"
-			name       	"ForwardReferenceOnly"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"NameIfUnlabeled"
-			value      	"the_$targetClass")
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateDataMember"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"DataMemberName"
-			value      	"$target")
-		    (object Attribute
-			tool       	"cg"
-			name       	"DataMemberVisibility"
-			value      	("DataMemberVisibilitySet" 14))
-		    (object Attribute
-			tool       	"cg"
-			name       	"DataMemberVisibilitySet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"cg"
-				name       	"Public"
-				value      	45)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Protected"
-				value      	44)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Private"
-				value      	43)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Implementation"
-				value      	14)
-			    (object Attribute
-				tool       	"cg"
-				name       	"AtRelationshipVisibility"
-				value      	210)))
-		    (object Attribute
-			tool       	"cg"
-			name       	"DataMemberMutability"
-			value      	("DataMemberMutabilitySet" 0))
-		    (object Attribute
-			tool       	"cg"
-			name       	"DataMemberMutabilitySet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"cg"
-				name       	"Unrestricted"
-				value      	0)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Mutable"
-				value      	1)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Const"
-				value      	2)))
-		    (object Attribute
-			tool       	"cg"
-			name       	"DataMemberIsVolatile"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"DataMemberFieldSize"
-			value      	"")
-		    (object Attribute
-			tool       	"cg"
-			name       	"InitialValue"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"cg"
-			name       	"ContainerClass"
-			value      	"")
-		    (object Attribute
-			tool       	"cg"
-			name       	"ContainerGet"
-			value      	"$data.get($keys)")
-		    (object Attribute
-			tool       	"cg"
-			name       	"ContainerSet"
-			value      	"$data.set($keys,$value)")
-		    (object Attribute
-			tool       	"cg"
-			name       	"QualifiedContainer"
-			value      	"")
-		    (object Attribute
-			tool       	"cg"
-			name       	"AssocClassContainer"
-			value      	"$supplier *")
-		    (object Attribute
-			tool       	"cg"
-			name       	"AssocClassInitialValue"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"cg"
-			name       	"GetSetKinds"
-			value      	("GetSetKindsSet" 200))
-		    (object Attribute
-			tool       	"cg"
-			name       	"GetSetKindsSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"cg"
-				name       	"Common"
-				value      	200)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Virtual"
-				value      	201)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Abstract"
-				value      	202)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Static"
-				value      	203)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Friend"
-				value      	204)))
-		    (object Attribute
-			tool       	"cg"
-			name       	"GetSetByReference"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateGetOperation"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"GetName"
-			value      	"get_$target")
-		    (object Attribute
-			tool       	"cg"
-			name       	"GetIsConst"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"GetResultIsConst"
-			value      	("GetResultIsConstSet" 2))
-		    (object Attribute
-			tool       	"cg"
-			name       	"GetResultIsConstSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"cg"
-				name       	"False"
-				value      	0)
-			    (object Attribute
-				tool       	"cg"
-				name       	"True"
-				value      	1)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Same_As_Function"
-				value      	2)))
-		    (object Attribute
-			tool       	"cg"
-			name       	"InlineGet"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateSetOperation"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"SetName"
-			value      	"set_$target")
-		    (object Attribute
-			tool       	"cg"
-			name       	"SetReturnsValue"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"InlineSet"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"QualifiedGetSetByReference"
-			value      	("QualifiedGetSetByReferenceSet" 2))
-		    (object Attribute
-			tool       	"cg"
-			name       	"QualifiedGetSetByReferenceSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"cg"
-				name       	"False"
-				value      	0)
-			    (object Attribute
-				tool       	"cg"
-				name       	"True"
-				value      	1)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Same_As_GetSetByReference"
-				value      	2)))
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateQualifiedGetOperation"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"QualifiedGetName"
-			value      	"get_$target")
-		    (object Attribute
-			tool       	"cg"
-			name       	"QualifiedGetIsConst"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"QualifiedGetResultIsConst"
-			value      	("GetResultIsConstSet" 2))
-		    (object Attribute
-			tool       	"cg"
-			name       	"InlineQualifiedGet"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateQualifiedSetOperation"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"QualifiedSetName"
-			value      	"set_$target")
-		    (object Attribute
-			tool       	"cg"
-			name       	"QualifiedSetReturnsValue"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"InlineQualifiedSet"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateAssocClassDataMember"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"AssocClassDataMemberName"
-			value      	"$target")
-		    (object Attribute
-			tool       	"cg"
-			name       	"AssocClassDataMemberVisibility"
-			value      	("DataMemberVisibilitySet" 14))
-		    (object Attribute
-			tool       	"cg"
-			name       	"DataMemberVisibilitySet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"cg"
-				name       	"Public"
-				value      	45)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Protected"
-				value      	44)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Private"
-				value      	43)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Implementation"
-				value      	14)
-			    (object Attribute
-				tool       	"cg"
-				name       	"AtRelationshipVisibility"
-				value      	210)))
-		    (object Attribute
-			tool       	"cg"
-			name       	"AssocClassDataMemberMutability"
-			value      	("DataMemberMutabilitySet" 0))
-		    (object Attribute
-			tool       	"cg"
-			name       	"DataMemberMutabilitySet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"cg"
-				name       	"Unrestricted"
-				value      	0)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Mutable"
-				value      	1)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Const"
-				value      	2)))
-		    (object Attribute
-			tool       	"cg"
-			name       	"AssocClassDataMemberIsVolatile"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"AssocClassGetSetKinds"
-			value      	("GetSetKindsSet" 200))
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateAssocClassGetOperation"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"AssocClassGetName"
-			value      	"get_$target")
-		    (object Attribute
-			tool       	"cg"
-			name       	"AssocClassGetIsConst"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"AssocClassGetResultIsConst"
-			value      	("GetResultIsConstSet" 2))
-		    (object Attribute
-			tool       	"cg"
-			name       	"InlineAssocClassGet"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateAssocClassSetOperation"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"AssocClassSetName"
-			value      	"set_$target")
-		    (object Attribute
-			tool       	"cg"
-			name       	"AssocClassSetReturnsValue"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"InlineAssocClassSet"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"AssocClassForwardReferenceOnly"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"AssocTypeSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"cg"
-				name       	"Array"
-				value      	24)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Sequence"
-				value      	47)))))
-	    (object Attribute
-		tool       	"cg"
-		name       	"default__Attribute"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"cg"
-			name       	"CodeName"
-			value      	"")
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateDataMember"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"DataMemberName"
-			value      	"$attribute")
-		    (object Attribute
-			tool       	"cg"
-			name       	"DataMemberVisibility"
-			value      	("DataMemberVisibilitySet" 14))
-		    (object Attribute
-			tool       	"cg"
-			name       	"DataMemberVisibilitySet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"cg"
-				name       	"Public"
-				value      	45)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Protected"
-				value      	44)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Private"
-				value      	43)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Implementation"
-				value      	14)
-			    (object Attribute
-				tool       	"cg"
-				name       	"AtAttributeVisibility"
-				value      	211)))
-		    (object Attribute
-			tool       	"cg"
-			name       	"DataMemberMutability"
-			value      	("DataMemberMutabilitySet" 0))
-		    (object Attribute
-			tool       	"cg"
-			name       	"DataMemberMutabilitySet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"cg"
-				name       	"Unrestricted"
-				value      	0)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Mutable"
-				value      	1)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Const"
-				value      	2)))
-		    (object Attribute
-			tool       	"cg"
-			name       	"DataMemberIsVolatile"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"DataMemberFieldSize"
-			value      	"")
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateGetOperation"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateSetOperation"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"GetName"
-			value      	"get_$attribute")
-		    (object Attribute
-			tool       	"cg"
-			name       	"SetName"
-			value      	"set_$attribute")
-		    (object Attribute
-			tool       	"cg"
-			name       	"GetSetKinds"
-			value      	("GetSetKindsSet" 200))
-		    (object Attribute
-			tool       	"cg"
-			name       	"GetSetKindsSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"cg"
-				name       	"Common"
-				value      	200)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Virtual"
-				value      	201)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Abstract"
-				value      	202)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Static"
-				value      	203)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Friend"
-				value      	204)))
-		    (object Attribute
-			tool       	"cg"
-			name       	"GetIsConst"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"GetResultIsConst"
-			value      	("GetResultIsConstSet" 2))
-		    (object Attribute
-			tool       	"cg"
-			name       	"GetResultIsConstSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"cg"
-				name       	"False"
-				value      	0)
-			    (object Attribute
-				tool       	"cg"
-				name       	"True"
-				value      	1)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Same_As_Function"
-				value      	2)))
-		    (object Attribute
-			tool       	"cg"
-			name       	"GetSetByReference"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"InlineGet"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"SetReturnsValue"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"InlineSet"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"CCRegion"
-			value      	"")))
-	    (object Attribute
-		tool       	"cg"
-		name       	"default__Uses"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"cg"
-			name       	"ForwardReferenceOnly"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"BodyReferenceOnly"
-			value      	FALSE)))
-	    (object Attribute
-		tool       	"cg"
-		name       	"default__Subsystem"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"cg"
-			name       	"Directory"
-			value      	"AUTO GENERATE")
-		    (object Attribute
-			tool       	"cg"
-			name       	"DirectoryIsOnSearchList"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"PrecompiledHeader"
-			value      	"")))
-	    (object Attribute
-		tool       	"cg"
-		name       	"default__Category"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"cg"
-			name       	"IsNamespace"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"cg"
-			name       	"Indent"
-			value      	2)
-		    (object Attribute
-			tool       	"cg"
-			name       	"CodeName"
-			value      	"")
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateEmptyRegions"
-			value      	("GenerateEmptyRegionSet" 3))
-		    (object Attribute
-			tool       	"cg"
-			name       	"GenerateEmptyRegionSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"cg"
-				name       	"None"
-				value      	0)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Preserved"
-				value      	1)
-			    (object Attribute
-				tool       	"cg"
-				name       	"Unpreserved"
-				value      	2)
-			    (object Attribute
-				tool       	"cg"
-				name       	"All"
-				value      	3)))))
-	    (object Attribute
-		tool       	"MSVC"
-		name       	"propertyId"
-		value      	"809135966")
-	    (object Attribute
-		tool       	"MSVC"
-		name       	"default__Project"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"Version"
-			value      	"5.0")))
-	    (object Attribute
-		tool       	"MSVC"
-		name       	"default__Class"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"Type"
-			value      	("MSVCClassTypeSet" 0))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"MSVCClassTypeSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Normal"
-				value      	0)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Interface_Part"
-				value      	1)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Connection_Part"
-				value      	2)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Class_Factory"
-				value      	3)))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"CObjectFunctionality"
-			value      	("CObjectFunctionalitySet" 0))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"CObjectFunctionalitySet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"None"
-				value      	0)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Dynamic"
-				value      	1)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Dyncreate"
-				value      	2)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Serial"
-				value      	3)))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"GenerateOverrideGroup"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"GenerateDataGroup"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"AFX_DATA_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"GenerateFieldGroup"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"AFX_FIELD_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"GenerateMessageGroup"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"GenerateMessageMap"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"AFX_MSG_MAP_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"MESSAGE_MAP_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"OLEFactory"
-			value      	("OLEFactorySet" 0))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"OLEFactorySet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"None"
-				value      	0)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Built_in"
-				value      	1)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Simple"
-				value      	2)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Licensed"
-				value      	3)))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"OLEName"
-			value      	"")
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"OLEClassID"
-			value      	"")
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"GenerateOLECtlType"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"OLECtlType"
-			value      	"")
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"GenerateOLETypeLib"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"OLETypeLibID"
-			value      	"")
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"OLETypeLibMajor"
-			value      	"")
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"OLETypeLibMinor"
-			value      	"")
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"GeneratePropPageIDs"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"OLEPropPageIDs"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"GenerateDispatchMap"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"AFX_DISPATCH_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"AFX_DISPATCH_MAP_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"DISPATCH_MAP_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"StockProperties"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"StockFunctions"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"DispatchDefValue"
-			value      	"")
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"GenerateDispIdEnum"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"AFX_DISP_ID_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"GenerateInterfaceMap"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"INTERFACE_MAP_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"InitInterface"
-			value      	"")
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"GenerateEventMap"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"AFX_EVENT_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"AFX_EVENT_MAP_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"EVENT_MAP_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"StockEvents"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"GenerateEventSinkMap"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"AFX_EVENTSINK_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"AFX_EVENTSINK_MAP_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"EVENTSINK_MAP_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"PropNotifySinks"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"GenerateConnectionMap"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"CONNECTION_MAP_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"ConnectionPointIID"
-			value      	"")
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"InheritanceType"
-			value      	"")
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"DeclSpec"
-			value      	"")
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"OLECommands"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"MFCDeclares"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"MFCImplements"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"ATL_Declares"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"GenerateCOMMap"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"COM_MAP_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"GenerateConnectionPointMap"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"CONNECTION_POINT_MAP_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"GenerateMsgMap"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"MSG_MAP_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"GeneratePropertyMap"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"PROPERTY_MAP_Entries"
-			value      	(value Text ""))))
-	    (object Attribute
-		tool       	"MSVC"
-		name       	"default__Operation"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"Type"
-			value      	("MSVCOperationTypeSet" 0))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"MSVCOperationTypeSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Normal"
-				value      	0)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Virtual_Override"
-				value      	1)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Message_Handler"
-				value      	2)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Dispatch_Handler"
-				value      	3)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Event_Firing_Function"
-				value      	4)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Event_Sink_Handler"
-				value      	5)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Std_OLE_Method"
-				value      	6)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Command_Parser"
-				value      	7)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Property_Get_Function"
-				value      	8)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Property_Set_Function"
-				value      	9)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Property_Notify_Function"
-				value      	10)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Macro_Generated_Function"
-				value      	11)))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"AFX_MSG_MAP_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"MESSAGE_MAP_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"AFX_DISPATCH_MAP_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"DISPATCH_MAP_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"AFX_EVENT_MAP_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"EVENT_MAP_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"AFX_EVENTSINK_MAP_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"EVENTSINK_MAP_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"CallType"
-			value      	"")
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"DeclSpec"
-			value      	"")
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"BodyImage"
-			value      	(value Text ""))))
-	    (object Attribute
-		tool       	"MSVC"
-		name       	"default__Role"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"Type"
-			value      	("MSVCAttributeTypeSet" 0))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"MSVCAttributeTypeSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Normal"
-				value      	0)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Member_Property"
-				value      	1)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Get_Set_Property"
-				value      	2)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Dialog_Data"
-				value      	3)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Field_Data"
-				value      	4)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Stock_Property"
-				value      	5)))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"AFX_DISPATCH_MAP_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"DISPATCH_MAP_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"DeclSpec"
-			value      	"")
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"PointerBase"
-			value      	"")
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"CallType"
-			value      	"")
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"StockPropertyImplementation"
-			value      	"")))
-	    (object Attribute
-		tool       	"MSVC"
-		name       	"default__Has"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"Type"
-			value      	("MSVCAttributeTypeSet" 0))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"MSVCAttributeTypeSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Normal"
-				value      	0)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Member_Property"
-				value      	1)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Get_Set_Property"
-				value      	2)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Dialog_Data"
-				value      	3)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Field_Data"
-				value      	4)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Stock_Property"
-				value      	5)))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"AFX_DISPATCH_MAP_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"DISPATCH_MAP_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"DeclSpec"
-			value      	"")
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"PointerBase"
-			value      	"")
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"CallType"
-			value      	"")
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"StockPropertyImplementation"
-			value      	"")))
-	    (object Attribute
-		tool       	"MSVC"
-		name       	"default__Attribute"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"Type"
-			value      	("MSVCAttributeTypeSet" 0))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"MSVCAttributeTypeSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Normal"
-				value      	0)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Member_Property"
-				value      	1)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Get_Set_Property"
-				value      	2)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Dialog_Data"
-				value      	3)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Field_Data"
-				value      	4)
-			    (object Attribute
-				tool       	"MSVC"
-				name       	"Stock_Property"
-				value      	5)))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"AFX_DISPATCH_MAP_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"DISPATCH_MAP_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"DeclSpec"
-			value      	"")
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"PointerBase"
-			value      	"")
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"CallType"
-			value      	"")
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"StockPropertyImplementation"
-			value      	"")))
-	    (object Attribute
-		tool       	"MSVC"
-		name       	"default__Module-Spec"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"GenerateIncludesGroup"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"AFX_INCLUDES_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"GenerateInsertLocation"
-			value      	FALSE)))
-	    (object Attribute
-		tool       	"MSVC"
-		name       	"default__Module-Body"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"GenerateIncludesGroup"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"AFX_INCLUDES_Entries"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"MSVC"
-			name       	"GenerateInsertLocation"
-			value      	FALSE)))
-	    (object Attribute
-		tool       	"cg"
-		name       	"HiddenTool"
-		value      	FALSE)
-	    (object Attribute
-		tool       	"Rose Model Integrator"
-		name       	"HiddenTool"
-		value      	FALSE)
-	    (object Attribute
-		tool       	"Rose Web Publisher"
-		name       	"HiddenTool"
-		value      	FALSE)
-	    (object Attribute
-		tool       	"COM"
-		name       	"propertyId"
-		value      	"783606378")
-	    (object Attribute
-		tool       	"COM"
-		name       	"default__Class"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"COM"
-			name       	"TypeKinds"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"COM"
-				name       	"enum"
-				value      	100)
-			    (object Attribute
-				tool       	"COM"
-				name       	"record"
-				value      	101)
-			    (object Attribute
-				tool       	"COM"
-				name       	"module"
-				value      	102)
-			    (object Attribute
-				tool       	"COM"
-				name       	"interface"
-				value      	103)
-			    (object Attribute
-				tool       	"COM"
-				name       	"dispinterface"
-				value      	104)
-			    (object Attribute
-				tool       	"COM"
-				name       	"coclass"
-				value      	105)
-			    (object Attribute
-				tool       	"COM"
-				name       	"alias"
-				value      	106)
-			    (object Attribute
-				tool       	"COM"
-				name       	"union"
-				value      	107)
-			    (object Attribute
-				tool       	"COM"
-				name       	"max"
-				value      	108)
-			    (object Attribute
-				tool       	"COM"
-				name       	"(none)"
-				value      	109)))
-		    (object Attribute
-			tool       	"COM"
-			name       	"Generate"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"COM"
-			name       	"kind"
-			value      	("TypeKinds" 109))
-		    (object Attribute
-			tool       	"COM"
-			name       	"uuid"
-			value      	"")
-		    (object Attribute
-			tool       	"COM"
-			name       	"version"
-			value      	"")
-		    (object Attribute
-			tool       	"COM"
-			name       	"helpstring"
-			value      	"")
-		    (object Attribute
-			tool       	"COM"
-			name       	"helpcontext"
-			value      	"")
-		    (object Attribute
-			tool       	"COM"
-			name       	"attributes"
-			value      	"")
-		    (object Attribute
-			tool       	"COM"
-			name       	"dllname"
-			value      	"")
-		    (object Attribute
-			tool       	"COM"
-			name       	"alias"
-			value      	"")))
-	    (object Attribute
-		tool       	"COM"
-		name       	"default__Operation"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"COM"
-			name       	"Generate"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"COM"
-			name       	"id"
-			value      	"")
-		    (object Attribute
-			tool       	"COM"
-			name       	"helpstring"
-			value      	"")
-		    (object Attribute
-			tool       	"COM"
-			name       	"attributes"
-			value      	"")))
-	    (object Attribute
-		tool       	"COM"
-		name       	"default__Attribute"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"COM"
-			name       	"Generate"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"COM"
-			name       	"id"
-			value      	"")
-		    (object Attribute
-			tool       	"COM"
-			name       	"helpstring"
-			value      	"")
-		    (object Attribute
-			tool       	"COM"
-			name       	"attributes"
-			value      	"")))
-	    (object Attribute
-		tool       	"COM"
-		name       	"default__Module-Spec"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"COM"
-			name       	"Generate"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"COM"
-			name       	"filename"
-			value      	"")
-		    (object Attribute
-			tool       	"COM"
-			name       	"library"
-			value      	"")
-		    (object Attribute
-			tool       	"COM"
-			name       	"uuid"
-			value      	"")
-		    (object Attribute
-			tool       	"COM"
-			name       	"version"
-			value      	"")
-		    (object Attribute
-			tool       	"COM"
-			name       	"helpstring"
-			value      	"")
-		    (object Attribute
-			tool       	"COM"
-			name       	"helpfile"
-			value      	"")
-		    (object Attribute
-			tool       	"COM"
-			name       	"helpcontext"
-			value      	"")
-		    (object Attribute
-			tool       	"COM"
-			name       	"lcid"
-			value      	"")
-		    (object Attribute
-			tool       	"COM"
-			name       	"attributes"
-			value      	"")))
-	    (object Attribute
-		tool       	"COM"
-		name       	"default__Param"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"COM"
-			name       	"attributes"
-			value      	"")))
-	    (object Attribute
-		tool       	"COM"
-		name       	"HiddenTool"
-		value      	FALSE)
-	    (object Attribute
-		tool       	"Version Control"
-		name       	"HiddenTool"
-		value      	FALSE)
-	    (object Attribute
-		tool       	"Visual Basic"
-		name       	"propertyId"
-		value      	"783606378")
-	    (object Attribute
-		tool       	"Visual Basic"
-		name       	"default__Class"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"UpdateCode"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"UpdateModel"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"InstancingSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Visual Basic"
-				name       	"Private"
-				value      	221)
-			    (object Attribute
-				tool       	"Visual Basic"
-				name       	"PublicNotCreatable"
-				value      	213)
-			    (object Attribute
-				tool       	"Visual Basic"
-				name       	"SingleUse"
-				value      	214)
-			    (object Attribute
-				tool       	"Visual Basic"
-				name       	"GlobalSingleUse"
-				value      	215)
-			    (object Attribute
-				tool       	"Visual Basic"
-				name       	"MultiUse"
-				value      	219)
-			    (object Attribute
-				tool       	"Visual Basic"
-				name       	"GlobalMultiUse"
-				value      	220)))
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"BaseSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Visual Basic"
-				name       	"(none)"
-				value      	222)
-			    (object Attribute
-				tool       	"Visual Basic"
-				name       	"0"
-				value      	223)
-			    (object Attribute
-				tool       	"Visual Basic"
-				name       	"1"
-				value      	224)))
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"OptionBase"
-			value      	("BaseSet" 222))
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"OptionExplicit"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"OptionCompare"
-			value      	("CompareSet" 202))
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"Instancing"
-			value      	("InstancingSet" 219))
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"CompareSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Visual Basic"
-				name       	"(none)"
-				value      	202)
-			    (object Attribute
-				tool       	"Visual Basic"
-				name       	"Binary"
-				value      	203)
-			    (object Attribute
-				tool       	"Visual Basic"
-				name       	"Text"
-				value      	204)))))
-	    (object Attribute
-		tool       	"Visual Basic"
-		name       	"default__Operation"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"LibraryName"
-			value      	"")
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"AliasName"
-			value      	"")
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"IsStatic"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"ProcedureID"
-			value      	"")
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"ReplaceExistingBody"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"DefaultBody"
-			value      	(value Text ""))))
-	    (object Attribute
-		tool       	"Visual Basic"
-		name       	"default__Attribute"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"New"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"WithEvents"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"ProcedureID"
-			value      	"")
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"PropertyName"
-			value      	"")
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"Subscript"
-			value      	"")))
-	    (object Attribute
-		tool       	"Visual Basic"
-		name       	"default__Role"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"UpdateCode"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"New"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"WithEvents"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"FullName"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"ProcedureID"
-			value      	"")
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"PropertyName"
-			value      	"")
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"Subscript"
-			value      	"")))
-	    (object Attribute
-		tool       	"Visual Basic"
-		name       	"default__Inherit"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"ImplementsDelegation"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"FullName"
-			value      	FALSE)))
-	    (object Attribute
-		tool       	"Visual Basic"
-		name       	"default__Param"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"ByVal"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"ByRef"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"Optional"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"ParamArray"
-			value      	FALSE)))
-	    (object Attribute
-		tool       	"Visual Basic"
-		name       	"default__Module-Spec"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"ProjectFile"
-			value      	"")
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"UpdateCode"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"UpdateModel"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"ImportReferences"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"QuickImport"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Visual Basic"
-			name       	"ImportBinary"
-			value      	FALSE)))
-	    (object Attribute
-		tool       	"Visual Basic"
-		name       	"HiddenTool"
-		value      	FALSE)
-	    (object Attribute
-		tool       	"VisualStudio"
-		name       	"HiddenTool"
-		value      	FALSE)
-	    (object Attribute
-		tool       	"Web Modeler"
-		name       	"HiddenTool"
-		value      	FALSE)
-	    (object Attribute
-		tool       	"XML_DTD"
-		name       	"propertyId"
-		value      	"809135966")
-	    (object Attribute
-		tool       	"XML_DTD"
-		name       	"default__Project"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"XML_DTD"
-			name       	"CreateMissingDirectories"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"XML_DTD"
-			name       	"Editor"
-			value      	("EditorType" 100))
-		    (object Attribute
-			tool       	"XML_DTD"
-			name       	"StopOnError"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"XML_DTD"
-			name       	"EditorType"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"XML_DTD"
-				name       	"BuiltIn"
-				value      	100)
-			    (object Attribute
-				tool       	"XML_DTD"
-				name       	"WindowsShell"
-				value      	101)))))
-	    (object Attribute
-		tool       	"XML_DTD"
-		name       	"default__Class"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"XML_DTD"
-			name       	"Entity_SystemID"
-			value      	"")
-		    (object Attribute
-			tool       	"XML_DTD"
-			name       	"Entity_PublicID"
-			value      	"")
-		    (object Attribute
-			tool       	"XML_DTD"
-			name       	"NotationValue"
-			value      	"")
-		    (object Attribute
-			tool       	"XML_DTD"
-			name       	"InternalValue"
-			value      	"")
-		    (object Attribute
-			tool       	"XML_DTD"
-			name       	"ParameterEntity"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"XML_DTD"
-			name       	"ExternalEntity"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"XML_DTD"
-			name       	"Notation_SystemID"
-			value      	"")
-		    (object Attribute
-			tool       	"XML_DTD"
-			name       	"Notation_PublicID"
-			value      	"")))
-	    (object Attribute
-		tool       	"XML_DTD"
-		name       	"default__Attribute"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"XML_DTD"
-			name       	"DefaultDeclType"
-			value      	"")))
-	    (object Attribute
-		tool       	"XML_DTD"
-		name       	"default__Module-Spec"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"XML_DTD"
-			name       	"Assign All"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"XML_DTD"
-			name       	"ComponentPath"
-			value      	"")))
-	    (object Attribute
-		tool       	"XML_DTD"
-		name       	"HiddenTool"
-		value      	FALSE)
-	    (object Attribute
-		tool       	"ClearCase"
-		name       	"HiddenTool"
-		value      	FALSE)
-	    (object Attribute
-		tool       	"RequisitePro"
-		name       	"HiddenTool"
-		value      	FALSE)
-	    (object Attribute
-		tool       	"SoDA"
-		name       	"HiddenTool"
-		value      	FALSE)
-	    (object Attribute
-		tool       	"TopLink"
-		name       	"HiddenTool"
-		value      	FALSE)
-	    (object Attribute
-		tool       	"Cplusplus"
-		name       	"default__Module-Body"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"Synchronize"
-			value      	TRUE)
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"RevEngRootDirectory"
-			value      	"")
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"RootPackage"
-			value      	"C++ Reverse Engineered")
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"RevEngDirectoriesAsPackages"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"HeaderFileExtension"
-			value      	".h")
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"ImplementationFileExtension"
-			value      	".cpp")
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"NewHeaderFileDirectory"
-			value      	"")
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"NewImplementationFileDirectory"
-			value      	"")
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"FileCapitalization"
-			value      	("FileCapitalizationSet" 0))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"CodeGenExtraDirectories"
-			value      	("CodeGenExtraDirectoriesSet" 0))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"StripClassPrefix"
-			value      	"")
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"UseTabs"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"TabWidth"
-			value      	8)
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"IndentWidth"
-			value      	4)
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"AccessIndentation"
-			value      	-2)
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"ModelIdCommentRules"
-			value      	("ModelIdCommentRulesSet" 1))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"PageWidth"
-			value      	80)
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"ClassMemberOrder"
-			value      	("MemberOrderSet" 1))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"OneParameterPerLine"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"NamespaceBraceStyle"
-			value      	("BraceStyleSet" 2))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"ClassBraceStyle"
-			value      	("BraceStyleSet" 2))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"FunctionBraceStyle"
-			value      	("BraceStyleSet" 2))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"Copyright"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"InitialHeaderIncludes"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"InitialBodyIncludes"
-			value      	(value Text ""))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"CodeGenExtraDirectoriesSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"None"
-				value      	0)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Namespaces"
-				value      	1)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Packages"
-				value      	2)))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"FileCapitalizationSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Same as model"
-				value      	0)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Lower case"
-				value      	1)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Upper case"
-				value      	2)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Lower case with underscores"
-				value      	3)))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"BraceStyleSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"B1"
-				value      	1)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"B2"
-				value      	2)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"B3"
-				value      	3)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"B4"
-				value      	4)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"B5"
-				value      	5)))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"MemberOrderSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Public First"
-				value      	1)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Private First"
-				value      	2)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Order by kind"
-				value      	3)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Unordered"
-				value      	4)))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"ModelIdCommentRulesSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Code generation only"
-				value      	1)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Code generation and reverse engineering"
-				value      	2)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Never generate model IDs"
-				value      	3)))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"CreateBackupFiles"
-			value      	FALSE)
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"CommentRules"
-			value      	("CommentRulesSet" 1))
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"CommentRulesSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Always synchronize"
-				value      	1)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Code generation only"
-				value      	2)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Reverse engineering only"
-				value      	3)
-			    (object Attribute
-				tool       	"Cplusplus"
-				name       	"Never synchronize"
-				value      	4)))))
-	    (object Attribute
-		tool       	"Ada83"
-		name       	"default__Param"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"Mode"
-			value      	("ParameterModeSet" 232))
-		    (object Attribute
-			tool       	"Ada83"
-			name       	"ParameterModeSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"Default"
-				value      	232)
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"In"
-				value      	204)
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"Out"
-				value      	205)
-			    (object Attribute
-				tool       	"Ada83"
-				name       	"InOut"
-				value      	203)))))
-	    (object Attribute
-		tool       	"Ada95"
-		name       	"default__Param"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"Mode"
-			value      	("ParameterModeSet" 232))
-		    (object Attribute
-			tool       	"Ada95"
-			name       	"ParameterModeSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Default"
-				value      	232)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"In"
-				value      	204)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Out"
-				value      	205)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"InOut"
-				value      	203)
-			    (object Attribute
-				tool       	"Ada95"
-				name       	"Access"
-				value      	220)))))
-	    (object Attribute
-		tool       	"Deploy"
-		name       	"HiddenTool"
-		value      	FALSE)
-	    (object Attribute
-		tool       	"Cplusplus"
-		name       	"default__Uses"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"Cplusplus"
-			name       	"BodyReferenceOnly"
-			value      	FALSE)))
-	    (object Attribute
-		tool       	"CORBA"
-		name       	"default__Param"
-		value      	(list Attribute_Set
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"Direction"
-			value      	("ParamDirectionTypeSet" 102))
-		    (object Attribute
-			tool       	"CORBA"
-			name       	"ParamDirectionTypeSet"
-			value      	(list Attribute_Set
-			    (object Attribute
-				tool       	"CORBA"
-				name       	"in"
-				value      	102)
-			    (object Attribute
-				tool       	"CORBA"
-				name       	"inout"
-				value      	103)
-			    (object Attribute
-				tool       	"CORBA"
-				name       	"out"
-				value      	104))))))
-	quid       	"3A0B2474027F"))
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/schema/adapterFactory.exsd b/plugins/org.eclipse.wst.common.emfworkbench.integration/schema/adapterFactory.exsd
deleted file mode 100644
index d0100dc..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/schema/adapterFactory.exsd
+++ /dev/null
@@ -1,144 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.common.emfworkbench.integration">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.common.emfworkbench.integration" id="adapterFactory" name="Adapter Factory Extension"/>
-      </appInfo>
-      <documentation>
-         This is used to register an adapter factory with the dynamic adapter factory.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="adapterFactory" minOccurs="1" maxOccurs="unbounded"/>
-         </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">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="adapterFactory">
-      <annotation>
-         <documentation>
-            Defines the Adapter Factory being added. All added Adapter Factories are queriable whenever their Function Group and optional Viewer Id are specified.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="view" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="packageURI" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The package URI that you are extending (for example &quot;ejb.xmi&quot;)
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="className" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The fully qualified name of the class which implements org.eclipse.emf.common.notify.AdapterFactory.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The Unique identifier of the Adapter Factory extension.  This will associate it with one or more function groups based on the function group patterns.  Function Groups allow Content and Actions to be enabled or disabled based on project-specific information. Generally, they are used by vendors who wish to add functionality specific to their products, e.g. J2EE Application Servers.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="functionGroupID" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="view">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  An optional viewer Id which will limit the invocation of the defined Adapter Factory to the given viewer id.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;This extension point is part of an interim API that is still under development and expected to change significantly before reaching stability. It is being made available at this early stage to solicit feedback from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken (repeatedly) as the API evolves.&lt;/b&gt;
-      </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) 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/schema/editModel.exsd b/plugins/org.eclipse.wst.common.emfworkbench.integration/schema/editModel.exsd
deleted file mode 100644
index 3a103a7..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/schema/editModel.exsd
+++ /dev/null
@@ -1,181 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.common.emfworkbench.integration">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.common.emfworkbench.integration" id="editModel" name="EMF Resource Edit Model"/>
-      </appInfo>
-      <documentation>
-         Edit models provide a framework for managing a set of EMF resources within a unit of work.  For example, a workspace operation may affect a change to multiple EMF resources. Edit models provide basic services such as loads, saves (when necessary), and validate edit for the managed resources.  Edit models are reference counted, therefore a single instance of an edit model can be shared by more than one operation or editor.  By declaring an edit model, a plugin provider enables other components to contribute resources to be managed by that edit model.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="editModel" minOccurs="1" maxOccurs="unbounded"/>
-         </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">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="editModel">
-      <annotation>
-         <documentation>
-            The declaration for an edit model to be used in the workspace.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="editModelResource" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="editModelID" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A unique identifier for the edit model.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="factoryClass" type="string" use="required">
-            <annotation>
-               <documentation>
-                  An optional factory class that is used for this edit model.  The class must implement the interface &lt;code&gt;org.eclipse.wst.common.internal.emfworkbench.integration.EditModelFactory&lt;/code&gt;. If none is specified, then a generic &lt;code&gt;EditModel&lt;/code&gt; is created.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="loadUnknownResourcesAsReadOnly" type="boolean">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="parentModelID" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="editModelResource">
-      <annotation>
-         <documentation>
-            This is an individual contribution of a resource to the edit model.  If more than one instance of the same URI is registered against an edit model id, the resource is still only loaded once.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="URI" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The URI of the resource relative to the root container from which EMF resources are loaded.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="autoload" type="boolean" use="default" value="false">
-            <annotation>
-               <documentation>
-                  Indicator which determines whether this resource should be autoloaded when the edit model is created, or when an IFile corresponding to this resource is added.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;pre&gt;
-   &lt;extension
-         id=&quot;editModel.acme.parent&quot;
-         name=&quot;Acme Parent Edit Model&quot;
-         point=&quot;org.eclipse.wst.common.emfworkbench.integration.editModel&quot;&gt;
-      &lt;editModel
-            editModelID=&quot;com.acme.acmepro.parent.editModel&quot;
-            factoryClass=&quot;org.eclipse.wst.common.internal.emfworkbench.integration.EditModelFactory&quot;&gt;
-        &lt;editModelResource URI=&quot;DIR/resource0.xml&quot;/&gt;
-        &lt;editModelResource URI=&quot;DIR/resource1.xml&quot;/&gt;
-      &lt;/editModel&gt;
-   &lt;/extension&gt;
-
-   &lt;extension
-         id=&quot;editModel.acme.child&quot;
-         name=&quot;Acme Child Edit Model&quot;
-         point=&quot;org.eclipse.wst.common.emfworkbench.integration.editModel&quot;&gt;
-      &lt;editModel
-            editModelID=&quot;com.acme.acmepro.child.editModel&quot;
-            factoryClass=&quot;org.eclipse.wst.common.internal.emfworkbench.integration.EditModelFactory&quot;
-            parentModelID=&quot;com.acme.acmepro.parent.editModel&quot;&gt;
-        &lt;editModelResource URI=&quot;DIR/resource2.xml&quot;/&gt;
-        &lt;editModelResource URI=&quot;DIR/resource3.xml&quot;/&gt;
-      &lt;/editModel&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Edit Models can be accessed through the &lt;code&gt;org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext&lt;/code&gt;.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/schema/editModelExtension.exsd b/plugins/org.eclipse.wst.common.emfworkbench.integration/schema/editModelExtension.exsd
deleted file mode 100644
index 006d2ae..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/schema/editModelExtension.exsd
+++ /dev/null
@@ -1,130 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.common.emfworkbench.integration">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.common.emfworkbench.integration" id="editModelExtension" name="Edit Model Extensions"/>
-      </appInfo>
-      <documentation>
-         The Edit Model Extension allows third parties to contribute expected resources to Edit Models. The functionGroupID allows users to select which extensions they choose to have enabled.
-      </documentation>
-   </annotation>
-
-   <include schemaLocation="editModel.exsd"/>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="editModelExtension" minOccurs="1" maxOccurs="unbounded"/>
-         </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">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="editModelExtension">
-      <annotation>
-         <documentation>
-            Edit model extensions allow components to contribute known resource URIs to an edit model.  Whenever an edit model is loaded, the resources will automatically be loaded and managed by the edit model.  Changes to the resources will be tracked and saved during operations or editor saves.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="editModelResource" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="editModelID" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique id of the edit model being extended.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique identifier for this extension.  This will be used to associate it with a function group pattern binding.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;pre&gt;
-   &lt;extension
-         point=&quot;org.eclipse.wst.common.emfworkbench.integration.editModelExtension&quot;&gt;
-      &lt;editModelExtension
-            editModelID=&quot;org.sample.inheritance.parent.editModel&quot;
-            functionGroupID=&quot;org.sample.group&quot;&gt;
-         &lt;editModelResource URI=&quot;DIR/extension0.xml&quot;/&gt;
-         &lt;editModelResource URI=&quot;DIR/extension1.xml&quot;/&gt;
-      &lt;/editModelExtension&gt;
-   &lt;/extension&gt;
-&lt;/pre&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) 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/schema/modifierHelperFactory.exsd b/plugins/org.eclipse.wst.common.emfworkbench.integration/schema/modifierHelperFactory.exsd
deleted file mode 100644
index 9cc07db..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/schema/modifierHelperFactory.exsd
+++ /dev/null
@@ -1,160 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.common.emfworkbench.integration">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.common.emfworkbench.integration" id="ModifierHelperFactory" name="Modifier Helper Factory"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <documentation>
-            This is used to register for the model modifiers.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="factory" minOccurs="1" maxOccurs="unbounded"/>
-         </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">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="factory">
-      <complexType>
-         <sequence>
-            <element ref="package" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="package">
-      <complexType>
-         <sequence>
-            <element ref="type" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="uri" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="type">
-      <complexType>
-         <sequence>
-            <element ref="feature" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="feature">
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="action" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;This extension point is part of an interim API that is still under development and expected to change significantly before reaching stability. It is being made available at this early stage to solicit feedback from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken (repeatedly) as the API evolves.&lt;/b&gt;
-      </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) 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/CompatibilityWorkbenchURIConverterImpl.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/CompatibilityWorkbenchURIConverterImpl.java
deleted file mode 100644
index 8ae0cd1..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/CompatibilityWorkbenchURIConverterImpl.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Mar 4, 2004
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.wst.common.internal.emfworkbench;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.jem.util.emf.workbench.ResourceSetWorkbenchSynchronizer;
-import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
-import org.eclipse.jem.util.emf.workbench.WorkbenchURIConverterImpl;
-import org.eclipse.wst.common.internal.emf.resource.CompatibilityURIConverter;
-
-/**
- * @author schacher
- * 
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public class CompatibilityWorkbenchURIConverterImpl extends WorkbenchURIConverterImpl implements CompatibilityURIConverter {
-	/**
-	 *  
-	 */
-	public CompatibilityWorkbenchURIConverterImpl() {
-		super();
-	}
-
-	/**
-	 * @param anInputContainer
-	 */
-	public CompatibilityWorkbenchURIConverterImpl(IContainer anInputContainer) {
-		super(anInputContainer);
-	}
-
-	/**
-	 * @param aContainer
-	 * @param aSynchronizer
-	 */
-	public CompatibilityWorkbenchURIConverterImpl(IContainer aContainer, ResourceSetWorkbenchSynchronizer aSynchronizer) {
-		super(aContainer, aSynchronizer);
-	}
-
-	/**
-	 * @param anInputContainer
-	 * @param anOutputContainer
-	 */
-	public CompatibilityWorkbenchURIConverterImpl(IContainer anInputContainer, IContainer anOutputContainer) {
-		super(anInputContainer, anOutputContainer);
-	}
-
-	/**
-	 * @param anInputContainer
-	 * @param anOutputContainer
-	 * @param aSynchronizer
-	 */
-	public CompatibilityWorkbenchURIConverterImpl(IContainer anInputContainer, IContainer anOutputContainer, ResourceSetWorkbenchSynchronizer aSynchronizer) {
-		super(anInputContainer, anOutputContainer, aSynchronizer);
-	}
-
-	/**
-	 * @see com.ibm.etools.xmi.helpers.CompatibilityURIConverter#deNormalize(URI)
-	 */
-	public URI deNormalize(URI uri) {
-		if (WorkbenchResourceHelperBase.isPlatformResourceURI(uri)) {
-			IFile aFile = WorkbenchResourceHelper.getPlatformFile(uri);
-			if (aFile != null) {
-				IProject fileProject = aFile.getProject();
-				//If it is not in the same project then just return the URI as is.
-				if (resourceSetSynchronizer.getProject() == fileProject)
-					return getContainerRelativeURI(aFile);
-			}
-		}
-		return uri;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/EMFAdapterFactory.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/EMFAdapterFactory.java
deleted file mode 100644
index 546c695..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/EMFAdapterFactory.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Feb 25, 2004
- *  
- */
-package org.eclipse.wst.common.internal.emfworkbench;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-
-/**
- * @author mdelder
- *  
- */
-public class EMFAdapterFactory implements IAdapterFactory {
-
-	protected static final Class IPROJECT_CLASS = IProject.class;
-	protected static final Class IRESOURCE_CLASS = IResource.class;
-	protected static final Class IFILE_CLASS = IFile.class;
-	protected static final Class EOBJECT_CLASS = EObject.class;
-
-	/**
-	 *  
-	 */
-	public EMFAdapterFactory() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class)
-	 */
-	public Object getAdapter(Object adaptableObject, Class adapterType) {
-		if (adaptableObject instanceof EObject) {
-			if (adapterType == IFILE_CLASS || adapterType == IRESOURCE_CLASS)
-				return WorkbenchResourceHelper.getFile((EObject) adaptableObject);
-			else if (adapterType == IPROJECT_CLASS)
-				return ProjectUtilities.getProject((EObject) adaptableObject);
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
-	 */
-	public Class[] getAdapterList() {
-		return new Class[]{IPROJECT_CLASS, IRESOURCE_CLASS, IFILE_CLASS};
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/EMFWorkbenchContext.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/EMFWorkbenchContext.java
deleted file mode 100644
index 5c31747..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/EMFWorkbenchContext.java
+++ /dev/null
@@ -1,414 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Mar 3, 2004
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.wst.common.internal.emfworkbench;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.runtime.CoreException;
-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.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.jem.util.emf.workbench.EMFWorkbenchContextBase;
-import org.eclipse.jem.util.emf.workbench.ISynchronizerExtender;
-import org.eclipse.jem.util.emf.workbench.ProjectResourceSet;
-import org.eclipse.jem.util.emf.workbench.WorkbenchURIConverter;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.internal.emf.resource.CompatibilityXMIResource;
-import org.eclipse.wst.common.internal.emf.resource.ReferencedXMIFactoryImpl;
-import org.eclipse.wst.common.internal.emf.utilities.DefaultOverridableResourceFactoryRegistry;
-import org.eclipse.wst.common.internal.emfworkbench.edit.EditModelRegistry;
-import org.eclipse.wst.common.internal.emfworkbench.integration.EditModel;
-import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelEvent;
-import org.eclipse.wst.common.internal.emfworkbench.integration.ProjectResourceSetEditImpl;
-
-/**
- * @author schacher
- * 
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public class EMFWorkbenchContext extends EMFWorkbenchContextBase implements ISynchronizerExtender {
-
-	private Map readOnlyModels = new HashMap();
-	private Map editableModels = new HashMap();
-
-	protected Adapter resourceSetListener;
-
-	protected boolean defaultToMOF5Compatibility = false;
-
-
-	/**
-	 * @param aProject
-	 */
-	public EMFWorkbenchContext(IProject aProject) {
-		super(aProject);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext#initializeResourceSet(org.eclipse.wst.common.internal.emfworkbench.ProjectResourceSet)
-	 */
-	protected void initializeResourceSet(ProjectResourceSet aResourceSet) {
-		super.initializeResourceSet(aResourceSet);
-		Resource.Factory.Registry reg = new DefaultOverridableResourceFactoryRegistry();
-		Resource.Factory factory = new ReferencedXMIFactoryImpl();
-		reg.getExtensionToFactoryMap().put(Resource.Factory.Registry.DEFAULT_EXTENSION, factory);
-		// add xmi because other plugins are registering it globally
-		reg.getExtensionToFactoryMap().put("xmi", factory); //$NON-NLS-1$
-		aResourceSet.setResourceFactoryRegistry(reg);
-		aResourceSet.getSynchronizer().addExtender(this); // added so we can be informed of closes
-		// to the project.
-		startListeningToResourceSet();
-	}
-
-	public static String getCacheID(String editModelID, Map params) {
-		return EditModelRegistry.getInstance().getCacheID(editModelID, params);
-	}
-
-	/**
-	 * This is the API that clients should use when they have an intent to modify a particular
-	 * resource. You should only access the resources through the J2EEEditModel that is returned by
-	 * this method if you have the intent to modify.
-	 * 
-	 * @see J2EEEditModel
-	 */
-	public final EditModel getEditModelForWrite(String editModelID, Object accessorKey, Map params) {
-		EditModel editModel = getExistingEditModel(editModelID, params, false);
-		if (null == editModel) {
-			editModel = createEditModelForWrite(editModelID, params);
-			synchronized (editModel) {
-				cacheEditModel(editModel, params);
-				editModel.access(accessorKey);
-			}
-		} else {
-			synchronized (editModel) {
-				if (editModel.isDisposed() || editModel.isDisposing()) {
-					editModel = createEditModelForWrite(editModelID, params);
-					cacheEditModel(editModel, params);
-				}
-				editModel.access(accessorKey);
-			}
-		}
-		return editModel;
-	}
-
-	/**
-	 * This is the API that clients should use when they want to read a group of resources that are
-	 * normally managed by the edit model with
-	 * 
-	 * @aKey. You should only access the resources through the J2EEEditModel that is returned by
-	 *        this method. You must call releaseEditModel(...) when you are finished with the edit
-	 *        model.
-	 * @see J2EEEditModel
-	 */
-	public final EditModel getEditModelForRead(String editModelID, Object accessorKey, Map params) {
-		EditModel editModel = getExistingEditModel(editModelID, params, true);
-		if (null == editModel) {
-			editModel = createEditModelForRead(editModelID, params);
-			synchronized (editModel) {
-				cacheEditModel(editModel, params);
-				editModel.access(accessorKey);
-			}
-		} else {
-			synchronized (editModel) {
-				if (editModel.isDisposed() || editModel.isDisposing()) {
-					editModel = createEditModelForRead(editModelID, params);
-					cacheEditModel(editModel, params);
-				}
-				editModel.access(accessorKey);
-			}
-		}
-		return editModel;
-	}
-
-	/**
-	 * This is the API that clients should use when they have an intent to modify a particular
-	 * resource. You should only access the resources through the J2EEEditModel that is returned by
-	 * this method if you have the intent to modify.
-	 * 
-	 * @see J2EEEditModel
-	 */
-	public final EditModel getEditModelForWrite(String editModelID, Object accessorKey) {
-		return getEditModelForWrite(editModelID, accessorKey, null);
-	}
-
-	/**
-	 * This is the API that clients should use when they want to read a group of resources that are
-	 * normally managed by the edit model with
-	 * 
-	 * @aKey. You should only access the resources through the J2EEEditModel that is returned by
-	 *        this method. You must call releaseEditModel(...) when you are finished with the edit
-	 *        model.
-	 * @see J2EEEditModel
-	 */
-	public final EditModel getEditModelForRead(String editModelID, Object accessorKey) {
-		return getEditModelForRead(editModelID, accessorKey, null);
-	}
-
-
-
-	public EditModel getExistingEditModel(String editModelID, Map params, boolean isReadOnly) {
-		EditModel editModel = null;
-		synchronized (readOnlyModels) {
-			if (isReadOnly) {
-				editModel = (EditModel) readOnlyModels.get(getCacheID(editModelID, params));
-			} else {
-				synchronized (editableModels) {
-					editModel = (EditModel) editableModels.get(getCacheID(editModelID, params));
-				}
-			}
-		}
-		return editModel;
-	}
-
-	/**
-	 * Subclasses may override to return the appropriate read-only J2EEEditModel.
-	 */
-	protected EditModel createEditModelForRead(String editModelID, Map params) {
-		return EditModelRegistry.getInstance().createEditModelForRead(editModelID, this, params);
-	}
-
-	/**
-	 * Subclasses may override to return the appropriate J2EEEditModel.
-	 */
-	protected EditModel createEditModelForWrite(String editModelID, Map params) {
-		return EditModelRegistry.getInstance().createEditModelForWrite(editModelID, this, params);
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (4/16/2001 12:25:39 PM)
-	 * 
-	 * @return java.util.List
-	 */
-	public void cacheEditModel(EditModel editModel, Map params) {
-		editModel.setParams(params);
-		synchronized (readOnlyModels) {
-			if (editModel.isReadOnly())
-				readOnlyModels.put(getCacheID(editModel.getEditModelID(), params), editModel);
-			else
-				synchronized (editableModels) {
-					editableModels.put(getCacheID(editModel.getEditModelID(), params), editModel);
-				}
-		}
-	}
-
-	protected void discardAllEditModels() {
-		synchronized (readOnlyModels) {
-			synchronized (editableModels) {
-				discardModels(readOnlyModels.values());
-				discardModels(editableModels.values());
-			}
-		}
-
-	}
-
-	private void discardModels(Collection editModels) {
-		if (editModels != null && !editModels.isEmpty()) {
-			// Make a copy for safety against concurrent modification
-			Iterator it = new ArrayList(editModels).iterator();
-			while (it.hasNext()) {
-				((EditModel) it.next()).dispose();
-			}
-		}
-	}
-
-	public void removeEditModel(EditModel editModel, boolean readOnly) {
-		// The best way would be to recompute the cache id, but we don't care
-		// because the edit model should only be cached once anyway
-		synchronized (readOnlyModels) {
-			if (readOnly)
-				readOnlyModels.values().remove(editModel);
-			else
-				synchronized (editableModels) {
-					editableModels.values().remove(editModel);
-				}
-		}
-	}
-
-	/**
-	 * Notify all editModels of the change.
-	 */
-	protected void notifyEditModels(EditModelEvent anEvent) {
-		if (anEvent == null)
-			return;
-		List aList = new ArrayList();
-		synchronized (readOnlyModels) {
-			synchronized (editableModels) {
-				aList.addAll(readOnlyModels.values());
-				aList.addAll(editableModels.values());
-			}
-		}
-		EditModel editModel;
-		for (int i = 0; i < aList.size(); i++) {
-			editModel = (EditModel) aList.get(i);
-			try {
-				editModel.resourceChanged(anEvent);
-			} catch (Exception e) {
-				Logger.getLogger().logError(e);
-			}
-		}
-	}
-
-	protected boolean shouldNotifyEditModels() {
-		synchronized (readOnlyModels) {
-			synchronized (editableModels) {
-				return !this.readOnlyModels.isEmpty() || !this.editableModels.isEmpty();
-			}
-		}
-	}
-
-	protected Adapter getResourceSetListener() {
-		if (resourceSetListener == null)
-			resourceSetListener = new ResourceSetListener();
-		return resourceSetListener;
-	}
-
-
-	protected class ResourceSetListener extends AdapterImpl {
-		/*
-		 * @see Adapter#notifyChanged(new ENotificationImpl((InternalEObject)Notifier,
-		 *      int,(EStructuralFeature) EObject, Object, Object, int))
-		 */
-		public void notifyChanged(Notification notification) {
-			switch (notification.getEventType()) {
-				case Notification.ADD :
-					addedResource((Resource) notification.getNewValue());
-					break;
-				case Notification.REMOVE :
-					removedResource((Resource) notification.getOldValue());
-					break;
-				case Notification.REMOVE_MANY :
-					removedResources((List) notification.getOldValue());
-					break;
-			}
-		}
-	}
-
-	/**
-	 * Notify all editModels of the change.
-	 */
-	public void addedResource(Resource addedResource) {
-		if (defaultToMOF5Compatibility && (addedResource != null) && (addedResource instanceof CompatibilityXMIResource))
-			((CompatibilityXMIResource) addedResource).setFormat(CompatibilityXMIResource.FORMAT_MOF5);
-		if (shouldNotifyEditModels()) {
-			EditModelEvent event = new EditModelEvent(EditModelEvent.ADDED_RESOURCE, null);
-			event.addResource(addedResource);
-			notifyEditModels(event);
-		}
-	}
-
-	/**
-	 * Notify all editModels of the change.
-	 */
-	public void removedResource(Resource removedResource) {
-		if (shouldNotifyEditModels()) {
-			EditModelEvent event = new EditModelEvent(EditModelEvent.REMOVED_RESOURCE, null);
-			event.addResource(removedResource);
-			notifyEditModels(event);
-		}
-	}
-
-	/**
-	 * Notify all editModels of the change.
-	 */
-	public void removedResources(List removedResources) {
-		if (shouldNotifyEditModels()) {
-			EditModelEvent event = new EditModelEvent(EditModelEvent.REMOVED_RESOURCE, null);
-			event.addResources(removedResources);
-			notifyEditModels(event);
-		}
-	}
-
-	protected void startListeningToResourceSet() {
-		ResourceSet set = getResourceSet();
-		if (set != null)
-			set.eAdapters().add(getResourceSetListener());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.internal.emfworkbench.ISynchronizerExtender#projectChanged(org.eclipse.core.resources.IResourceDelta)
-	 */
-	public void projectChanged(IResourceDelta delta) {
-		// default nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.internal.emfworkbench.ISynchronizerExtender#projectClosed()
-	 */
-	public void projectClosed() {
-		discardAllEditModels();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContextBase#createURIConverter(org.eclipse.wst.common.internal.emfworkbench.ProjectResourceSet)
-	 */
-	protected WorkbenchURIConverter createURIConverter(ProjectResourceSet aResourceSet) {
-		return new CompatibilityWorkbenchURIConverterImpl(getProject(), aResourceSet.getSynchronizer());
-	}
-
-	protected ProjectResourceSet createResourceSet() {
-		if (project == null)
-			throw new IllegalStateException("Attempt to create resource set with null project"); //$NON-NLS-1$
-		return new ProjectResourceSetEditImpl(project);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContextBase#deleteFile(org.eclipse.emf.ecore.resource.Resource)
-	 */
-	public void deleteFile(Resource resource) {
-		try {
-			WorkbenchResourceHelper.deleteResource(resource);
-		} catch (CoreException ex) {
-			Logger.getLogger().logError(ex);
-		}
-
-	}
-
-	/**
-	 * @return Returns the defaultToMOF5Compatibility.
-	 */
-	public boolean isDefaultToMOF5Compatibility() {
-		return defaultToMOF5Compatibility;
-	}
-
-	/**
-	 * @param defaultToMOF5Compatibility
-	 *            The defaultToMOF5Compatibility to set.
-	 */
-	public void setDefaultToMOF5Compatibility(boolean defaultToMOF5Compatibility) {
-		this.defaultToMOF5Compatibility = defaultToMOF5Compatibility;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/EMFWorkbenchEditResourceHandler.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/EMFWorkbenchEditResourceHandler.java
deleted file mode 100644
index 8bd1073..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/EMFWorkbenchEditResourceHandler.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on May 25, 2004
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Style - Code Templates
- */
-package org.eclipse.wst.common.internal.emfworkbench;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * @author vijayb
- * 
- * TODO To change the template for this generated type comment go to Window - Preferences - Java -
- * Code Style - Code Templates
- */
-public class EMFWorkbenchEditResourceHandler extends NLS {
-	private static final String BUNDLE_NAME = "emfworkbenchedit";//$NON-NLS-1$
-
-	private EMFWorkbenchEditResourceHandler() {
-		// Do not instantiate
-	}
-
-	public static String ClientAccessRegistryException_UI_1;
-	public static String ClientAccessRegistryException_UI_0;
-	public static String Snapshot_ERROR_0;
-	public static String EditModelRegistry_ERROR_2;
-	public static String EditModelRegistry_ERROR_1;
-	public static String EditModelRegistry_ERROR_0;
-	public static String AdapterFactoryDescriptor_ERROR_1;
-	public static String AdapterFactoryDescriptor_ERROR_0;
-	public static String DynamicAdapterFactory_ERROR_0;
-	public static String ClientAccessRegistry_ERROR_1;
-	public static String ClientAccessRegistry_ERROR_0;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, EMFWorkbenchEditResourceHandler.class);
-	}
-
-	public static String getString(String key, Object[] args) {
-		return NLS.bind(key, args);
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/EmfValidationHandler.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/EmfValidationHandler.java
deleted file mode 100644
index 29f42c7..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/EmfValidationHandler.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.internal.emfworkbench;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.wst.validation.internal.IValidationSelectionHandler;
-
-
-/**
- * Emf validation extension for valaditemenuaction
- */
-public class EmfValidationHandler implements IValidationSelectionHandler {
-
-	private String validationType = null;
-	
-	/**
-	 * Default constructor
-	 */
-	public EmfValidationHandler() {
-		super();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.frameworks.internal.IValidationSelectionHandler#getBaseValidationType(java.lang.Object)
-	 */
-	public IResource getBaseValidationType(Object selection) {
-		if (selection instanceof EObject) {
-			EObject eObject = (EObject) selection;
-			Resource resource = eObject.eResource();
-			IProject project = ProjectUtilities.getProject(resource);
-			return project;
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.frameworks.internal.IValidationSelectionHandler#getValidationTypeString()
-	 */
-	public String getValidationTypeString() {
-		return validationType;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.frameworks.internal.IValidationSelectionHandler#setValidationTypeString(java.lang.String)
-	 */
-	public void setValidationTypeString(String validationType) {
-		this.validationType = validationType;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/PassthruResourceSet.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/PassthruResourceSet.java
deleted file mode 100644
index 863e0dd..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/PassthruResourceSet.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.internal.emfworkbench;
-
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-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.jem.internal.util.emf.workbench.ProjectResourceSetImpl;
-import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
-
-/**
- * This ResourceSet is to be used by plugins that are currently loading to a cached ResourceSet that
- * always loads relative to the Workbench. This ResourceSet will direct the loads to the appropriate
- * Project ResourceSet. It will only load in this ResourceSet if it was unable to load via the
- * Workspace.
- * 
- * If you set want to used this ResourceSet so that the loaded resources are isolated from everyone
- * else, you should use the
- * 
- * @link PassthruResourceSet(IProject) constructor. This will load all resources locally and it will
- *       not delegate to another ProjectResourceSet. This would be equivalent to creating a
- *       ProjectResourceSet without setting any handlers.
- *  
- */
-public class PassthruResourceSet extends ProjectResourceSetImpl {
-	protected boolean isIsolated = false;
-
-	public class PassthruResourcesEList extends ResourceSetImpl.ResourcesEList {
-		public boolean add(Object object) {
-			if (object == null)
-				return false;
-			ResourceSet set = WorkbenchResourceHelperBase.getResourceSet(((Resource) object).getURI());
-			if (set != null)
-				return set.getResources().add(object);
-
-			return super.add(object);
-		}
-
-
-		public boolean addAll(Collection collection) {
-			if (collection.isEmpty())
-				return false;
-			Iterator it = collection.iterator();
-			Resource res;
-			while (it.hasNext()) {
-				res = (Resource) it.next();
-				if (!WorkbenchResourceHelperBase.cacheResource(res))
-					super.add(res);
-			}
-			return true;
-		}
-	}
-
-	public PassthruResourceSet() {
-		isIsolated = false;
-	}
-
-	/**
-	 * This constructor should only be used if you want to use this ResourceSet isolated from the
-	 * actual cached ProjectResourcSet for the passed IProject.
-	 */
-	public PassthruResourceSet(IProject project) {
-		setProject(project);
-		isIsolated = true;
-	}
-
-	public boolean isIsolated() {
-		return isIsolated;
-	}
-
-	public Resource createResource(URI uri) {
-		Resource result = WorkbenchResourceHelperBase.getExistingOrCreateResource(uri);
-		if (result == null)
-			return super.createResource(uri);
-		return result;
-	}
-
-	/**
-	 * @see org.eclipse.emf.ecore.resource.impl.ResourceSetImpl#demandCreateResource(URI)
-	 */
-	protected Resource demandCreateResource(URI uri) {
-		Resource result = WorkbenchResourceHelperBase.createResource(uri);
-		if (result == null)
-			return super.createResource(uri); //We do want to call super.createResource and not
-		// demandCreateResource
-		return result;
-	}
-
-	/*
-	 * Javadoc copied from interface.
-	 */
-	public EList getResources() {
-		if (isIsolated)
-			return super.getResources();
-		if (resources == null) {
-			resources = new PassthruResourcesEList();
-		}
-		return resources;
-	}
-
-	/**
-	 * @see org.eclipse.jem.internal.util.emf.workbench.ProjectResourceSetImpl#createResourceFromHandlers(URI)
-	 */
-	protected Resource createResourceFromHandlers(URI uri) {
-		if (!isIsolated)
-			return super.createResourceFromHandlers(uri);
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.jem.internal.util.emf.workbench.ProjectResourceSetImpl#getResourceFromHandlers(URI)
-	 */
-	protected Resource getResourceFromHandlers(URI uri) {
-		if (!isIsolated)
-			return super.getResourceFromHandlers(uri);
-		return null;
-	}
-
-	/**
-	 * @see com.ibm.etools.emf.workbench.ProjectResourceSetImpl#getEObjectFromHandlers(URI, boolean)
-	 */
-	protected EObject getEObjectFromHandlers(URI uri, boolean loadOnDemand) {
-		if (!isIsolated)
-			return super.getEObjectFromHandlers(uri, loadOnDemand);
-		return null;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/WorkbenchResourceHelper.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/WorkbenchResourceHelper.java
deleted file mode 100644
index 0ef3ce8..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/WorkbenchResourceHelper.java
+++ /dev/null
@@ -1,446 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Mar 3, 2004
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.wst.common.internal.emfworkbench;
-
-import java.io.OutputStream;
-import java.util.Map;
-
-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.IPath;
-import org.eclipse.core.runtime.Path;
-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.common.notify.impl.AdapterFactoryImpl;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.common.util.WrappedException;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.resource.URIConverter;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
-import org.eclipse.jem.util.emf.workbench.WorkbenchURIConverter;
-import org.eclipse.jem.util.plugin.JEMUtilPlugin;
-import org.eclipse.wst.common.internal.emf.resource.ReferencedResource;
-import org.eclipse.wst.common.internal.emf.resource.ReferencedXMIFactoryImpl;
-import org.eclipse.wst.common.internal.emf.utilities.ExtendedEcoreUtil;
-
-/**
- * @author schacher
- * 
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public class WorkbenchResourceHelper extends WorkbenchResourceHelperBase {
-	protected static Class REFERENCED_RES_CLASS = ReferencedResource.class;
-	private static boolean fileAdapterFactoryInitialized = false;
-
-	private static class FileAdapterFactory extends AdapterFactoryImpl {
-
-		public Adapter adaptNew(Notifier target, Object type) {
-			FileAdapter adapter = new FileAdapter();
-			adapter.setTarget(target);
-			return adapter;
-		}
-
-	}
-
-	/**
-	 * This class is internal and is used to store state on the resource, specifically, a cached
-	 * reference to the IFile
-	 */
-	private static class FileAdapter extends AdapterImpl {
-		public static final Object ADAPTER_KEY = FileAdapter.class.getName();
-		private IFile file;
-		private long synchronizationStamp;
-		protected ResourceSet previousResourceSet;
-
-		public boolean isAdapterForType(Object type) {
-			return ADAPTER_KEY.equals(type);
-		}
-
-		/*
-		 * Update the synchronization stamp where appropriate
-		 */
-		public void notifyChanged(Notification msg) {
-			switch (msg.getFeatureID(null)) {
-				case Resource.RESOURCE__IS_LOADED :
-					if (getResource().isLoaded())
-						handleLoaded();
-					else
-						handleUnloaded();
-					break;
-				case ReferencedResource.RESOURCE_WAS_SAVED :
-					handleSaved();
-					break;
-				case Resource.RESOURCE__URI :
-					handleURIChanged();
-			}
-		}
-
-		/**
-		 *  
-		 */
-		private void handleURIChanged() {
-			file = null;
-			synchronizationStamp = 0;
-		}
-
-		public IFile getFile() {
-			//First test to see if we should reset the file.
-			if (file != null && (!file.isAccessible() || previousResourceSet != getResourceSet())) {
-				file = null;
-				synchronizationStamp = 0;
-			}
-			if (file == null) {
-				if (isPlatformResourceURI(getURI())) {
-					file = getPlatformFile(getURI());
-				} else {
-					//we should not be here anymore.
-					file = internalGetFile(getResource());
-				}
-				previousResourceSet = getResourceSet();
-			}
-			return file;
-		}
-
-		/**
-		 * @return
-		 */
-		public long getSynchronizationStamp() {
-			return synchronizationStamp;
-		}
-
-		/**
-		 * @param file
-		 */
-		public void setFile(IFile file) {
-			this.file = file;
-		}
-
-		/**
-		 * @param l
-		 */
-		public void setSynchronizationStamp(long l) {
-			synchronizationStamp = l;
-		}
-
-		/**
-		 * @see ReferencedResource#isConsistent()
-		 */
-		public boolean isConsistent() {
-			if (getFile() == null || !getFile().isAccessible())
-				return true;
-			if (!getFile().isSynchronized(IResource.DEPTH_ZERO))
-				return false;
-			if (synchronizationStamp == 0)
-				return true;
-			return synchronizationStamp == computeModificationStamp(getFile());
-
-		}
-
-		public void cacheSynchronizationStamp() {
-			setSynchronizationStamp(computeModificationStamp(getFile()));
-		}
-
-		public ReferencedResource getResource() {
-			return (ReferencedResource) target;
-		}
-
-		public URI getURI() {
-			return target == null ? null : getResource().getURI();
-		}
-
-		public ResourceSet getResourceSet() {
-			return target == null ? null : getResource().getResourceSet();
-		}
-
-		public void handleUnloaded() {
-			file = null;
-			synchronizationStamp = 0;
-		}
-
-		public void handleLoaded() {
-			cacheSynchronizationStamp();
-		}
-
-		public void handleSaved() {
-			cacheSynchronizationStamp();
-		}
-	}
-
-	/**
-	 * This is an internal method to be used by the plugin only
-	 */
-	public static synchronized void initializeFileAdapterFactory() {
-		if (!fileAdapterFactoryInitialized) {
-			ReferencedXMIFactoryImpl.addGlobalAdapterFactory(new FileAdapterFactory());
-			fileAdapterFactoryInitialized = true;
-		}
-	}
-
-
-	private static FileAdapter getFileAdapter(ReferencedResource res) {
-		FileAdapter adapter = (FileAdapter) EcoreUtil.getExistingAdapter(res, FileAdapter.ADAPTER_KEY);
-		return adapter == null ? createFileAdapter(res) : adapter;
-	}
-
-	private static FileAdapter createFileAdapter(ReferencedResource res) {
-		FileAdapter adapter = new FileAdapter();
-		adapter.setTarget(res);
-		res.eAdapters().add(adapter);
-		return adapter;
-	}
-
-	/**
-	 * Return the underlying IFile for the resource if one exists. This may return null if the
-	 * resource does not belong to a ProjectResourceSet.
-	 */
-	public static IFile getFile(ReferencedResource res) {
-		FileAdapter adapter = getFileAdapter(res);
-		return adapter == null ? null : adapter.getFile();
-	}
-
-	public static long getSynchronizationStamp(ReferencedResource res) {
-		FileAdapter adapter = getFileAdapter(res);
-		return adapter == null ? 0 : adapter.getSynchronizationStamp();
-	}
-
-	public static void setSynhronizationStamp(ReferencedResource res, long stamp) {
-		FileAdapter adapter = getFileAdapter(res);
-		if (adapter != null)
-			adapter.setSynchronizationStamp(stamp);
-	}
-
-	public static boolean isConsistent(ReferencedResource res) {
-		FileAdapter adapter = getFileAdapter(res);
-		return adapter != null && adapter.isConsistent();
-	}
-
-	/**
-	 * Method cacheSynchronizationStamp.
-	 * 
-	 * @param r
-	 */
-	public static void cacheSynchronizationStamp(ReferencedResource refResource) {
-		if (refResource != null) {
-			FileAdapter adapter = getFileAdapter(refResource);
-			if (adapter != null && adapter.getSynchronizationStamp() <= 0)
-				adapter.setSynchronizationStamp(computeModificationStamp(refResource));
-		}
-	}
-
-	public static boolean isReferencedResource(Resource aResource) {
-		return REFERENCED_RES_CLASS.isInstance(aResource);
-	}
-
-	public static long computeModificationStamp(ReferencedResource resource) {
-		FileAdapter adapter = getFileAdapter(resource);
-		return adapter == null ? 0 : computeModificationStamp(adapter.getFile());
-	}
-
-	public static long computeModificationStamp(IFile file) {
-		if (file == null)
-			return 0;
-		long currentStamp = file.getModificationStamp();
-		IPath path = file.getLocation();
-		if (path != null)
-			return path.toFile().lastModified();
-		return currentStamp;
-	}
-
-	/**
-	 * Return the IFile that currently corresponds to <code>aResource</code>.
-	 */
-	public static IFile getFile(Resource aResource) {
-		if (aResource != null) {
-			if (isReferencedResource(aResource))
-				return getFile((ReferencedResource) aResource);
-			return internalGetFile(aResource);
-		}
-		return null;
-	}
-
-	public static IFile getFile(EObject obj) {
-		if (obj == null)
-			return null;
-
-		Resource mofResource = obj.eResource();
-		if (mofResource == null)
-			return null;
-		return getFile(mofResource);
-	}
-
-	/**
-	 * Get or load a cached Resource or create one if it is not found. A WrappedException will only
-	 * be thrown if the corresponding file exists but it failed to load.
-	 */
-	public static Resource getOrCreateResource(URI uri, ResourceSet set) throws WrappedException {
-		try {
-			return set.getResource(uri, true); //this will create the resource no matter what
-		} catch (WrappedException e) {
-			if (ExtendedEcoreUtil.getFileNotFoundDetector().isFileNotFound(e))
-				return set.getResource(uri, false);
-			throw e;
-		}
-	}
-
-	protected static boolean isSameProject(Resource resourceA, Resource resourceB) {
-		IProject pA, pB;
-		pA = getProject(resourceA);
-		pB = getProject(resourceB);
-		if (pA != null && pB != null)
-			return pA.equals(pB);
-		//otherwise we do not have enough info to determine false so we must return true
-		return true;
-	}
-
-	public static IProject getProject(Resource res) {
-		IProject proj = getProject(res.getResourceSet());
-		if (proj == null) {
-			IFile file = getFile(res);
-			if (file != null)
-				proj = file.getProject();
-		}
-		return proj;
-	}
-
-	/*
-	 * This method should not be called by clients. It is used internally by clients that also call
-	 * getFile(...). This is to avoid endless loops.
-	 * 
-	 * @see getFile(Resource)
-	 */
-	protected static IFile internalGetFile(Resource aResource) {
-		if (aResource != null)
-			return getFile(aResource.getResourceSet(), aResource.getURI());
-
-		return null;
-	}
-
-	protected static IFile getFile(ResourceSet set, URI uri) {
-		IFile file = getPlatformFile(uri);
-		if (file == null) {
-			if (set != null) {
-				URIConverter converter = set.getURIConverter();
-				URI convertedUri = converter.normalize(uri);
-				if (!uri.equals(convertedUri))
-					return getPlatformFile(convertedUri);
-			}
-		}
-		return file;
-	}
-
-	/**
-	 * Return the IFile for the <code>uri</code> within the Workspace. This URI is assumed to be
-	 * absolute in the following format: platform:/resource/....
-	 */
-	public static IFile getPlatformFile(URI uri) {
-		if (isPlatformResourceURI(uri)) {
-			String fileString = URI.decode(uri.path());
-			fileString = fileString.substring(JEMUtilPlugin.PLATFORM_RESOURCE.length() + 1);
-			return getWorkspace().getRoot().getFile(new Path(fileString));
-		}
-		return null;
-	}
-
-
-
-	public static IFile getFile(IProject project, URI uri) {
-		ResourceSet set = getResourceSet(project);
-		return getFile(set, uri);
-	}
-
-	/**
-	 * This should only be used if you want to save <code>aResource</code> within the IProject
-	 * that it is currently residing but you do not want to save it in the default output location.
-	 * You should not use this api to save a Resource to an existing file.
-	 * 
-	 * @deprecated This api is no longer required. You should create a resource with the absolute
-	 *             path (platform:/resource/...). Upon save, the file will be saved to this
-	 *             location.
-	 */
-	public static boolean saveResourceToFile(Resource aResource, IFile aFile) throws Exception {
-		return saveResourceToFile(aResource, aFile, null);
-	}
-
-	/**
-	 * This should only be used if you want to save <code>aResource</code> within the IProject
-	 * that it is currently residing but you do not want to save it in the default output location.
-	 * You should not use this api to save a Resource to an existing file.
-	 * 
-	 * @deprecated This api is no longer required. You should create a resource with the absolute
-	 *             path (platform:/resource/...). Upon save, the file will be saved to this
-	 *             location.
-	 */
-	public static boolean saveResourceToFile(Resource aResource, IFile aFile, Map saveOptions) throws Exception {
-		if (aResource != null && aFile != null && !aFile.exists()) {
-			ResourceSet set = aResource.getResourceSet();
-			if (set != null) {
-				URIConverter conv = set.getURIConverter();
-				if (conv != null && conv instanceof WorkbenchURIConverter) {
-					WorkbenchURIConverter wbConv = (WorkbenchURIConverter) conv;
-					String uri = aResource.getURI().toString();
-					IPath resPath, filePath;
-					resPath = new Path(uri);
-					filePath = aFile.getProjectRelativePath();
-					int resCount, fileCount;
-					resCount = resPath.segmentCount();
-					fileCount = filePath.segmentCount();
-					if (resCount <= fileCount) {
-						filePath = filePath.removeFirstSegments(fileCount - resCount);
-						if (resPath.equals(filePath)) {
-							OutputStream os = wbConv.createOutputStream(URI.createPlatformResourceURI(aFile.toString()));
-							if (os != null) {
-								try {
-									aResource.save(os, saveOptions);
-								} finally {
-									os.close();
-								}
-								return true;
-							}
-						}
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	protected static void deleteFile(IFile aFile) throws CoreException {
-		if (aFile != null && aFile.exists())
-			aFile.delete(true, null);
-	}
-
-	/**
-	 * Delete
-	 * 
-	 * @aResource in the Workbench.
-	 */
-	public static void deleteResource(Resource aResource) throws CoreException {
-		if (aResource != null)
-			deleteFile(getFile(aResource));
-	}
-
-
-
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/AdapterFactoryDescriptor.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/AdapterFactoryDescriptor.java
deleted file mode 100644
index 19ddf5b..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/AdapterFactoryDescriptor.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Feb 26, 2004
- * 
- * To change the template for this generated file go to Window&gt;Preferences&gt;Java&gt;Code
- * Generation&gt;Code and Comments
- */
-package org.eclipse.wst.common.internal.emfworkbench.edit;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.jem.util.plugin.JEMUtilPlugin;
-import org.eclipse.wst.common.frameworks.internal.AbstractRegistryDescriptor;
-import org.eclipse.wst.common.internal.emf.utilities.Assert;
-import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchEditResourceHandler;
-
-
-public class AdapterFactoryDescriptor extends AbstractRegistryDescriptor implements Comparable {
-
-	private String packageURI = null;
-	private String id = null;
-	private Set viewIDs = null;
-	private final int loadOrder;
-	private static int loadOrderCounter = 0;
-
-	public AdapterFactoryDescriptor(IConfigurationElement element) {
-		super(element);
-
-		packageURI = element.getAttribute(AdapterFactoryRegistry.PACKAGE_URI);
-		id = element.getAttribute(AdapterFactoryRegistry.ID);
-		Assert.isNotNull(packageURI, EMFWorkbenchEditResourceHandler.AdapterFactoryDescriptor_ERROR_0); //$NON-NLS-1$
-		Assert.isNotNull(id, EMFWorkbenchEditResourceHandler.getString(EMFWorkbenchEditResourceHandler.AdapterFactoryDescriptor_ERROR_1, new Object[]{element.getDeclaringExtension().getNamespace()})); //$NON-NLS-1$
-
-		readViewIDs();
-		this.loadOrder = loadOrderCounter++;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer sb = new StringBuffer();
-		sb.append("AdapterFactoryDescriptor"); //$NON-NLS-1$
-		sb.append('[');
-		sb.append(packageURI);
-		sb.append(",p"); //$NON-NLS-1$
-		sb.append(getPriority());
-		if (viewIDs != null && !viewIDs.isEmpty()) {
-			sb.append(':');
-			boolean first = true;
-			Iterator iter = viewIDs.iterator();
-			while (iter.hasNext()) {
-				if (!first)
-					sb.append(',');
-				first = false;
-				sb.append(iter.next());
-			}
-		}
-		sb.append(']');
-		return sb.toString();
-	}
-
-	private void readViewIDs() {
-		viewIDs = new HashSet(3);
-		IConfigurationElement[] children = element.getChildren(AdapterFactoryRegistry.VIEW);
-		if (children == null || children.length == 0)
-			return;
-
-		String viewID = null;
-		for (int i = 0; i < children.length; i++) {
-			viewID = children[i].getAttribute(AdapterFactoryRegistry.ID);
-			if (viewID != null)
-				viewIDs.add(viewID);
-		}
-	}
-
-	public AdapterFactory createInstance() {
-		if (element == null)
-			return null;
-
-		AdapterFactory factory = null;
-		try {
-			factory = (AdapterFactory) element.createExecutableExtension(AdapterFactoryRegistry.CLASS_NAME);
-		} catch (CoreException e) {
-			JEMUtilPlugin.getLogger().logError(e);
-			factory = null;
-		}
-		return factory;
-	}
-
-
-	public String getPackageURI() {
-		return packageURI;
-	}
-
-	public Set getViewIDs() {
-		return viewIDs;
-	}
-
-	public boolean appliesTo(String viewID) {
-		return viewIDs.isEmpty() || viewIDs.contains(viewID);
-	}
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Comparable#compareTo(java.lang.Object)
-	 */
-	public int compareTo(Object o) {
-		if (this == o)
-			return 0;
-		if (!(o instanceof AdapterFactoryDescriptor))
-			return 1;
-		AdapterFactoryDescriptor desc = (AdapterFactoryDescriptor) o;
-
-		int pCompare = getPriority() - desc.getPriority();
-		if (pCompare != 0)
-			//We have reverse the sorting of the priority for the adapter factories
-			return -pCompare;
-
-		//The group is the same - in this case the one for a specific view has precedence over
-		//a generic one
-		else if (viewIDs != null && !viewIDs.isEmpty())
-			return -1;
-		else
-			return 1;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.AbstractRegistryDescriptor#getID()
-	 */
-	public String getID() {
-		return id;
-	}
-
-
-	/**
-	 * @return Returns the loadOrder.
-	 */
-	public int getLoadOrder() {
-		return loadOrder;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/AdapterFactoryRegistry.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/AdapterFactoryRegistry.java
deleted file mode 100644
index e986962..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/AdapterFactoryRegistry.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.internal.emfworkbench.edit;
-
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeSet;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.jem.util.RegistryReader;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.internal.emfworkbench.integration.EMFWorkbenchEditPlugin;
-
-/**
- * @author mdelder
- */
-public class AdapterFactoryRegistry extends RegistryReader {
-
-	public static final String ADAPTER_FACTORY = "adapterFactory"; //$NON-NLS-1$
-
-	public static final String PACKAGE_URI = "packageURI"; //$NON-NLS-1$
-
-	public static final String CLASS_NAME = "className"; //$NON-NLS-1$
-
-	public static final String VIEW = "view"; //$NON-NLS-1$
-
-	public static final String ID = "id"; //$NON-NLS-1$
-
-	private Map descriptorMap = null;
-
-	private static AdapterFactoryRegistry instance;
-
-	private AdapterFactoryRegistry() {
-		super(EMFWorkbenchEditPlugin.ID, EMFWorkbenchEditPlugin.ADAPTER_FACTORY_REGISTRY_EXTENSION_POINT);
-	}
-
-	public List getDescriptors(EPackage pkg, String viewID) {
-		Collection all = getDescriptors(pkg);
-		if (all == null)
-			return null;
-
-		Iterator iter = all.iterator();
-		AdapterFactoryDescriptor desc = null;
-		List result = new ArrayList(all.size());
-		while (iter.hasNext()) {
-			desc = (AdapterFactoryDescriptor) iter.next();
-			if (desc.appliesTo(viewID))
-				result.add(desc);
-		}
-		return result;
-	}
-
-	public Collection getDescriptors(EPackage registeredPackage) {
-		return (Collection) getDescriptorMap().get(registeredPackage.getNsURI());
-	}
-
-	private Map getDescriptorMap() {
-		if (descriptorMap == null)
-			descriptorMap = new HashMap();
-		return descriptorMap;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.RegistryReader#readElement(org.eclipse.core.runtime.IConfigurationElement)
-	 */
-	public boolean readElement(IConfigurationElement element) {
-		try {
-			if (element.getName().equals(ADAPTER_FACTORY)) {
-				AdapterFactoryDescriptor descriptor = new AdapterFactoryDescriptor(element);
-				mapDescriptor(descriptor);
-				return true;
-			}
-		} catch (RuntimeException re) {
-			Logger.getLogger().logError(re);
-		}
-		return false;
-	}
-
-	private void mapDescriptor(AdapterFactoryDescriptor descriptor) {
-		String uri = descriptor.getPackageURI();
-		Collection descriptors = (Collection) getDescriptorMap().get(uri);
-		if (descriptors == null) {
-			descriptors = new TreeSet();
-			getDescriptorMap().put(uri, descriptors);
-		}
-		descriptors.add(descriptor);
-	}
-
-	/**
-	 * @return Returns the instance.
-	 */
-	public static AdapterFactoryRegistry instance() {
-		if (instance == null) {
-			instance = new AdapterFactoryRegistry();
-			instance.readRegistry();
-		}
-		return instance;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ChildCommand.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ChildCommand.java
deleted file mode 100644
index 6dec40e..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ChildCommand.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.internal.emfworkbench.edit;
-
-
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.wst.common.internal.emfworkbench.integration.AbstractEditModelCommand;
-import org.eclipse.wst.common.internal.emfworkbench.integration.EditModel;
-import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelCommand;
-
-/**
- * Insert the type's description here. Creation date: (05/22/01 8:57:56 AM)
- * 
- * @author: Administrator
- */
-public class ChildCommand extends EditModelCommand {
-	private ParentCommand parent;
-	private EditModelRetriever modelRetriever;
-
-	public ChildCommand(ParentCommand parentCmd, Command targetCmd, EditModelRetriever retriever) {
-		super(targetCmd);
-		parent = parentCmd;
-		modelRetriever = retriever;
-	}
-
-	public boolean canExecute() {
-		return true;
-	}
-
-	/**
-	 * Does nothing
-	 */
-	public void execute() {
-		//does nothing
-	}
-
-	protected void executeInModel(AbstractEditModelCommand cmd) {
-		EditModel model = modelRetriever.getEditModelForWrite(this);
-		try {
-			model.getCommandStack().execute(cmd);
-			model.saveIfNecessary(this);
-		} finally {
-			model.releaseAccess(this);
-		}
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (05/22/01 9:35:36 AM)
-	 * 
-	 * @return java.lang.Object
-	 */
-	public java.lang.Object getEditModelKey() {
-		return modelRetriever.getEditModelID();
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (05/22/01 9:35:36 AM)
-	 * 
-	 * @return com.ibm.etools.j2ee.workbench.ParentCommand
-	 */
-	public ParentCommand getParent() {
-		return parent;
-	}
-
-	public void redo() {
-		redoInModel();
-		getParent().redoFrom(this);
-	}
-
-	protected void redoInModel() {
-		EditModel model = modelRetriever.getEditModelForWrite(this);
-		try {
-			getTarget().redo();
-			model.saveIfNecessary(this);
-		} finally {
-			model.releaseAccess(this);
-		}
-	}
-
-	public void undo() {
-		undoInModel();
-		getParent().undoFrom(this);
-	}
-
-	protected void undoInModel() {
-		EditModel model = modelRetriever.getEditModelForWrite(this);
-		try {
-			getTarget().undo();
-			model.saveIfNecessary(this);
-		} finally {
-			model.releaseAccess(this);
-		}
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ClientAccessRegistry.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ClientAccessRegistry.java
deleted file mode 100644
index 61f9858..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ClientAccessRegistry.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Oct 6, 2003
- */
-package org.eclipse.wst.common.internal.emfworkbench.edit;
-
-import java.util.HashSet;
-import java.util.Set;
-import java.util.WeakHashMap;
-
-import org.eclipse.jem.internal.util.emf.workbench.nls.EMFWorkbenchResourceHandler;
-import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchEditResourceHandler;
-
-/**
- * @author mdelder
- */
-public class ClientAccessRegistry {
-
-	protected final WeakHashMap registry = new WeakHashMap();
-	protected final Set baseSet = new HashSet();
-
-	public synchronized void access(Object accessorKey) {
-		if (isStable()) {
-			if (!registry.containsKey(accessorKey)) {
-				Snapshot snapshot = new Snapshot();
-				this.registry.put(accessorKey, snapshot);
-				this.baseSet.add(snapshot);
-
-			} else
-				throw new ClientAccessRegistryException(EMFWorkbenchEditResourceHandler.ClientAccessRegistry_ERROR_0, accessorKey); //$NON-NLS-1$
-
-		} else
-			complain();
-	}
-
-	public synchronized void release(Object accessorKey) {
-
-		/*
-		 * Error condition: Some one has been naughty and not released the resource
-		 */
-		if (this.registry.containsKey(accessorKey) && isStable()) {
-			Snapshot snapshot = (Snapshot) this.registry.remove(accessorKey);
-			this.baseSet.remove(snapshot);
-		} else
-			complain(accessorKey);
-	}
-
-	public synchronized void assertAccess(Object accessorKey) {
-		if (!isClientAccessing(accessorKey))
-			throw new ClientAccessRegistryException(EMFWorkbenchResourceHandler.getString("ClientAccessRegistry_ERROR_1"), accessorKey); //$NON-NLS-1$
-	}
-
-	public synchronized boolean isClientAccessing(Object client) {
-		boolean result = this.registry.containsKey(client);
-		if (!isStable())
-			complain();
-		return result;
-	}
-
-	public synchronized boolean isAnyClientAccessing() {
-		boolean result = this.registry.size() > 0;
-		if (!isStable())
-			complain();
-		return result;
-	}
-
-	public synchronized boolean isStable() {
-		return this.baseSet.size() == this.registry.size();
-	}
-
-	public void complain() {
-		complain(null);
-	}
-
-	public void complain(Object accessorKey) {
-		if (!isStable())
-			throw new ClientAccessRegistryException(this.registry, this.baseSet);
-		throw new ClientAccessRegistryException(EMFWorkbenchResourceHandler.getString("ClientAccessRegistry_ERROR_1"), accessorKey); //$NON-NLS-1$
-	}
-
-	public String toString() {
-		StringBuffer result = new StringBuffer("ClientAccessRegistry: ["); //$NON-NLS-1$
-		result.append((isStable()) ? "STABLE" : "OUT OF SYNC"); //$NON-NLS-1$ //$NON-NLS-2$
-		result.append("]: Reference Count = "); //$NON-NLS-1$
-		result.append(this.size());
-		return result.toString();
-	}
-
-	public synchronized int size() {
-		return this.registry.size();
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ClientAccessRegistryException.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ClientAccessRegistryException.java
deleted file mode 100644
index 9844b9b..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ClientAccessRegistryException.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Oct 2, 2003
- *  
- */
-package org.eclipse.wst.common.internal.emfworkbench.edit;
-
-import java.io.PrintStream;
-import java.io.PrintWriter;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.WeakHashMap;
-
-import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchEditResourceHandler;
-
-
-/**
- * The ClientAccessRegistryException accepts a WeakHashSet registry and a Set of all Snapshots that
- * should be contained in the registry. It will perform the necessary set difference in order to
- * determine which Snapshots exist in the baseSet but not in the registry.
- * 
- * @author mdelder
- */
-public class ClientAccessRegistryException extends RuntimeException {
-
-	public static final int UNKNOWN = 0;
-	public static final int DANGLING_REFERENCE = 1;
-	public static final int INVALID_ACCESS_KEY = 2;
-	private WeakHashMap registry = null;
-	private Set baseSet = null;
-	private boolean processed = false;
-	private int type = UNKNOWN;
-
-	public ClientAccessRegistryException(WeakHashMap registry, Set baseSet) {
-		this.registry = registry;
-		this.baseSet = new HashSet();
-		this.baseSet.addAll(baseSet);
-		this.type = DANGLING_REFERENCE;
-	}
-
-	public ClientAccessRegistryException(String msg, Object key) {
-		super(msg + " : " + key); //$NON-NLS-1$
-		this.type = INVALID_ACCESS_KEY;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Throwable#printStackTrace(java.io.PrintStream)
-	 */
-	public void printStackTrace(PrintStream s) {
-
-		s.println(toString());
-		super.printStackTrace(s);
-
-		if (this.registry != null) {
-			Snapshot snapshot = null;
-			if (!processed) {
-				Object key = null;
-				Iterator keyIterator = this.registry.keySet().iterator();
-				while (keyIterator.hasNext()) {
-					key = keyIterator.next();
-					snapshot = (Snapshot) this.registry.get(key);
-					this.baseSet.remove(snapshot);
-				}
-				processed = true;
-			}
-			s.println(EMFWorkbenchEditResourceHandler.getString(EMFWorkbenchEditResourceHandler.ClientAccessRegistryException_UI_0, new Object[]{new Integer(baseSet.size()).toString()})); //$NON-NLS-1$
-
-			for (Iterator possibleCulpritsItr = baseSet.iterator(); possibleCulpritsItr.hasNext();) {
-				snapshot = (Snapshot) possibleCulpritsItr.next();
-				snapshot.printStackTrace(s);
-			}
-
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Throwable#printStackTrace(java.io.PrintWriter)
-	 */
-	public void printStackTrace(PrintWriter s) {
-
-		s.println(toString());
-		super.printStackTrace(s);
-		if (this.registry != null) {
-			Snapshot snapshot = null;
-			if (!processed) {
-				Object key = null;
-				Iterator keyIterator = this.registry.keySet().iterator();
-				while (keyIterator.hasNext()) {
-					key = keyIterator.next();
-					snapshot = (Snapshot) this.registry.get(key);
-					this.baseSet.remove(snapshot);
-				}
-				processed = true;
-			}
-			s.println(EMFWorkbenchEditResourceHandler.getString("", new Object[]{new Integer(baseSet.size()).toString()})); //$NON-NLS-1$
-
-			for (Iterator possibleCulpritsItr = baseSet.iterator(); possibleCulpritsItr.hasNext();) {
-				snapshot = (Snapshot) possibleCulpritsItr.next();
-				snapshot.printStackTrace(s);
-			}
-
-		}
-	}
-
-	public String getType() {
-		switch (type) {
-			case DANGLING_REFERENCE :
-				return "DANGLING_REFERENCE"; //$NON-NLS-1$
-			case INVALID_ACCESS_KEY :
-				return "INVALID_ACCESS_KEY"; //$NON-NLS-1$
-			default :
-				return "UNKNOWN"; //$NON-NLS-1$
-		}
-	}
-
-	public String toString() {
-		StringBuffer result = new StringBuffer(super.toString()).append("\r\n"); //$NON-NLS-1$
-		result.append(EMFWorkbenchEditResourceHandler.getString(EMFWorkbenchEditResourceHandler.ClientAccessRegistryException_UI_1, new Object[]{getType()})); //$NON-NLS-1$
-		//		if (this.badReferenceLocation != null) {
-		//			result.append("The invalid access occurred somewhere in the following stack
-		// trace.").append("\n");
-		//			result.append(this.badReferenceLocation.getStackTraceString());
-		//		}
-		return result.toString();
-	}
-
-	public static void main(String[] args) {
-		System.out.println(new ClientAccessRegistryException("test message", "-somekeyobj-").toString()); //$NON-NLS-1$ //$NON-NLS-2$
-		System.out.println("LINEBREAK"); //$NON-NLS-1$
-		System.out.println(new ClientAccessRegistryException(new WeakHashMap(), new HashSet()).toString());
-		System.out.println("LINEBREAK"); //$NON-NLS-1$
-		new ClientAccessRegistryException("test message", "-somekeyobj-").printStackTrace(); //$NON-NLS-1$ //$NON-NLS-2$
-		System.out.println("LINEBREAK"); //$NON-NLS-1$
-		new ClientAccessRegistryException(new WeakHashMap(), new HashSet()).printStackTrace();
-
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EMFWorkbenchEditContextFactory.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EMFWorkbenchEditContextFactory.java
deleted file mode 100644
index 7131dae..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EMFWorkbenchEditContextFactory.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Mar 3, 2004
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.wst.common.internal.emfworkbench.edit;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.jem.internal.util.emf.workbench.EMFWorkbenchContextFactory;
-import org.eclipse.jem.util.emf.workbench.EMFWorkbenchContextBase;
-import org.eclipse.jem.util.emf.workbench.ResourceSetWorkbenchSynchronizer;
-import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
-import org.eclipse.wst.common.internal.emfworkbench.integration.ResourceSetWorkbenchEditSynchronizer;
-
-/**
- * @author schacher
- * 
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public class EMFWorkbenchEditContextFactory extends EMFWorkbenchContextFactory {
-	/**
-	 *  
-	 */
-	public EMFWorkbenchEditContextFactory() {
-		super();
-	}
-
-	protected EMFWorkbenchContextBase primCreateEMFContext(IProject aProject) {
-		return new EMFWorkbenchContext(aProject);
-	}
-
-	public ResourceSetWorkbenchSynchronizer createSynchronizer(ResourceSet aResourceSet, IProject aProject) {
-		return new ResourceSetWorkbenchEditSynchronizer(aResourceSet, aProject);
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelExtension.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelExtension.java
deleted file mode 100644
index 6041def..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelExtension.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Feb 18, 2004
- * 
- * To change the template for this generated file go to Window&gt;Preferences&gt;Java&gt;Code
- * Generation&gt;Code and Comments
- */
-package org.eclipse.wst.common.internal.emfworkbench.edit;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.frameworks.internal.ConfigurationElementWrapper;
-
-
-public class EditModelExtension extends ConfigurationElementWrapper {
-	public static final String ID_ATTR = "id"; //$NON-NLS-1$
-
-	private String editModelID = null;
-	private Collection resources = null;
-	private String id = null;
-
-
-	public EditModelExtension(IConfigurationElement element) {
-		super(element);
-		init();
-	}
-
-	private void init() {
-		id = element.getAttribute(ID_ATTR);
-		if (id == null) {
-			Logger.getLogger().logError("Incorrect usage of editModelExtension extension point.  Element must contain id attribute.  Plugin: " + getPluginId()); //$NON-NLS-1$
-			return;
-		}
-
-		editModelID = element.getAttribute(EditModelExtensionRegistry.EDIT_MODEL_ID_ATTR);
-		resources = new ArrayList();
-		IConfigurationElement[] editModelResources = element.getChildren(EditModelResource.EDIT_MODEL_RESOURCE_ELEMENT);
-		for (int j = 0; j < editModelResources.length; j++)
-			resources.add(new EditModelResource(editModelResources[j], id));
-	}
-
-	/**
-	 * @return
-	 */
-	public String getEditModelID() {
-		return editModelID;
-	}
-
-
-	/**
-	 * @return
-	 */
-	public Collection getResources() {
-		return resources;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelExtensionRegistry.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelExtensionRegistry.java
deleted file mode 100644
index 47bc51b..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelExtensionRegistry.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.internal.emfworkbench.edit;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jem.util.RegistryReader;
-import org.eclipse.wst.common.internal.emfworkbench.integration.EMFWorkbenchEditPlugin;
-
-
-/**
- * @author mdelder
- */
-class EditModelExtensionRegistry extends RegistryReader {
-
-	private static EditModelExtensionRegistry INSTANCE = null;
-
-	public static final String EDIT_MODEL_EXT_ELEMENT = "editModelExtension"; //$NON-NLS-1$
-	public static final String EDIT_MODEL_ID_ATTR = "editModelID"; //$NON-NLS-1$
-	public static final String GROUP_ID_ATTR = "functionGroupID"; //$NON-NLS-1$
-
-
-	private Map extensions = null;
-
-	protected EditModelExtensionRegistry() {
-		super(EMFWorkbenchEditPlugin.ID, EMFWorkbenchEditPlugin.EDIT_MODEL_EXTENSION_REGISTRY_EXTENSION_POINT);
-	}
-
-	public static EditModelExtensionRegistry getInstance() {
-		if (INSTANCE == null) {
-			INSTANCE = new EditModelExtensionRegistry();
-			INSTANCE.readRegistry();
-		}
-		return INSTANCE;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.RegistryReader#readElement(org.eclipse.core.runtime.IConfigurationElement)
-	 */
-	public boolean readElement(IConfigurationElement element) {
-
-		boolean result = false;
-		Collection extensionsByID = null;
-		EditModelExtension editModelExtension = null;
-		if (element.getName().equals(EDIT_MODEL_EXT_ELEMENT)) {
-			editModelExtension = new EditModelExtension(element);
-			extensionsByID = (Collection) getExtensions().get(editModelExtension.getEditModelID());
-			if (extensionsByID == null) {
-				extensionsByID = new ArrayList();
-				getExtensions().put(editModelExtension.getEditModelID(), extensionsByID);
-			}
-			extensionsByID.add(editModelExtension);
-			result = true;
-		}
-		return result;
-	}
-
-	protected Map getExtensions() {
-		if (extensions == null)
-			extensions = new HashMap();
-		return extensions;
-	}
-
-	/**
-	 * @return
-	 */
-	public Collection getEditModelResources(Object editModelID) {
-		//TODO - Cache the resources
-		Collection editModelResources = new ArrayList();
-		Collection editModelExtensions = (Collection) getExtensions().get(editModelID);
-
-		if (editModelExtensions == null || editModelExtensions.size() == 0)
-			return Collections.EMPTY_LIST;
-		Iterator itr = editModelExtensions.iterator();
-		while (itr.hasNext()) {
-			EditModelExtension ext = (EditModelExtension) itr.next();
-			editModelResources.addAll(ext.getResources());
-		}
-		return (!editModelExtensions.isEmpty()) ? editModelResources : Collections.EMPTY_LIST;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelRegistry.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelRegistry.java
deleted file mode 100644
index 0b88fa6..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelRegistry.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.internal.emfworkbench.edit;
-
-
-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 java.util.TreeSet;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jem.util.RegistryReader;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
-import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchEditResourceHandler;
-import org.eclipse.wst.common.internal.emfworkbench.integration.EMFWorkbenchEditPlugin;
-import org.eclipse.wst.common.internal.emfworkbench.integration.EditModel;
-import org.eclipse.wst.common.internal.emfworkbench.integration.IEditModelFactory;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject;
-import org.eclipse.wst.common.project.facet.core.IProjectFacet;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-
-/**
- * @author mdelder
- */
-public class EditModelRegistry extends RegistryReader {
-
-	private final static EditModelRegistry INSTANCE =  new EditModelRegistry();
-
-	private final Map factoryConfigurations = new HashMap();
-	private static boolean initialized = false;
-	
-
-	public static final String EDIT_MODEL_ELEMENT = "editModel"; //$NON-NLS-1$
-	public static final String EDIT_MODEL_ID_ATTR = "editModelID"; //$NON-NLS-1$
-	public static final String FACTORY_CLASS_ATTR = "factoryClass"; //$NON-NLS-1$
-	public static final String PARENT_MODEL_ATTR = "parentModelID"; //$NON-NLS-1$
-
-
-
-	public static final String LOAD_UNKNOWN_RESOURCES_ATTR = "loadUnknownResourcesAsReadOnly"; //$NON-NLS-1$
-
-	protected EditModelRegistry() {
-		super(EMFWorkbenchEditPlugin.ID, EMFWorkbenchEditPlugin.EDIT_MODEL_FACTORIES_EXTENSION_POINT);
-	}
-
-	public static EditModelRegistry getInstance() {
-		if(isInitialized()) 
-			return INSTANCE;
-		synchronized(INSTANCE) {
-			if(!isInitialized()) {
-				INSTANCE.readRegistry();
-				initialized = true;
-			}
-		} 
-		return INSTANCE;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.RegistryReader#readElement(org.eclipse.core.runtime.IConfigurationElement)
-	 */
-	public boolean readElement(IConfigurationElement element) {
-		/*
-		 * The EditModel Extension Point defines Configuration elements named "editModel" with
-		 * attributes "editModelID" and "factoryClass"
-		 */
-		boolean result = false;
-		if (element.getName().equals(EDIT_MODEL_ELEMENT)) {
-			String editModelID = element.getAttribute(EDIT_MODEL_ID_ATTR);
-			if (editModelID != null) {
-				this.factoryConfigurations.put(editModelID, new EditModelInfo(editModelID, element));
-				result = true;
-			}
-		}
-		return result;
-	}
-
-	public String getCacheID(String editModelID, Map params) {
-		IEditModelFactory factory = getEditModelFactoryByKey(editModelID);
-		return factory.getCacheID(editModelID, params);
-	}
-
-	public EditModel createEditModelForRead(String editModelID, EMFWorkbenchContext context, Map params) {
-		return getEditModelFactoryByKey(editModelID).createEditModelForRead(editModelID, context, params);
-	}
-
-	public EditModel createEditModelForWrite(String editModelID, EMFWorkbenchContext context, Map params) {
-		return getEditModelFactoryByKey(editModelID).createEditModelForWrite(editModelID, context, params);
-	}
-
-	public Collection getEditModelResources(String editModelID) {
-		Collection resources = new TreeSet();
-
-		EditModelInfo nextEditModelInfo = (EditModelInfo) factoryConfigurations.get(editModelID);
-
-		String parentModelID = null;
-		Map visitedEditModels = new HashMap();
-		/* collect the resources from the parents */
-		while (nextEditModelInfo != null && (parentModelID = nextEditModelInfo.getParentModelID()) != null) {
-			if (visitedEditModels.containsKey(parentModelID))
-				throw new IllegalStateException(EMFWorkbenchEditResourceHandler.getString(EMFWorkbenchEditResourceHandler.EditModelRegistry_ERROR_0, new Object[]{editModelID})); //$NON-NLS-1$
-			visitedEditModels.put(parentModelID, null);
-			resources.addAll(getAllEditModelResources(parentModelID));
-			nextEditModelInfo = (EditModelInfo) factoryConfigurations.get(parentModelID);
-		}
-
-		/* Get the resources for the actual edit model id */
-		resources.addAll(getAllEditModelResources(editModelID));
-
-		return resources;
-	}
-	
-	public IEditModelFactory findEditModelFactoryByKey(Object editModelID) {
-		IEditModelFactory factory = null;
-		EditModelInfo editMdlInfo = (EditModelInfo) factoryConfigurations.get(editModelID);
-		if (editMdlInfo != null)
-			factory = editMdlInfo.getEditModelFactory();
-		return factory; 
-	}
-	
-	public IEditModelFactory findEditModelFactoryByProject(IProject project) {
-		IFacetedProject facetedProject = null;
-		try {
-			facetedProject = ProjectFacetsManager.create(project);
-		} catch (Exception e) {
-			return null;
-		}
-		if (facetedProject == null) return null;
-		Iterator keys = factoryConfigurations.keySet().iterator();
-		while (keys.hasNext()) {
-			Object key = keys.next();
-			if (key instanceof String) {
-				try {
-					IProjectFacet projectFacet = ProjectFacetsManager.getProjectFacet((String)key);
-					if (projectFacet != null && facetedProject.hasProjectFacet(projectFacet))
-						return findEditModelFactoryByKey(key);
-				} catch (Exception e) {
-					continue;
-				}
-				
-			}
-		}
-		
-		return null;
-	}
-
-	protected Collection getAllEditModelResources(String editModelID) {
-		Collection resources = new ArrayList();
-		resources.addAll(getLocalEditModelResources(editModelID));
-		resources.addAll(getExtendedEditModelResources(editModelID));
-		return resources;
-	}
-
-	protected Collection getLocalEditModelResources(String editModelID) {
-		EditModelInfo editMdlInfo = (EditModelInfo) factoryConfigurations.get(editModelID);
-		return (editMdlInfo != null) ? editMdlInfo.getEditModelResources() : Collections.EMPTY_LIST;
-	}
-
-	protected Collection getExtendedEditModelResources(String editModelID) {
-		return EditModelExtensionRegistry.getInstance().getEditModelResources(editModelID);
-	}
-
-	/**
-	 * @param editModelKey
-	 *            the editModelID of a given EditModelFactory defined in the Extension Point
-	 * @throws IllegalArgumentException
-	 *             if a IEditModelFactory cannot be found for the given ID.
-	 * @return the EditModelFactory associated with a given EditModelID
-	 */
-	protected IEditModelFactory getEditModelFactoryByKey(Object editModelID) {
-		IEditModelFactory factory = null;
-		EditModelInfo editMdlInfo = (EditModelInfo) factoryConfigurations.get(editModelID);
-		if (editMdlInfo != null)
-			factory = editMdlInfo.getEditModelFactory();
-		else
-			throw new IllegalArgumentException(EMFWorkbenchEditResourceHandler.getString(EMFWorkbenchEditResourceHandler.EditModelRegistry_ERROR_2, new Object[]{editModelID})); //$NON-NLS-1$
-
-		return factory;
-	}
-	
-	
-
-	public class EditModelInfo {
-
-		private String editModelID = null;
-		private IConfigurationElement configurationElement = null;
-
-		private IEditModelFactory factory = null;
-		private List editModelResources = null;
-
-		private String parentModelID = null;
-
-		private String tostringCache = null;
-
-		public EditModelInfo(String editModelID, IConfigurationElement configurationElement) {
-
-			this.configurationElement = configurationElement;
-			this.editModelID = editModelID;
-			this.parentModelID = this.configurationElement.getAttribute(PARENT_MODEL_ATTR);
-		}
-
-
-		public List getEditModelResources() {
-			/* this method is guarded */
-			initializeResources();
-			return editModelResources;
-		}
-
-		public IEditModelFactory getEditModelFactory() {
-			if (this.factory == null) {
-				if (this.configurationElement != null) {
-					try {
-						this.factory = (IEditModelFactory) this.configurationElement.createExecutableExtension(FACTORY_CLASS_ATTR);
-						String loadUnknownResourceAsReadOnly = this.configurationElement.getAttribute(LOAD_UNKNOWN_RESOURCES_ATTR);
-						Boolean value = loadUnknownResourceAsReadOnly != null ? Boolean.valueOf(loadUnknownResourceAsReadOnly) : Boolean.FALSE;
-						this.factory.setLoadKnownResourcesAsReadOnly(value.booleanValue());
-						discardConfigurationElementIfNecessary();
-					} catch (CoreException e) {
-						Logger.getLogger(EMFWorkbenchEditPlugin.ID).logError(e);
-					}
-				} else {
-					Logger.getLogger().logError(EMFWorkbenchEditResourceHandler.EditModelRegistry_ERROR_1); //$NON-NLS-1$
-				}
-			}
-			return this.factory;
-		}
-
-		private void initializeResources() {
-
-			if (editModelResources == null) {
-				if (configurationElement != null) {
-
-					editModelResources = new ArrayList();
-
-					IConfigurationElement[] resources = configurationElement.getChildren(EditModelResource.EDIT_MODEL_RESOURCE_ELEMENT);
-					for (int j = 0; j < resources.length; j++)
-						editModelResources.add(new EditModelResource(resources[j]));
-
-					discardConfigurationElementIfNecessary();
-				} else {
-					editModelResources = Collections.EMPTY_LIST;
-				}
-			}
-		}
-
-		private void discardConfigurationElementIfNecessary() {
-			if (this.editModelResources != null && this.factory != null)
-				this.configurationElement = null;
-		}
-
-		public String toString() {
-			if (tostringCache == null)
-				tostringCache = "EditModelID: {" + this.editModelID + "}, Parent Model ID {" + this.parentModelID + "}, Configuration Element: [" + this.configurationElement + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$//$NON-NLS-4$
-			return tostringCache;
-		}
-
-		/**
-		 * @return Returns the parentModelID.
-		 */
-		public String getParentModelID() {
-			return parentModelID;
-		}
-
-	}
-	/**
-	 * @return Returns the initialized.
-	 */
-	protected static boolean isInitialized() {
-		return initialized;
-	}
-	
-	public String[] getRegisteredEditModelIDs() {
-		return (String[]) factoryConfigurations.keySet().toArray(new String[factoryConfigurations.keySet().size()]);
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelResource.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelResource.java
deleted file mode 100644
index b5543ac..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelResource.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- **************************************************************************************************/
-/*
- * Created on Feb 5, 2004
- * 
- * To change the template for this generated file go to Window&gt;Preferences&gt;Java&gt;Code
- * Generation&gt;Code and Comments
- */
-package org.eclipse.wst.common.internal.emfworkbench.edit;
-
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.wst.common.frameworks.internal.AbstractRegistryDescriptor;
-
-
-
-public class EditModelResource extends AbstractRegistryDescriptor implements Comparable {
-	public static final String EDIT_MODEL_URI_ATTR = "URI"; //$NON-NLS-1$
-	public static final String AUTO_LOAD_ATTR = "autoload"; //$NON-NLS-1$
-	public static final String EDIT_MODEL_RESOURCE_ELEMENT = "editModelResource"; //$NON-NLS-1$
-
-	private static int loadOrderCounter = 1;
-	private URI uri;
-	private boolean autoload = false;
-	//Indicates if this was defined as part of the edit model,
-	//as opposed to an extension
-	private boolean isCore = true;
-
-	private String extensionID;
-
-	private int loadOrder;
-
-	public EditModelResource(IConfigurationElement element) {
-		super(element);
-		String strUri = element.getAttribute(EDIT_MODEL_URI_ATTR);
-		if (strUri != null)
-			EditModelResource.this.uri = URI.createURI(strUri);
-
-		String strLoad = element.getAttribute(AUTO_LOAD_ATTR);
-		if (strLoad != null)
-			autoload = Boolean.valueOf(strLoad).booleanValue();
-		loadOrder = loadOrderCounter++;
-	}
-
-	public EditModelResource(IConfigurationElement element, String extensionID) {
-		this(element);
-		this.extensionID = extensionID;
-		isCore = false;
-	}
-
-	public URI getURI() {
-		return uri;
-	}
-
-	public boolean isAutoLoad() {
-		return autoload;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.AbstractRegistryDescriptor#getID()
-	 */
-	public String getID() {
-		return extensionID;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.AbstractRegistryDescriptor#getPriority()
-	 */
-	public int getPriority() {
-		if (isCore)
-			return 0;
-		return super.getPriority();
-	}
-
-	/**
-	 * return whether this resource is defined as part of the edit model definition as opposed to an
-	 * extension
-	 */
-	public boolean isCore() {
-		return isCore;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Comparable#compareTo(java.lang.Object)
-	 */
-	public int compareTo(Object o) {
-		if (!(o instanceof EditModelResource))
-			return 1;
-		EditModelResource res = (EditModelResource) o;
-		int value = getPriority() - res.getPriority();
-		if (value == 0)
-			return loadOrder - res.loadOrder;
-		return value;
-	}
-
-	/**
-	 * @return Returns the loadOrder.
-	 */
-	public int getLoadOrder() {
-		return loadOrder;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelRetriever.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelRetriever.java
deleted file mode 100644
index 8efb8c1..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelRetriever.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emfworkbench.edit;
-
-import java.util.Map;
-
-import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
-import org.eclipse.wst.common.internal.emfworkbench.integration.EditModel;
-
-
-
-public class EditModelRetriever {
-	private EMFWorkbenchContext context;
-	private String editModelID;
-	private Map editModelParms;
-
-	/**
-	 * EditModelRetriever constructor comment.
-	 */
-	public EditModelRetriever(EMFWorkbenchContext context, String editModelKey, Map parms) {
-		super();
-		this.context = context;
-		editModelID = editModelKey;
-		editModelParms = parms;
-	}
-
-	public EditModel getEditModelForRead(Object accessorKey) {
-		return context.getEditModelForRead(getEditModelID(), accessorKey, editModelParms);
-	}
-
-	public EditModel getEditModelForWrite(Object accessorKey) {
-		return context.getEditModelForWrite(getEditModelID(), accessorKey, editModelParms);
-	}
-
-	public String getEditModelID() {
-		return editModelID;
-	}
-
-	public EMFWorkbenchContext context() {
-		return context;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ExtendedComposedAdapterFactory.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ExtendedComposedAdapterFactory.java
deleted file mode 100644
index 8f26cf3..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ExtendedComposedAdapterFactory.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Dec 3, 2003
- * 
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.wst.common.internal.emfworkbench.edit;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.jem.util.logger.proxy.Logger;
-
-/**
- * @author schacher
- * 
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public class ExtendedComposedAdapterFactory extends ComposedAdapterFactory {
-
-	/**
-	 * @param adapterFactory
-	 */
-	public ExtendedComposedAdapterFactory(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * @param adapterFactories
-	 */
-	public ExtendedComposedAdapterFactory(AdapterFactory[] adapterFactories) {
-		super(adapterFactories);
-	}
-
-	/**
-	 * @param adapterFactories
-	 */
-	public ExtendedComposedAdapterFactory(Collection adapterFactories) {
-		super(adapterFactories);
-	}
-
-	/*
-	 * overrode from the super class, changed not to check supertypes of the EObject, because that
-	 * will be handled by the DynamicAdapterFactory
-	 * 
-	 * @see org.eclipse.emf.common.notify.AdapterFactory#adapt(org.eclipse.emf.common.notify.Notifier,
-	 *      java.lang.Object)
-	 */
-	public Adapter adapt(Notifier target, Object type) {
-		Adapter result = null;
-
-		if (target instanceof EObject) {
-			EObject eObject = (EObject) target;
-			EClass eClass = eObject.eClass();
-			if (eClass != null) {
-				EPackage ePackage = eClass.getEPackage();
-				Collection types = new ArrayList();
-				types.add(ePackage);
-				if (type != null) {
-					types.add(type);
-				}
-				/* when an error occurs, remove the delegate and try again */
-				boolean attemptAdaptAgain = true;
-				while (result == null && attemptAdaptAgain) {
-					attemptAdaptAgain = false;
-					AdapterFactory delegateAdapterFactory = getFactoryForTypes(types);
-					if (delegateAdapterFactory != null) {
-						try {
-							result = delegateAdapterFactory.adapt(target, type);
-						} catch (RuntimeException re) {
-							Logger.getLogger().logError(re);
-							adapterFactories.remove(delegateAdapterFactory);
-							attemptAdaptAgain = true;
-						}
-					}
-				}
-			}
-		} else {
-			result = adapt(target, type, new HashSet(), target.getClass());
-		}
-
-		return result;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/InvertedCommand.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/InvertedCommand.java
deleted file mode 100644
index 2bbcb11..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/InvertedCommand.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.internal.emfworkbench.edit;
-
-
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.wst.common.internal.emfworkbench.integration.AbstractEditModelCommand;
-import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelCommand;
-
-/**
- * Insert the type's description here. Creation date: (05/22/01 8:58:24 AM)
- * 
- * @author: Administrator
- */
-public class InvertedCommand extends AbstractEditModelCommand {
-	public InvertedCommand(Command targetCommand) {
-		super(targetCommand);
-	}
-
-	public boolean canExecute() {
-		return getTarget().canUndo();
-	}
-
-	public boolean canUndo() {
-		return getTarget().canExecute();
-	}
-
-	/**
-	 * Does nothing
-	 */
-	public void execute() {
-		//does nothing
-	}
-
-	/**
-	 * getEditModelCommand method comment.
-	 */
-	public EditModelCommand getEditModelCommand() {
-		return ((AbstractEditModelCommand) getTarget()).getEditModelCommand();
-	}
-
-	protected int inversionDepth() {
-		if (getEditModelCommand() == getTarget())
-			return 1;
-		return ((InvertedCommand) getTarget()).inversionDepth() + 1;
-	}
-
-	protected String labelPrefix() {
-		return inversionDepth() % 2 == 1 ? "Undo " : "Redo ";//$NON-NLS-2$//$NON-NLS-1$
-	}
-
-	public void redo() {
-		getTarget().undo();
-	}
-
-	public void undo() {
-		getTarget().redo();
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ParentCommand.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ParentCommand.java
deleted file mode 100644
index 9c7dc90..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ParentCommand.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emfworkbench.edit;
-
-
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.wst.common.internal.emfworkbench.integration.AbstractEditModelCommand;
-import org.eclipse.wst.common.internal.emfworkbench.integration.ComposedEditModel;
-import org.eclipse.wst.common.internal.emfworkbench.integration.EditModel;
-import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelCommand;
-
-/**
- * Insert the type's description here. Creation date: (05/22/01 8:57:38 AM)
- * 
- * @author: Administrator
- */
-public class ParentCommand extends EditModelCommand {
-	private List children;
-	private ComposedEditModel editModel;
-	private List affectedModels;
-
-	public ParentCommand(Command targetCommand, ComposedEditModel anEditModel) {
-		super(targetCommand);
-		editModel = anEditModel;
-		children = new ArrayList(1);
-	}
-
-	public boolean canExecute() {
-		return getTarget().canExecute();
-	}
-
-	protected void computeAffectedModels() {
-		ResourceSet set = null;
-		List editModels = getEditModel().getChildren();
-		Iterator it = computeAffectedResourceSets().iterator();
-		while (it.hasNext()) {
-			set = (ResourceSet) it.next();
-			for (int i = 0; i < editModels.size(); i++) {
-				EditModel model = (EditModel) editModels.get(i);
-				if (model.getResourceSet() == set) {
-					getAffectedModels().add(new EditModelRetriever(model.getEmfContext(), model.getEditModelID(), model.getParams()));
-					continue;
-				}
-			}
-		}
-	}
-
-	protected Set computeAffectedResourceSets() {
-		Iterator objects = getTarget().getAffectedObjects().iterator();
-		Set resourceSets = new HashSet();
-		Object o = null;
-		EObject ref = null;
-		ResourceSet set = null;
-		while (objects.hasNext()) {
-			o = objects.next();
-			if (!(o instanceof EObject))
-				continue;
-			ref = (EObject) o;
-			if (ref.eResource() != null) {
-				set = ref.eResource().getResourceSet();
-				if (set != null)
-					resourceSets.add(set);
-			}
-		}
-		return resourceSets;
-	}
-
-	protected ChildCommand createChildCommand(EditModelRetriever retriever) {
-		return new ChildCommand(this, getTarget(), retriever);
-	}
-
-	public void execute() {
-		getTarget().execute();
-		computeAffectedModels();
-		pushChildrenForExecute();
-	}
-
-	protected void executeInModel(AbstractEditModelCommand cmd) {
-		getEditModel().getCommandStack().execute(cmd);
-	}
-
-	protected List getAffectedModels() {
-		if (affectedModels == null)
-			affectedModels = new ArrayList(1);
-		return affectedModels;
-	}
-
-	protected List getChildren() {
-		return children;
-	}
-
-	protected ComposedEditModel getEditModel() {
-		return editModel;
-	}
-
-	protected void invertChildren() {
-		invertChildrenExcept((ChildCommand) null);
-	}
-
-	protected void invertChildrenExcept(ChildCommand caller) {
-		for (int i = 0; i < children.size(); i++) {
-			ChildCommand childCmd = (ChildCommand) children.get(i);
-			if (caller == null || childCmd != caller)
-				childCmd.invertAndPush();
-		}
-	}
-
-	protected void invertFrom(ChildCommand caller) {
-		invertAndPush();
-		invertChildrenExcept(caller);
-	}
-
-	protected void pushChildrenForExecute() {
-		for (int i = 0; i < getAffectedModels().size(); i++) {
-			EditModelRetriever retriever = (EditModelRetriever) getAffectedModels().get(i);
-			ChildCommand command = createChildCommand(retriever);
-			getChildren().add(command);
-			command.executeInModel(command);
-		}
-	}
-
-	public void redo() {
-		getTarget().redo();
-		invertChildren();
-	}
-
-	public void redoFrom(ChildCommand child) {
-		invertFrom(child);
-	}
-
-	public void undo() {
-		getTarget().undo();
-		invertChildren();
-	}
-
-	public void undoFrom(ChildCommand child) {
-		invertFrom(child);
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ReadOnlyClientAccessRegistry.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ReadOnlyClientAccessRegistry.java
deleted file mode 100644
index 116e5b0..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ReadOnlyClientAccessRegistry.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- *******************************************************************************/
-package org.eclipse.wst.common.internal.emfworkbench.edit;
-
-import org.eclipse.jem.internal.util.emf.workbench.nls.EMFWorkbenchResourceHandler;
-import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchEditResourceHandler;
-
-/**
- * This is a readonly version of the editmodel access registry, only uses a weak hash dictionary,
- * and because the access is read only, is less concerned with timing of access/release, and will be
- * cleaned up on garbage collection if needed.
- * 
- */
-public class ReadOnlyClientAccessRegistry extends ClientAccessRegistry {
-
-	public ReadOnlyClientAccessRegistry() {
-		super();
-	}
-
-	public synchronized void access(Object accessorKey) {
-		if (!registry.containsKey(accessorKey)) {
-			this.registry.put(accessorKey, null);
-		} else
-			throw new ClientAccessRegistryException(EMFWorkbenchEditResourceHandler.ClientAccessRegistry_ERROR_0, accessorKey); //$NON-NLS-1$
-	}
-
-	public synchronized void release(Object accessorKey) {
-
-		/*
-		 * Error condition: Some one has been naughty and not released the resource
-		 */
-		if (this.registry.containsKey(accessorKey)) {
-			this.registry.remove(accessorKey);
-		} else
-			complain(accessorKey);
-	}
-
-	public void complain(Object accessorKey) {
-
-		throw new ClientAccessRegistryException(EMFWorkbenchResourceHandler.getString("ClientAccessRegistry_ERROR_1"), accessorKey); //$NON-NLS-1$
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/Snapshot.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/Snapshot.java
deleted file mode 100644
index f42201c..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/Snapshot.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Oct 3, 2003
- *
- */
-package org.eclipse.wst.common.internal.emfworkbench.edit;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-
-import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchEditResourceHandler;
-
-
-/**
- * The Snapshot is used to remember the call stack trace of any method that accesses a Resource.
- * 
- * @author mdelder
- */
-public class Snapshot extends RuntimeException {
-
-	public Snapshot() {
-		super(EMFWorkbenchEditResourceHandler.Snapshot_ERROR_0); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Throwable#printStackTrace()
-	 */
-	public String getStackTraceString() {
-		StringWriter writer = new StringWriter();
-		PrintWriter printWriter = new PrintWriter(writer);
-		super.printStackTrace(printWriter);
-		return writer.toString();
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/WrappingCommandStack.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/WrappingCommandStack.java
deleted file mode 100644
index bf15371..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/WrappingCommandStack.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emfworkbench.edit;
-
-
-
-import org.eclipse.emf.common.command.BasicCommandStack;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.wst.common.internal.emfworkbench.integration.ComposedEditModel;
-
-/**
- * Insert the type's description here. Creation date: (05/21/01 9:31:02 PM)
- * 
- * @author: Administrator
- */
-public class WrappingCommandStack extends BasicCommandStack {
-	private ComposedEditModel editModel;
-
-	/**
-	 * WrappingCommandStack constructor comment.
-	 */
-	public WrappingCommandStack(ComposedEditModel anEditModel) {
-		super();
-		editModel = anEditModel;
-	}
-
-	public void execute(Command command) {
-		ParentCommand parent = new ParentCommand(command, editModel);
-		super.execute(parent);
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/AbstractEditModelCommand.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/AbstractEditModelCommand.java
deleted file mode 100644
index 7061e7d..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/AbstractEditModelCommand.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emfworkbench.integration;
-
-
-
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.wst.common.internal.emfworkbench.edit.InvertedCommand;
-
-
-public abstract class AbstractEditModelCommand extends AbstractCommand {
-	private Command target;
-	private AbstractEditModelCommand owner;
-
-	protected AbstractEditModelCommand() {
-		super();
-	}
-
-	public AbstractEditModelCommand(Command targetCommand) {
-		super();
-		target = targetCommand;
-	}
-
-	public abstract EditModelCommand getEditModelCommand();
-
-	protected AbstractEditModelCommand getOutermostCommand() {
-		return owner == null ? this : owner.getOutermostCommand();
-	}
-
-	protected Command getOwner() {
-		return owner;
-	}
-
-	public Command getTarget() {
-		return target;
-	}
-
-	/**
-	 * Creates a new inverted command on the outermost command
-	 */
-	public InvertedCommand inverted() {
-		AbstractEditModelCommand outer = getOutermostCommand();
-		InvertedCommand cmd = new InvertedCommand(outer);
-		outer.setOwner(cmd);
-		return cmd;
-	}
-
-	protected void setOwner(AbstractEditModelCommand ownerCommand) {
-		owner = ownerCommand;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ComposedAccessorKey.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ComposedAccessorKey.java
deleted file mode 100644
index 70cac1e..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ComposedAccessorKey.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emfworkbench.integration;
-
-
-
-/**
- * @author Administrator
- * 
- *  
- */
-public class ComposedAccessorKey {
-
-	private Object accessorKey = null;
-	private Object addonKey = null;
-
-
-	public static ComposedAccessorKey getComposedAccessorKey(Object accessorKey, ComposedEditModel editModel) {
-		ComposedAccessorKey newKey = new ComposedAccessorKey(accessorKey, editModel);
-		editModel.cacheAccessorKey(newKey);
-		return newKey;
-	}
-
-
-	private ComposedAccessorKey(Object accessorKey, Object addonKey) {
-		this.accessorKey = accessorKey;
-		this.addonKey = addonKey;
-	}
-
-	public boolean equals(Object other) {
-		if (other == null || !(other instanceof ComposedAccessorKey))
-			return false;
-		ComposedAccessorKey otherKey = (ComposedAccessorKey) other;
-
-		return accessorKey.equals(otherKey.accessorKey) && addonKey.equals(otherKey.addonKey);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return accessorKey.hashCode() ^ addonKey.hashCode();
-	}
-
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ComposedEditModel.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ComposedEditModel.java
deleted file mode 100644
index fa92e3d..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ComposedEditModel.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.internal.emfworkbench.integration;
-
-
-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.core.runtime.IProgressMonitor;
-import org.eclipse.emf.common.command.BasicCommandStack;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.wst.common.frameworks.internal.operations.IOperationHandler;
-import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
-import org.eclipse.wst.common.internal.emfworkbench.edit.WrappingCommandStack;
-
-/**
- * Insert the type's description here. Creation date: (05/21/01 8:26:32 PM)
- * 
- * @author: Administrator
- */
-public class ComposedEditModel extends EditModel implements EditModelListener {
-
-	private List children = null;
-	private Map childrenMap = null;
-	private List cachedKeys = new ArrayList();
-
-	/**
-	 * ComposedEditModel constructor comment.
-	 */
-	public ComposedEditModel(String editModelID, EMFWorkbenchContext context) {
-		super(editModelID, context, false);
-	}
-
-
-	public void createChildrenIfNecessary(ComposedAccessorKey composedAccessorKey) {
-		//do nothing
-	}
-
-	/**
-	 * @param newKey
-	 */
-	public void cacheAccessorKey(ComposedAccessorKey newKey) {
-		if (!cachedKeys.contains(newKey))
-			cachedKeys.add(newKey);
-	}
-
-	public void dispose() {
-		disposing = true;
-		if (commandStack != null)
-			commandStack.removeCommandStackListener(this);
-		if (hasListeners())
-			notifyListeners(new EditModelEvent(EditModelEvent.PRE_DISPOSE, this));
-		releasePreloadResources();
-		releaseIdentifiers();
-		emfContext = null;
-		listeners = null;
-		removedListeners = null;
-		resources = null;
-		disposing = false;
-		project = null;
-		cachedKeys = new ArrayList();
-	}
-
-	public EditModel.Reference addChild(String editModelID, Map params, Object accessorKey) {
-		return addChild(editModelID, params, ComposedAccessorKey.getComposedAccessorKey(accessorKey, this));
-	}
-
-	public EditModel.Reference addChild(String editModelID, Map params, ComposedAccessorKey composedAccessorKey) {
-
-		EditModel editModel = getEmfContext().getEditModelForWrite(editModelID, composedAccessorKey, params);
-		editModel.addListener(this);
-
-		getChildrenMap().put(editModel.getReference(), editModel);
-		getChildren().add(editModel);
-
-		return editModel.getReference();
-	}
-
-	public void removeChild(EditModel.Reference reference, Object accessorKey) {
-		ComposedAccessorKey composedAccessorKey = ComposedAccessorKey.getComposedAccessorKey(accessorKey, this);
-		EditModel editModel = (EditModel) getChildrenMap().remove(reference);
-		if (editModel != null) {
-			editModel.releaseAccess(composedAccessorKey);
-			editModel.removeListener(this);
-			getChildren().remove(editModel);
-		}
-	}
-
-	public Iterator getContainedReferences() {
-		return getChildrenMap().keySet().iterator();
-	}
-
-	public EditModel getContainedEditModel(EditModel.Reference reference) {
-		return (EditModel) getChildrenMap().get(reference);
-	}
-
-	/**
-	 * Return the CommandStack.
-	 */
-	protected BasicCommandStack createCommandStack() {
-		return new WrappingCommandStack(this);
-	}
-
-	/**
-	 * Forward all events to the listeners for this model
-	 */
-	public void editModelChanged(EditModelEvent anEvent) {
-		if (hasListeners())
-			notifyListeners(anEvent);
-	}
-
-	public Set getAffectedFiles() {
-		Set aSet = new HashSet();
-		List models = getChildren();
-		for (int i = 0; i < models.size(); i++) {
-			EditModel child = (EditModel) models.get(i);
-			aSet.addAll(child.getAffectedFiles());
-		}
-		return aSet;
-	}
-
-	public List getChildren() {
-		if (children == null)
-			children = new ArrayList();
-		return children;
-	}
-
-	protected Map getChildrenMap() {
-		if (childrenMap == null)
-			childrenMap = new HashMap();
-		return childrenMap;
-	}
-
-	/**
-	 * Pass along to children.
-	 */
-	protected void handleSaveIfNecessaryDidNotSave(IProgressMonitor monitor) {
-		List list = getChildren();
-		EditModel editModel;
-		for (int i = 0; i < list.size(); i++) {
-			editModel = (EditModel) list.get(i);
-			editModel.handleSaveIfNecessaryDidNotSave(monitor);
-		}
-	}
-
-	/**
-	 * Return whether a save is needed on the CommandStack
-	 */
-	public boolean isDirty() {
-		Iterator editModels = getChildren().iterator();
-		while (editModels.hasNext()) {
-			EditModel editModel = (EditModel) editModels.next();
-			if (editModel.isDirty())
-				return true;
-		}
-		return false;
-	}
-
-	public boolean isReadOnly() {
-		return false;
-	}
-
-	/**
-	 * Return whether a save is needed on the CommandStack
-	 */
-	public boolean isInterrestedInResource(Resource aResource) {
-		Iterator editModels = getChildren().iterator();
-		while (editModels.hasNext()) {
-			EditModel editModel = (EditModel) editModels.next();
-			if (editModel.isInterrestedInResource(aResource))
-				return true;
-		}
-		return false;
-	}
-
-	public void primSave(IProgressMonitor monitor) {
-		List list = getChildren();
-		for (int i = 0; i < list.size(); i++)
-			((EditModel) list.get(i)).primSave(monitor);
-	}
-
-	/**
-	 * This only increments the reference count of the children and should only be called if you
-	 * know what you are doing.
-	 */
-	public void access(Object accessorKey) {
-		ComposedAccessorKey composedAccessorKey = ComposedAccessorKey.getComposedAccessorKey(accessorKey, this);
-		if (getChildren().size() == 0) {
-			createChildrenIfNecessary(composedAccessorKey);
-		} else {
-
-			List tempchildren = getChildren();
-			for (int i = 0; i < tempchildren.size(); i++) {
-				EditModel model = (EditModel) tempchildren.get(i);
-				model.access(composedAccessorKey);
-			}
-		}
-		// removing for defect 1978, children should do all the accessing
-		super.access(accessorKey);
-
-	}
-
-	/**
-	 * This method should be called from each client when they are finished working with the
-	 * EditModel.
-	 */
-	public void releaseAccess(Object accessorKey) {
-		List tempchildren = getChildren();
-		ComposedAccessorKey composedAccessorKey = ComposedAccessorKey.getComposedAccessorKey(accessorKey, this);
-		for (int i = 0; i < tempchildren.size(); i++) {
-			EditModel model = (EditModel) tempchildren.get(i);
-			model.releaseAccess(composedAccessorKey);
-		}
-		removeKeyFromCache(composedAccessorKey);
-		// Removing this call... Children should be able to handle all releasing defect 1978
-		super.releaseAccess(accessorKey);
-	}
-
-	public void removeKeyFromCache(ComposedAccessorKey key) {
-		cachedKeys.remove(key);
-	}
-
-	/**
-	 * If one should save, they all should save.
-	 */
-	protected boolean shouldSave() {
-		List list = getChildren();
-		EditModel editModel;
-		for (int i = 0; i < list.size(); i++) {
-			editModel = (EditModel) list.get(i);
-			if (editModel.shouldSave())
-				return true;
-		}
-		return false;
-	}
-
-	/**
-	 * If one should save, they all should save.
-	 */
-	protected boolean shouldSave(IOperationHandler operationHandler) {
-		List list = getChildren();
-		EditModel editModel;
-		for (int i = 0; i < list.size(); i++) {
-			editModel = (EditModel) list.get(i);
-			if (editModel.shouldSave(operationHandler))
-				return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @see com.ibm.etools.j2ee.workbench.EditModel#getNonResourceFiles()
-	 */
-	public List getNonResourceFiles() {
-		List list = getChildren();
-		List result = new ArrayList();
-		EditModel editModel;
-		for (int i = 0; i < list.size(); i++) {
-			editModel = (EditModel) list.get(i);
-			List files = editModel.getNonResourceFiles();
-			if (files != null && !files.isEmpty())
-				result.addAll(files);
-		}
-		return result;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/CompoundingCommandStack.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/CompoundingCommandStack.java
deleted file mode 100644
index 188a889..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/CompoundingCommandStack.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Nov 26, 2003
- *
- * To change the template for this generated file go to
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
-package org.eclipse.wst.common.internal.emfworkbench.integration;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CommandStack;
-import org.eclipse.emf.common.command.CommandStackListener;
-
-
-/**
- * @author DABERG
- * 
- * This class does not actually execute any commands. It merely gathers the commands to be executed
- * and compounds them so that they can be executed against the actualCommandStack.
- */
-public class CompoundingCommandStack implements CommandStack {
-	private CommandStack actualCommandStack;
-	private Command compoundCommand;
-
-	/**
-	 *  
-	 */
-	public CompoundingCommandStack(CommandStack actualCommandStack) {
-		this.actualCommandStack = actualCommandStack;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.CommandStack#execute(org.eclipse.emf.common.command.Command)
-	 */
-	public void execute(Command command) {
-		if (compoundCommand == null)
-			compoundCommand = command;
-		else
-			compoundCommand = compoundCommand.chain(command);
-	}
-
-	public void performExecution() {
-		if (compoundCommand != null) {
-			try {
-				actualCommandStack.execute(compoundCommand);
-			} finally {
-				compoundCommand = null;
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.CommandStack#canUndo()
-	 */
-	public boolean canUndo() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.CommandStack#undo()
-	 */
-	public void undo() {
-		//default
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.CommandStack#canRedo()
-	 */
-	public boolean canRedo() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.CommandStack#getUndoCommand()
-	 */
-	public Command getUndoCommand() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.CommandStack#getRedoCommand()
-	 */
-	public Command getRedoCommand() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.CommandStack#getMostRecentCommand()
-	 */
-	public Command getMostRecentCommand() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.CommandStack#redo()
-	 */
-	public void redo() {
-		//redo
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.CommandStack#flush()
-	 */
-	public void flush() {
-		//flush
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.CommandStack#addCommandStackListener(org.eclipse.emf.common.command.CommandStackListener)
-	 */
-	public void addCommandStackListener(CommandStackListener listener) {
-		//default
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.CommandStack#removeCommandStackListener(org.eclipse.emf.common.command.CommandStackListener)
-	 */
-	public void removeCommandStackListener(CommandStackListener listener) {
-		//default
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/DynamicAdapterFactory.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/DynamicAdapterFactory.java
deleted file mode 100644
index 77085d8..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/DynamicAdapterFactory.java
+++ /dev/null
@@ -1,642 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Dec 1, 2003
- * 
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.wst.common.internal.emfworkbench.integration;
-
-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.resources.IProject;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
-import org.eclipse.emf.common.notify.impl.NotificationImpl;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.edit.provider.ChangeNotifier;
-import org.eclipse.emf.edit.provider.IChangeNotifier;
-import org.eclipse.emf.edit.provider.IDisposable;
-import org.eclipse.emf.edit.provider.INotifyChangedListener;
-import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;
-import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.frameworks.internal.enablement.EnablementIdentifier;
-import org.eclipse.wst.common.frameworks.internal.enablement.EnablementIdentifierEvent;
-import org.eclipse.wst.common.frameworks.internal.enablement.EnablementManager;
-import org.eclipse.wst.common.frameworks.internal.enablement.IEnablementIdentifier;
-import org.eclipse.wst.common.frameworks.internal.enablement.IEnablementIdentifierListener;
-import org.eclipse.wst.common.frameworks.internal.enablement.IEnablementManager;
-import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchEditResourceHandler;
-import org.eclipse.wst.common.internal.emfworkbench.edit.AdapterFactoryDescriptor;
-import org.eclipse.wst.common.internal.emfworkbench.edit.AdapterFactoryRegistry;
-import org.eclipse.wst.common.internal.emfworkbench.edit.ExtendedComposedAdapterFactory;
-
-/**
- * @author schacher
- * 
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public class DynamicAdapterFactory implements AdapterFactory, IChangeNotifier, IDisposable, INotifyChangedListener, IEnablementIdentifierListener {
-
-	private static final AdapterFactory NULL_FACTORY = new AdapterFactoryImpl();
-
-	private ResourceItemProviderAdapterFactory resourceItemProviderAdapterFactory = null;
-
-	private String viewID;
-
-	//Each of the two maps below are keyed by the project
-	private Map adapterFactoriesByPackage;
-
-	private Map adapterFactoriesByType;
-
-	private Set allFactories;
-
-	/**
-	 * This is used to implement {@link IChangeNotifier}
-	 */
-	protected ChangeNotifier changeNotifier = new ChangeNotifier();
-
-	private boolean respectingActivities = false;
-
-	protected static final Object NO_PROJECT = "NO_PROJECT"; //$NON-NLS-1$
-
-	/**
-	 */
-	public DynamicAdapterFactory(String viewID, boolean respectActivies) {
-		this.viewID = viewID;
-		this.respectingActivities = respectActivies;
-		initialize();
-	}
-
-	/**
-	 */
-	public DynamicAdapterFactory(String viewID) {
-		this.viewID = viewID;
-		initialize();
-	}
-
-	private void initialize() {
-		adapterFactoriesByPackage = new HashMap();
-		adapterFactoriesByType = new HashMap();
-		allFactories = new HashSet();
-	}
-
-	public boolean isFactoryForType(Object type) {
-		return getFactoryForType(type) != null;
-	}
-
-	private AdapterFactory getFactoryForType(Object type) {
-
-		if (type == null)
-			return null;
-
-		if (type instanceof EObject)
-			return getFactoryForType((EObject) type);
-
-		Object aProject = ProjectUtilities.getProject(type);
-		if (aProject == null)
-			aProject = NO_PROJECT;
-		AdapterFactory factory = getExistingFactoryForType(aProject, type);
-		if (factory == NULL_FACTORY)
-			return null;
-		else if (factory == null) {
-			factory = findFactoryForType(aProject, type);
-
-			if (factory == null)
-				addAdapterFactory(aProject, type, NULL_FACTORY);
-			else
-				addAdapterFactory(aProject, type, factory);
-		}
-		return factory;
-	}
-
-	private AdapterFactory getExistingFactoryForType(Object p, Object type) {
-		if (p == null)
-			return null;
-		Map aMap = (Map) adapterFactoriesByType.get(p);
-		if (aMap == null)
-			return null;
-		return (AdapterFactory) adapterFactoriesByType.get(type);
-	}
-
-	/*
-	 * The factory was not cached by type, so we will search the cache of factories for the project
-	 * and see if it can be found there
-	 */
-	private AdapterFactory findFactoryForType(Object project, Object type) {
-		if (project == null)
-			return null;
-		Map aMap = (Map) adapterFactoriesByPackage.get(project);
-		if (aMap == null)
-			return null;
-		Iterator iter = aMap.values().iterator();
-		AdapterFactory factory = null;
-		while (iter.hasNext()) {
-			factory = (AdapterFactory) iter.next();
-			if (factory.isFactoryForType(type))
-				return factory;
-		}
-
-		// adapt the resource to its contents
-		if (getResourceItemProviderAdapterFactory().isFactoryForType(type))
-			return getResourceItemProviderAdapterFactory();
-		return null;
-	}
-
-	private AdapterFactory getFactoryForType(EObject obj) {
-		EClass eClass = obj.eClass();
-		if (eClass == null)
-			return null;
-
-		EPackage ePackage = eClass.getEPackage();
-		Object aProject = ProjectUtilities.getProject(obj);
-		if (aProject == null)
-			aProject = NO_PROJECT;
-		AdapterFactory result = getFactoryForPackage(aProject, ePackage);
-
-		if (result == null) {
-			Set failedPackageSet = new HashSet();
-			failedPackageSet.add(ePackage);
-			Iterator supertypes = eClass.getEAllSuperTypes().iterator();
-			while (supertypes.hasNext()) {
-				eClass = (EClass) supertypes.next();
-				if (eClass != null) {
-					ePackage = eClass.getEPackage();
-					if (failedPackageSet.add(ePackage)) {
-						result = getFactoryForPackage(aProject, ePackage);
-						if (result != null)
-							break;
-					}
-				}
-			}
-		}
-		return result;
-	}
-
-	private AdapterFactory getFactoryForPackage(Object aProject, EPackage aPackage) {
-		if (aProject == null || aPackage == null)
-			return null;
-		AdapterFactory factory = getExistingFactoryForPackage(aProject, aPackage);
-		if (factory == NULL_FACTORY)
-			return null;
-		else if (factory == null) {
-			try {
-				factory = createAdapterFactory(aProject, aPackage);
-
-				if (factory == null)
-					addAdapterFactory(aProject, aPackage, NULL_FACTORY);
-				else
-					addAdapterFactory(aProject, aPackage, factory);
-			} catch (RuntimeException re) {
-				Logger.getLogger().logError(re);
-			}
-		}
-		return factory;
-	}
-
-	private AdapterFactory getFactoryForTypes(Object p, List types) {
-		Map aMap = (Map) adapterFactoriesByPackage.get(p);
-		if (aMap == null)
-			return adaptResourceTypes(types);
-
-		Iterator factories = aMap.values().iterator();
-		AdapterFactory factory = null;
-		while (factories.hasNext()) {
-			factory = (AdapterFactory) factories.next();
-			if (isFactoryForAllTypes(factory, types)) {
-				return factory;
-			}
-		}
-
-
-		return null;
-	}
-
-	private AdapterFactory adaptResourceTypes(List types) {
-		//      adapt the resource to its contents
-		if (isFactoryForAllTypes(getResourceItemProviderAdapterFactory(), types))
-			return getResourceItemProviderAdapterFactory();
-		return null;
-	}
-
-	private void removeFactoryForTypes(Object p, List types) {
-		Map aMap = (Map) adapterFactoriesByPackage.get(p);
-		if (aMap == null)
-			return;
-		Iterator factories = aMap.values().iterator();
-		AdapterFactory factory = null;
-		while (factories.hasNext()) {
-			factory = (AdapterFactory) factories.next();
-			if (isFactoryForAllTypes(factory, types)) {
-				aMap.remove(factory);
-			}
-		}
-
-	}
-
-	private boolean isFactoryForAllTypes(AdapterFactory factory, List types) {
-		for (int i = 0; i < types.size(); i++) {
-			if (!factory.isFactoryForType(types.get(i))) {
-				return false;
-			}
-		}
-		return true;
-
-	}
-
-	private AdapterFactory getExistingFactoryForPackage(Object p, EPackage aPackage) {
-		if (p == null)
-			return null;
-		Map aMap = (Map) adapterFactoriesByPackage.get(p);
-		if (aMap == null)
-			return null;
-		return (AdapterFactory) aMap.get(aPackage);
-	}
-
-	private void addAdapterFactory(Object p, EPackage aPackage, AdapterFactory adapterFactory) {
-		Map aMap = getOrCreateMap(p, adapterFactoriesByPackage);
-
-		aMap.put(aPackage, adapterFactory);
-
-		if (adapterFactory == NULL_FACTORY)
-			return;
-
-		if (adapterFactory instanceof IChangeNotifier) {
-			((IChangeNotifier) adapterFactory).addListener(this);
-		}
-		allFactories.add(adapterFactory);
-	}
-
-	private Map getOrCreateMap(Object p, Map container) {
-		Map aMap = (Map) container.get(p);
-		if (aMap == null) {
-			aMap = new HashMap(10);
-			container.put(p, aMap);
-		}
-		return aMap;
-	}
-
-	private void addAdapterFactory(Object p, Object type, AdapterFactory adapterFactory) {
-		Map aMap = getOrCreateMap(p, adapterFactoriesByType);
-		aMap.put(type, adapterFactory);
-
-		if (adapterFactory == NULL_FACTORY)
-			return;
-
-		if (adapterFactory instanceof IChangeNotifier) {
-			((IChangeNotifier) adapterFactory).addListener(this);
-		}
-		allFactories.add(adapterFactory);
-	}
-
-	public Object adapt(Object target, Object type) {
-		Object adapter = target;
-		if (target instanceof Notifier) {
-			adapter = adapt((Notifier) target, type);
-		}
-
-		if (!(type instanceof Class) || (((Class) type).isInstance(adapter))) {
-			return adapter;
-		}
-
-		return null;
-	}
-
-	public Adapter adapt(Notifier target, Object type) {
-		Adapter result = null;
-
-		if (target instanceof EObject)
-			result = adapt((EObject) target, type);
-		else {
-			Object p = ProjectUtilities.getProject(target);
-			if (p == null)
-				p = NO_PROJECT;
-			result = adapt(p, target, type, new HashSet(), target.getClass());
-
-		}
-
-		return result;
-	}
-
-	public Adapter adapt(EObject target, Object type) {
-
-		EClass eClass = target.eClass();
-		if (eClass == null)
-			return null;
-
-		EPackage ePackage = eClass.getEPackage();
-		Adapter result = adapt(target, ePackage, type);
-
-		if (result == null) {
-			Set failedPackageSet = new HashSet();
-			failedPackageSet.add(ePackage);
-			Iterator supertypes = eClass.getEAllSuperTypes().iterator();
-			while (supertypes.hasNext()) {
-				eClass = (EClass) supertypes.next();
-				if (eClass != null) {
-					ePackage = eClass.getEPackage();
-					if (failedPackageSet.add(ePackage)) {
-						result = adapt(target, ePackage, type);
-						if (result != null)
-							break;
-					}
-				}
-			}
-		}
-		return result;
-	}
-
-	private Adapter adapt(EObject target, EPackage ePackage, Object type) {
-		Object aProject = ProjectUtilities.getProject(target);
-		if (aProject == null)
-			aProject = NO_PROJECT;
-		AdapterFactory delegate = getFactoryForPackage(aProject, ePackage);
-		if (delegate != null && delegate.isFactoryForType(type)) {
-			return delegate.adapt(target, type);
-		}
-
-		return null;
-	}
-
-	/*
-	 * Code borrowed from {@link ComposedAdapterFactory}
-	 *  
-	 */
-	private Adapter adapt(Object p, Notifier target, Object type, Collection failedPackages, Class javaClass) {
-		if (p == null)
-			return null;
-
-		Adapter result = null;
-
-		Package javaPackage = javaClass.getPackage();
-		if (failedPackages.add(javaPackage)) {
-			List types = new ArrayList(2);
-			types.add(javaPackage);
-			if (type != null) {
-				types.add(type);
-			}
-
-			/* when an error occurs, remove the delegate and try again */
-			boolean attemptAdaptAgain = true;
-			while (result == null && attemptAdaptAgain) {
-				attemptAdaptAgain = false;
-
-				AdapterFactory delegateAdapterFactory = getFactoryForTypes(p, types);
-				if (delegateAdapterFactory != null) {
-					try {
-						result = delegateAdapterFactory.adapt(target, type);
-					} catch (RuntimeException re) {
-						Logger.getLogger().logError(re);
-						removeFactoryForTypes(p, types);
-						attemptAdaptAgain = true;
-					}
-				}
-			}
-		}
-
-		if (result == null) {
-			Class superclass = javaClass.getSuperclass();
-			if (superclass != null) {
-				result = adapt(p, target, type, failedPackages, javaClass.getSuperclass());
-			}
-			if (result == null) {
-				Class[] interfaces = javaClass.getInterfaces();
-				for (int i = 0; i < interfaces.length; ++i) {
-					result = adapt(p, target, type, failedPackages, interfaces[i]);
-					if (result != null) {
-						break;
-					}
-				}
-			}
-		}
-
-		return result;
-	}
-
-	public Adapter adaptNew(Notifier target, Object type) {
-
-		AdapterFactory factory = getFactoryForType(target);
-
-		if (factory != null)
-			return factory.adaptNew(target, type);
-		return null;
-	}
-
-	public void adaptAllNew(Notifier target) {
-
-		AdapterFactory factory = getFactoryForType(target);
-
-		if (factory != null)
-			factory.adaptAllNew(target);
-
-	}
-
-	public void addListener(INotifyChangedListener notifyChangedListener) {
-		changeNotifier.add(notifyChangedListener);
-	}
-
-	public void removeListener(INotifyChangedListener notifyChangedListener) {
-		changeNotifier.remove(notifyChangedListener);
-	}
-
-	public void fireNotifyChanged(Notification notification) {
-		if (changeNotifier == null || changeNotifier.isEmpty() || changeNotifier.get(0) == null)
-			return;
-		changeNotifier.fireNotifyChanged(notification);
-	}
-
-	public void dispose() {
-		Iterator iter = allFactories.iterator();
-		Object factory = null;
-		while (iter.hasNext()) {
-			factory = iter.next();
-			disposeFactory(factory);
-		}
-		for (Iterator itr = getEnablementIdentifiers().iterator(); itr.hasNext();) {
-			((IEnablementIdentifier) itr.next()).removeIdentifierListener(this);
-		}
-		if (resourceItemProviderAdapterFactory != null)
-			resourceItemProviderAdapterFactory.removeListener(this);
-	}
-
-	private void disposeFactory(Object factory) {
-		if (factory instanceof IDisposable) {
-			((IDisposable) factory).dispose();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.INotifyChangedListener#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		//Foward the notification on to all my listeners
-		fireNotifyChanged(notification);
-	}
-
-	/**
-	 * @param project
-	 */
-	private void removeAdapterFactories(Object project) {
-		adapterFactoriesByType.remove(project);
-		Map aMap = (Map) adapterFactoriesByPackage.remove(project);
-		if (aMap == null)
-			return;
-
-		Iterator factories = aMap.values().iterator();
-		Object adapterFactory;
-		while (factories.hasNext()) {
-			adapterFactory = factories.next();
-			allFactories.remove(adapterFactory);
-			disposeFactory(adapterFactory);
-		}
-	}
-
-	private AdapterFactory createAdapterFactory(Object project, EPackage ePackage) {
-		if (ePackage == null)
-			throw new IllegalArgumentException(EMFWorkbenchEditResourceHandler.DynamicAdapterFactory_ERROR_0); //$NON-NLS-1$
-
-		return createAdapterFactory(project, AdapterFactoryRegistry.instance().getDescriptors(ePackage, viewID));
-
-	}
-
-	private AdapterFactory createAdapterFactory(Object project, List descriptors) {
-		if (descriptors == null || descriptors.isEmpty())
-			return null;
-
-		AdapterFactory fact = null;
-		IEnablementIdentifier identifier = null;
-		AdapterFactoryDescriptor desc = null;
-		if (descriptors.size() == 1) {
-			desc = (AdapterFactoryDescriptor) descriptors.get(0);
-			identifier = getIdentifier(project, desc);
-			addListenerIfNecessary(identifier);
-			if (project.equals(NO_PROJECT) || (identifier != null && identifier.isEnabled()))
-				return desc.createInstance();
-			return null;
-		}
-		List factories = new ArrayList(descriptors.size());
-		for (int i = 0; i < descriptors.size(); i++) {
-			desc = (AdapterFactoryDescriptor) descriptors.get(i);
-			identifier = getIdentifier(project, desc);
-			addListenerIfNecessary(identifier);
-			if (project.equals(NO_PROJECT) || (identifier != null && identifier.isEnabled())) {
-				fact = desc.createInstance();
-				if (fact != null)
-					factories.add(fact);
-			}
-		}
-		if (factories.isEmpty())
-			return null;
-
-		return new ExtendedComposedAdapterFactory(factories);
-	}
-
-	/**
-	 * @param project
-	 * @param desc
-	 * @return
-	 */
-	private IEnablementIdentifier getIdentifier(Object project, AdapterFactoryDescriptor desc) {
-		IEnablementIdentifier identifier = null;
-		if (isRespectingActivities() && project instanceof IProject)
-			identifier = IEnablementManager.INSTANCE.getIdentifier(desc.getID(), (IProject) project);
-		else if (project instanceof IProject)
-			identifier = EnablementManager.INSTANCE.getIdentifier(desc.getID(), (IProject) project);
-		return identifier;
-	}
-
-	/**
-	 * @return
-	 */
-	private boolean isRespectingActivities() {
-		return respectingActivities;
-	}
-
-	protected void addListenerIfNecessary(IEnablementIdentifier identifier) {
-		if (identifier == null)
-			return;
-		identifier.addIdentifierListener(this);
-		getEnablementIdentifiers().add(identifier);
-	}
-
-	protected boolean isListeningTo(IEnablementIdentifier identifier) {
-		return getEnablementIdentifiers().contains(identifier);
-	}
-
-	/**
-	 * @return Returns the enablementIdentifiers.
-	 */
-	protected Set getEnablementIdentifiers() {
-		if (enablementIdentifiers == null)
-			enablementIdentifiers = new HashSet();
-		return enablementIdentifiers;
-	}
-
-	private Set enablementIdentifiers;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.enablement.IEnablementIdentifierListener#identifierChanged(org.eclipse.wst.common.frameworks.internal.enablement.EnablementIdentifierEvent)
-	 */
-	public void identifierChanged(EnablementIdentifierEvent identifierEvent) {
-		if (identifierEvent.hasEnabledChanged() || identifierEvent.hasFunctionGroupIdsChanged()) {
-			Object project = ((EnablementIdentifier) identifierEvent.getIdentifier()).getProject();
-			if (project != null) {
-				removeAdapterFactories(project);
-				/*
-				 * final Notifier notifier = (Notifier) getCachedRoots().get(project);
-				 */
-				/* force a viewer refresh */
-				notifyChanged(new NotificationImpl(Notification.ADD, null, null) {
-
-					/*
-					 * (non-Javadoc)
-					 * 
-					 * @see org.eclipse.emf.common.notify.impl.NotificationImpl#getNotifier()
-					 */
-					public Object getNotifier() {
-						return null; // notifier;
-					}
-				});
-			}
-			/* else replace entire structure */
-		}
-	}
-
-	/**
-	 * @return Returns the resourceItemProviderAdapterFactory.
-	 */
-	public ResourceItemProviderAdapterFactory getResourceItemProviderAdapterFactory() {
-		if (resourceItemProviderAdapterFactory == null) {
-			resourceItemProviderAdapterFactory = new ResourceItemProviderAdapterFactory();
-			resourceItemProviderAdapterFactory.addListener(this);
-		}
-		return resourceItemProviderAdapterFactory;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EMFWorkbenchEditPlugin.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EMFWorkbenchEditPlugin.java
deleted file mode 100644
index e32854b..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EMFWorkbenchEditPlugin.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.internal.emfworkbench.integration;
-
-import java.io.FileNotFoundException;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdapterManager;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.emf.common.util.WrappedException;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
-import org.eclipse.wst.common.internal.emf.utilities.ExtendedEcoreUtil;
-import org.eclipse.wst.common.internal.emfworkbench.EMFAdapterFactory;
-import org.eclipse.wst.common.internal.emfworkbench.PassthruResourceSet;
-import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
-import org.osgi.framework.BundleContext;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class EMFWorkbenchEditPlugin extends Plugin {
-	public static final String ID = "org.eclipse.wst.common.emfworkbench.integration"; //$NON-NLS-1$
-
-	public static final String EDIT_MODEL_FACTORIES_EXTENSION_POINT = "editModel"; //$NON-NLS-1$
-	public static final String EDIT_MODEL_EXTENSION_REGISTRY_EXTENSION_POINT = "editModelExtension"; //$NON-NLS-1$
-	public static final String ADAPTER_FACTORY_REGISTRY_EXTENSION_POINT = "adapterFactory"; //$NON-NLS-1$
-
-
-	//The shared instance.
-	private static EMFWorkbenchEditPlugin plugin; 
-
-	/**
-	 * The constructor.
-	 */
-	public EMFWorkbenchEditPlugin() {
-		super();
-		plugin = this; 
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static EMFWorkbenchEditPlugin getDefault() {
-		return plugin;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.Plugin#startup()
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		ExtendedEcoreUtil.setFileNotFoundDetector(new ExtendedEcoreUtil.FileNotFoundDetector() {
-			public boolean isFileNotFound(WrappedException wrappedEx) {
-				return WorkbenchResourceHelperBase.isResourceNotFound(wrappedEx) || wrappedEx.exception() instanceof FileNotFoundException;
-			}
-		});
-		WorkbenchResourceHelper.initializeFileAdapterFactory();
-
-		IAdapterManager manager = Platform.getAdapterManager();
-		manager.registerAdapters(new EMFAdapterFactory(), EObject.class);
-	}
-
-	public static ResourceSet createIsolatedResourceSet(IProject project) {
-		return new PassthruResourceSet(project);
-	}
-
-	public static ResourceSet createWorkspacePassthruResourceSet() {
-		return new PassthruResourceSet();
-	}
-
-
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EditModel.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EditModel.java
deleted file mode 100644
index f83ee85..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EditModel.java
+++ /dev/null
@@ -1,1586 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.internal.emfworkbench.integration;
-
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.common.command.BasicCommandStack;
-import org.eclipse.emf.common.command.CommandStack;
-import org.eclipse.emf.common.command.CommandStackListener;
-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.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.jem.internal.util.emf.workbench.nls.EMFWorkbenchResourceHandler;
-import org.eclipse.jem.util.emf.workbench.ResourceSetWorkbenchSynchronizer;
-import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
-import org.eclipse.wst.common.frameworks.internal.ISaveHandler;
-import org.eclipse.wst.common.frameworks.internal.SaveFailedException;
-import org.eclipse.wst.common.frameworks.internal.SaveHandlerHeadless;
-import org.eclipse.wst.common.frameworks.internal.SaveHandlerRegister;
-import org.eclipse.wst.common.frameworks.internal.enablement.EnablementIdentifierEvent;
-import org.eclipse.wst.common.frameworks.internal.enablement.IEnablementIdentifier;
-import org.eclipse.wst.common.frameworks.internal.enablement.IEnablementIdentifierListener;
-import org.eclipse.wst.common.frameworks.internal.enablement.nonui.IWFTWrappedException;
-import org.eclipse.wst.common.frameworks.internal.operations.IOperationHandler;
-import org.eclipse.wst.common.internal.emf.resource.CompatibilityXMIResource;
-import org.eclipse.wst.common.internal.emf.resource.ReferencedResource;
-import org.eclipse.wst.common.internal.emf.resource.TranslatorResource;
-import org.eclipse.wst.common.internal.emf.utilities.ExtendedEcoreUtil;
-import org.eclipse.wst.common.internal.emf.utilities.PleaseMigrateYourCodeError;
-import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
-import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
-import org.eclipse.wst.common.internal.emfworkbench.edit.ClientAccessRegistry;
-import org.eclipse.wst.common.internal.emfworkbench.edit.EditModelRegistry;
-import org.eclipse.wst.common.internal.emfworkbench.edit.EditModelResource;
-import org.eclipse.wst.common.internal.emfworkbench.edit.ReadOnlyClientAccessRegistry;
-import org.eclipse.wst.common.internal.emfworkbench.validateedit.ResourceStateInputProvider;
-import org.eclipse.wst.common.internal.emfworkbench.validateedit.ResourceStateValidator;
-import org.eclipse.wst.common.internal.emfworkbench.validateedit.ResourceStateValidatorImpl;
-import org.eclipse.wst.common.internal.emfworkbench.validateedit.ResourceStateValidatorPresenter;
-
-
-public class EditModel implements CommandStackListener, ResourceStateInputProvider, ResourceStateValidator, IEnablementIdentifierListener {
-
-	protected BasicCommandStack commandStack;
-	protected List listeners;
-	protected List removedListeners = new ArrayList();
-	private Map params;
-	private final String editModelID;
-	private final boolean readOnly;
-	// These are the current resource uris we need to track
-	protected List knownResourceUris;
-	// This is a subset of the known resource uris, which we have requested be autoloaded
-	protected List preloadResourceUris;
-	// This is a map of identifiers to resources that we need to listen to in order to listen for
-	// updates to the edit model resources
-	protected Map resourceIdentifiers;
-
-	protected EditModelEvent dirtyModelEvent;
-	protected boolean isNotifing = false;
-	protected boolean disposing = false;
-	private boolean disposed = false;
-	protected ResourceStateValidator stateValidator;
-	protected boolean accessAsReadForUnKnownURIs;
-	protected ResourceAdapter resourceAdapter = new ResourceAdapter();
-	protected boolean isReverting = false;
-	protected List resources;
-	private ClientAccessRegistry registry;
-	protected EMFWorkbenchContext emfContext = null;
-	protected IProject project = null;
-
-	private Reference reference;
-	private List resourcesTargetedForTermination;
-
-	protected class ResourceAdapter extends AdapterImpl {
-		public void notifyChanged(Notification notification) {
-			if (notification.getEventType() == Notification.SET && notification.getFeatureID(null) == Resource.RESOURCE__IS_LOADED) {
-				resourceIsLoadedChanged((Resource) notification.getNotifier(), notification.getOldBooleanValue(), notification.getNewBooleanValue());
-			}
-		}
-	}
-
-	public EditModel(String editModelID, EMFWorkbenchContext context, boolean readOnly) {
-		if (context == null)
-			throw new IllegalStateException("EMF context can't be null"); //$NON-NLS-1$
-		this.editModelID = editModelID;
-		this.readOnly = readOnly;
-		if (readOnly)
-			this.registry = new ReadOnlyClientAccessRegistry();
-		else
-			this.registry = new ClientAccessRegistry();
-		this.emfContext = context;
-		this.project = context.getProject();
-		initializeKnownResourceUris();
-		processLoadedResources();
-		processPreloadResources();
-	}
-
-
-//	private ClientAccessRegistry initializeRegistry(Object read) {
-//
-//		return null;
-//	}
-
-
-	public EditModel(String editModelID, EMFWorkbenchContext context, boolean readOnly, boolean accessUnknownResourcesAsReadOnly) {
-		this(editModelID, context, readOnly);
-		this.accessAsReadForUnKnownURIs = accessUnknownResourcesAsReadOnly;
-	}
-
-	/**
-	 * @return editModelID
-	 */
-	public String getEditModelID() {
-		return editModelID;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (9/27/2001 10:25:43 PM)
-	 * 
-	 * @return boolean
-	 */
-	public boolean isDisposing() {
-		return disposing;
-	}
-
-	public void dispose() {
-		synchronized (this) {
-			if (disposing || isDisposed())
-				return;
-			disposing = true;
-		}
-		try {
-			releaseResources();
-
-			if (commandStack != null)
-				commandStack.removeCommandStackListener(this);
-			if (hasListeners())
-				notifyListeners(new EditModelEvent(EditModelEvent.PRE_DISPOSE, this));
-			if (getEmfContext() != null)
-				getEmfContext().removeEditModel(this, isReadOnly());
-			releasePreloadResources();
-			releaseIdentifiers();
-
-			emfContext = null;
-			listeners = null;
-			removedListeners = null;
-			resources = null;
-			project = null;
-		} catch (RuntimeException re) {
-			re.printStackTrace();
-		} finally {
-			disposed = true;
-			disposing = false;
-		}
-	}
-
-	protected void releaseIdentifiers() {
-		if (resourceIdentifiers == null)
-			return;
-		Iterator iter = resourceIdentifiers.keySet().iterator();
-		IEnablementIdentifier identifier = null;
-		while (iter.hasNext()) {
-			identifier = (IEnablementIdentifier) iter.next();
-			identifier.removeIdentifierListener(this);
-		}
-	}
-
-	private ResourceSetWorkbenchSynchronizer getResourceSetSynchronizer() {
-		if (emfContext == null || !emfContext.hasResourceSet())
-			return null;
-		return getEmfContext().getResourceSet().getSynchronizer();
-	}
-
-	protected void releasePreloadResources() {
-		ResourceSetWorkbenchEditSynchronizer sync = (ResourceSetWorkbenchEditSynchronizer) getResourceSetSynchronizer();
-		if (sync != null) {
-			for (int i = 0; i < preloadResourceUris.size(); i++) {
-				URI uri = (URI) preloadResourceUris.get(i);
-				sync.disableAutoload(uri);
-			}
-		}
-	}
-
-
-	/** ** BEGIN Command Stack Manipulation *** */
-
-	/**
-	 * Return the CommandStack.
-	 */
-	protected BasicCommandStack createCommandStack() {
-		BasicCommandStack stack = new BasicCommandStack();
-		return stack;
-	}
-
-	/**
-	 * This is called with the {@link CommandStack}'s state has changed.
-	 */
-	public void commandStackChanged(java.util.EventObject event) {
-		if (dirtyModelEvent == null)
-			dirtyModelEvent = new EditModelEvent(EditModelEvent.DIRTY, this);
-		if (hasListeners())
-			notifyListeners(dirtyModelEvent);
-	}
-
-	/**
-	 * Flush the Commands from the CommandStack.
-	 */
-	protected void flushCommandStack() {
-		getCommandStack().flush();
-		getCommandStack().saveIsDone();
-	}
-
-	/**
-	 * Return the CommandStack.
-	 */
-	public BasicCommandStack getCommandStack() {
-		if (commandStack == null) {
-			commandStack = createCommandStack();
-			commandStack.addCommandStackListener(this);
-		}
-		return commandStack;
-	}
-
-	/**
-	 * Returns true if there are any listeners
-	 */
-	public boolean hasListeners() {
-		return !getListeners().isEmpty();
-	}
-
-	/** ** END Command Stack Manipulation *** */
-
-	/** ** BEGIN Listeners *** */
-
-	/**
-	 * Add
-	 * 
-	 * @aListener to the list of listeners.
-	 */
-	public void addListener(EditModelListener aListener) {
-		if (aListener != null && !getListeners().contains(aListener))
-			getListeners().add(aListener);
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (4/11/2001 4:42:58 PM)
-	 * 
-	 * @return java.util.List
-	 */
-	protected java.util.List getListeners() {
-		if (listeners == null)
-			listeners = new ArrayList();
-		return listeners;
-	}
-
-	/**
-	 * Notify listeners of
-	 * 
-	 * @anEvent.
-	 */
-	protected void notifyListeners(EditModelEvent anEvent) {
-		if (listeners == null)
-			return;
-		boolean oldIsNotifying = isNotifing;
-		synchronized (this) {
-			isNotifing = true;
-		}
-		try {
-			List list = getListeners();
-			for (int i = 0; i < list.size(); i++) {
-				EditModelListener listener = (EditModelListener) list.get(i);
-				if (!removedListeners.contains(listener))
-					listener.editModelChanged(anEvent);
-			}
-		} finally {
-			synchronized (this) {
-				isNotifing = oldIsNotifying;
-				if (!isNotifing && removedListeners != null && !removedListeners.isEmpty()) {
-					listeners.removeAll(removedListeners);
-					removedListeners.clear();
-				}
-			}
-		}
-	}
-
-	/**
-	 * Remove
-	 * 
-	 * @aListener from the list of listeners.
-	 */
-	public synchronized boolean removeListener(EditModelListener aListener) {
-		if (aListener != null) {
-			if (isNotifing)
-				return removedListeners.add(aListener);
-			return getListeners().remove(aListener);
-		}
-		return false;
-	}
-
-	/** ** END Listeners *** */
-
-	protected void makeFileEditable(IFile aFile) {
-		if (aFile == null)
-			return;
-		aFile.getResourceAttributes().setReadOnly(false);
-	}
-
-	/**
-	 * @return java.util.List of IFile; any read-only files that will be touched if this edit model
-	 *         saves
-	 */
-	public List getReadOnlyAffectedFiles() {
-		Iterator affected = getAffectedFiles().iterator();
-		List result = new ArrayList();
-		while (affected.hasNext()) {
-			IFile aFile = (IFile) affected.next();
-			if (aFile.isReadOnly())
-				result.add(aFile);
-		}
-		return result;
-	}
-
-	/** ** BEGIN Save Handlers *** */
-
-	protected ISaveHandler getSaveHandler() {
-		return SaveHandlerRegister.getSaveHandler();
-	}
-
-	/**
-	 * Default is to do nothing. This method is called if a saveIfNecessary or
-	 * saveIfNecessaryWithPrompt determines not to save. This provides subclasses with an
-	 * opportunity to do some other action.
-	 */
-	protected void handleSaveIfNecessaryDidNotSave(IProgressMonitor monitor) {
-		// do nothing
-	}
-
-	/**
-	 * This will force all of the referenced Resources to be saved.
-	 */
-	public void save(Object accessorKey) {
-		save(null, accessorKey);
-	}
-
-	/**
-	 * This will force all of the referenced Resources to be saved.
-	 */
-	public void save(IProgressMonitor monitor) throws PleaseMigrateYourCodeError {
-		// save
-	}
-
-	/**
-	 * Subclasses may override {@link #primSave}
-	 */
-	public final void save(IProgressMonitor monitor, Object accessorKey) {
-		assertPermissionToSave(accessorKey);
-		getSaveHandler().access();
-		try {
-			IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
-				public void run(IProgressMonitor aMonitor) {
-					primSave(aMonitor);
-				}
-			};
-			runSaveOperation(runnable, monitor);
-		} catch (SaveFailedException ex) {
-			getSaveHandler().handleSaveFailed(ex, monitor);
-		} catch (Exception ex) {
-			ex.printStackTrace();
-		}
-		finally {
-			getSaveHandler().release();
-		}
-	}
-
-	/**
-	 * Save only resources that need to be saved (i.e., no other references).
-	 */
-	public void saveIfNecessary(Object accessorKey) {
-		saveIfNecessary(null, accessorKey);
-	}
-
-	/**
-	 * Save only resources that need to be saved (i.e., no other references).
-	 */
-	public void saveIfNecessary(IProgressMonitor monitor, Object accessorKey) {
-		if (shouldSave())
-			save(monitor, accessorKey);
-		else
-			handleSaveIfNecessaryDidNotSave(monitor);
-	}
-
-	/**
-	 * Save only if necessary. If typically a save would not occur because this edit model is
-	 * shared, the user will be prompted using the
-	 * 
-	 * @operationHandler. If the prompt returns true (the user wants to save) the entire edit model
-	 *                    will be saved.
-	 */
-	public void saveIfNecessaryWithPrompt(IOperationHandler operationHandler, Object accessorKey) {
-		saveIfNecessaryWithPrompt(null, operationHandler, accessorKey);
-	}
-
-	/**
-	 * Save only if necessary. If typically a save would not occur because this edit model is
-	 * shared, the user will be prompted using the
-	 * 
-	 * @operationHandler. If the prompt returns true (the user wants to save) the entire edit model
-	 *                    will be saved. You may pass in a boolean <code>wasDirty</code> to
-	 *                    indicate whether this edit model was dirty prior to making any changes and
-	 *                    calling this method. {@link EditModel#isDirty()}
-	 */
-	public void saveIfNecessaryWithPrompt(IOperationHandler operationHandler, boolean wasDirty, Object accessorKey) {
-		saveIfNecessaryWithPrompt(null, operationHandler, wasDirty, accessorKey);
-	}
-
-	/**
-	 * Save only if necessary. If typically a save would not occur because this edit model is
-	 * shared, the user will be prompted using the
-	 * 
-	 * @operationHandler. If the prompt returns true (the user wants to save) the entire edit model
-	 *                    will be saved.
-	 */
-	public void saveIfNecessaryWithPrompt(IProgressMonitor monitor, IOperationHandler operationHandler, Object accessorKey) {
-		saveIfNecessaryWithPrompt(monitor, operationHandler, true, accessorKey);
-	}
-
-	/**
-	 * Save only if necessary. If typically a save would not occur because this edit model is
-	 * shared, the user will be prompted using the
-	 * 
-	 * @operationHandler. If the prompt returns true (the user wants to save) the entire edit model
-	 *                    will be saved. You may pass in a boolean <code>wasDirty</code> to
-	 *                    indicate whether this edit model was dirty prior to making any changes and
-	 *                    calling this method. {@link EditModel#isDirty()}
-	 */
-	public void saveIfNecessaryWithPrompt(IProgressMonitor monitor, IOperationHandler operationHandler, boolean wasDirty, Object accessorKey) {
-
-		if (shouldSave(operationHandler, wasDirty))
-			save(monitor, accessorKey);
-		else
-			handleSaveIfNecessaryDidNotSave(monitor);
-	}
-
-	protected void assertPermissionToSave(Object accessorKey) {
-		if (registry != null)
-			registry.assertAccess(accessorKey);
-	}
-
-	protected void runSaveOperation(IWorkspaceRunnable runnable, IProgressMonitor monitor) throws SaveFailedException {
-		try {
-			ResourcesPlugin.getWorkspace().run(runnable, getProject(),IWorkspace.AVOID_UPDATE,monitor);
-		} catch (CoreException e) {
-			throw new SaveFailedException(e);
-		}
-	}
-
-	/**
-	 * Should the resources be saved.
-	 */
-	protected boolean shouldSave(IOperationHandler operationHandler, boolean wasDirty) {
-		return !wasDirty ? shouldSave() : shouldSave(operationHandler);
-	}
-
-	/**
-	 * Return true if the uri for
-	 * 
-	 * @aResource is one of the known resource uris.
-	 */
-	public boolean isInterrestedInResource(Resource aResource) {
-		return isInterrestedInResourceUri(aResource.getURI());
-	}
-
-	protected boolean isInterrestedInResourceUri(URI resURI) {
-		URI uri;
-		List uriStrings = getKnownResourceUris();
-		for (int i = 0; i < uriStrings.size(); i++) {
-			uri = (URI) uriStrings.get(i);
-			if (ExtendedEcoreUtil.endsWith(resURI, uri))
-				return true;
-		}
-		return false;
-	}
-
-
-	/**
-	 * Subclasses should override and add URIs (type URI) of known resources. You must add resources
-	 * that have references to other known resources first so they will be released first.
-	 */
-	protected void initializeKnownResourceUris() {
-		knownResourceUris = new ArrayList();
-		preloadResourceUris = new ArrayList();
-		EditModelResource res = null;
-		Collection editModelResources = EditModelRegistry.getInstance().getEditModelResources(getEditModelID());
-		Iterator iter = editModelResources.iterator();
-		while (iter.hasNext()) {
-			res = (EditModelResource) iter.next();
-			addEditModelResource(res);
-		}
-
-	}
-
-	private void addEditModelResource(EditModelResource res) {
-		boolean enabled = false;
-		if (res.isCore()) {
-			enabled = true;
-		} else {
-			IEnablementIdentifier identifier = res.getEnablementIdentifier(getProject());
-			registerInterest(identifier, res);
-			enabled = identifier.isEnabled();
-		}
-		if (enabled) {
-			URI uri = res.getURI();
-			knownResourceUris.add(uri);
-			if (res.isAutoLoad()) {
-				ResourceSetWorkbenchEditSynchronizer sync = (ResourceSetWorkbenchEditSynchronizer) getEmfContext().getResourceSet().getSynchronizer();
-				sync.enableAutoload(uri);
-				preloadResourceUris.add(uri);
-			}
-		}
-	}
-
-	/**
-	 * @param res
-	 */
-	private void registerInterest(IEnablementIdentifier identifier, EditModelResource res) {
-		getEditModelResources(identifier).add(res);
-	}
-
-	private List getEditModelResources(IEnablementIdentifier identifier) {
-		if (resourceIdentifiers == null)
-			resourceIdentifiers = new HashMap();
-		List tResources = (List) resourceIdentifiers.get(identifier);
-		if (tResources == null) {
-			tResources = new ArrayList(3);
-			resourceIdentifiers.put(identifier, tResources);
-			identifier.addIdentifierListener(this);
-		}
-		return tResources;
-	}
-
-
-
-	public java.util.List getKnownResourceUris() {
-		if (knownResourceUris == null)
-			initializeKnownResourceUris();
-
-		return knownResourceUris;
-	}
-
-	public boolean isShared() {
-		return registry.size() > 1;
-	}
-
-	/**
-	 * @see ResourceStateInputProvider#cacheNonResourceValidateState(List)
-	 */
-	public void cacheNonResourceValidateState(List roNonResourceFiles) {
-		// do nothing
-	}
-
-	/**
-	 * @see ResourceStateInputProvider#getNonResourceFiles()
-	 */
-	public List getNonResourceFiles() {
-		return null;
-	}
-
-	/**
-	 * @see ResourceStateInputProvider#getNonResourceInconsistentFiles()
-	 */
-	public List getNonResourceInconsistentFiles() {
-		return null;
-	}
-
-	/**
-	 * Gets the stateValidator.
-	 * 
-	 * @return Returns a ResourceStateValidator
-	 */
-	public ResourceStateValidator getStateValidator() {
-		if (stateValidator == null)
-			stateValidator = createStateValidator();
-		return stateValidator;
-	}
-
-	/**
-	 * Method createStateValidator.
-	 * 
-	 * @return ResourceStateValidator
-	 */
-	private ResourceStateValidator createStateValidator() {
-		return new ResourceStateValidatorImpl(this);
-	}
-
-	/**
-	 * @see ResourceStateValidator#checkActivation(ResourceStateValidatorPresenter)
-	 */
-	public void checkActivation(ResourceStateValidatorPresenter presenter) throws CoreException {
-		getStateValidator().checkActivation(presenter);
-	}
-
-	/**
-	 * @see ResourceStateValidator#lostActivation(ResourceStateValidatorPresenter)
-	 */
-	public void lostActivation(ResourceStateValidatorPresenter presenter) throws CoreException {
-		getStateValidator().lostActivation(presenter);
-	}
-
-	/**
-	 * @see ResourceStateValidator#validateState(ResourceStateValidatorPresenter)
-	 */
-	public IStatus validateState(ResourceStateValidatorPresenter presenter) throws CoreException {
-		return getStateValidator().validateState(presenter);
-	}
-
-	/**
-	 * @see ResourceStateValidator#checkSave(ResourceStateValidatorPresenter)
-	 */
-	public boolean checkSave(ResourceStateValidatorPresenter presenter) throws CoreException {
-		return getStateValidator().checkSave(presenter);
-	}
-
-	/**
-	 * @see ResourceStateValidator#checkReadOnly()
-	 */
-	public boolean checkReadOnly() {
-		return getStateValidator().checkReadOnly();
-	}
-
-	/**
-	 * Return the ResourceSet from the Nature.
-	 * 
-	 * @return org.eclipse.emf.ecore.resource.ResourceSet
-	 */
-	public ResourceSet getResourceSet() {
-		ResourceSet resourceSet = null;
-		if (getEmfContext() != null)
-			resourceSet = getEmfContext().getResourceSet();
-		return resourceSet;
-	}
-
-	protected void resourceIsLoadedChanged(Resource aResource, boolean oldValue, boolean newValue) {
-		if (!isReverting && hasListeners()) {
-			int eventCode = newValue ? EditModelEvent.LOADED_RESOURCE : EditModelEvent.UNLOADED_RESOURCE;
-			EditModelEvent evt = new EditModelEvent(eventCode, this);
-			evt.addResource(aResource);
-			notifyListeners(evt);
-		}
-	}
-
-	public Resource getResource(URI aUri) {
-		Resource res = getAndLoadLocalResource(aUri);
-		if (res == null)
-			res = WorkbenchResourceHelper.getOrCreateResource(aUri, getResourceSet());
-		if (res != null)
-			processResource(res);
-		return res;
-	}
-
-	protected void processResource(Resource aResource) {
-		if (aResource != null && !getResources().contains(aResource)) {
-			if (aResource instanceof ReferencedResource) {
-				access((ReferencedResource) aResource);
-				// We need a better way to pass this through the save options instead.
-				// We also need to make this dynamic based on the project target
-				((ReferencedResource) aResource).setFormat(CompatibilityXMIResource.FORMAT_MOF5);
-			} else if (aResource instanceof CompatibilityXMIResource) {
-				((CompatibilityXMIResource) aResource).setFormat(CompatibilityXMIResource.FORMAT_MOF5);
-			}
-
-			addResource(aResource);
-		}
-	}
-
-	protected void addResource(Resource aResource) {
-		getResources().add(aResource);
-		aResource.eAdapters().add(resourceAdapter);
-	}
-
-	/**
-	 * Return a Resource for
-	 * 
-	 * @aUri.
-	 */
-	// TODO The following method will only use the last segment when looking for a resource.
-	protected Resource getResource(List tResources, URI aUri) {
-		Resource resource;
-		for (int i = 0; i < tResources.size(); i++) {
-			resource = (Resource) tResources.get(i);
-			if (ExtendedEcoreUtil.endsWith(resource.getURI(), aUri))
-				return resource;
-		}
-		return null;
-	}
-
-	public Resource createResource(URI uri) {
-		Resource resource = getExistingOrCreateResource(uri);
-		processResource(resource);
-		return resource;
-	}
-
-	/**
-	 * Get a cached Resource, either local or in the ResourceSet, before creating a Resource. This
-	 * api handles the case that the Resource may be created during a demand load that failed.
-	 */
-	public Resource getExistingOrCreateResource(URI uri) {
-		Resource res = getAndLoadLocalResource(uri);
-		if (res == null)
-			res = WorkbenchResourceHelperBase.getExistingOrCreateResource(uri, getResourceSet());
-		return res;
-	}
-
-	/**
-	 * Return a Resource for
-	 * 
-	 * @aUri.
-	 */
-	protected Resource getAndLoadLocalResource(URI aUri) {
-		Resource resource = getLocalResource(aUri);
-		if (null != resource && !resource.isLoaded()) {
-			try {
-				resource.load(Collections.EMPTY_MAP); // reload it
-			} catch (IOException e) {
-				// Ignore
-			}
-		}
-		return resource;
-	}
-
-	/**
-	 * Return a Resource for
-	 * 
-	 * @aUri.
-	 */
-	protected Resource getLocalResource(URI aUri) {
-		return getResource(getResources(), aUri);
-	}
-
-	/*
-	 * Return true if this is a ReadOnly EditModel or if we should only access unknown URIs as
-	 * ReadOnly.
-	 */
-	protected boolean shouldAccessForRead(ReferencedResource aResource) {
-		return isReadOnly() || (accessAsReadForUnKnownURIs && !isInterrestedInResource(aResource));
-	}
-
-	/**
-	 * Save only resources that need to be saved (i.e., no other references).
-	 */
-	public void resourceChanged(EditModelEvent anEvent) {
-		int code = anEvent.getEventCode();
-		switch (code) {
-			case EditModelEvent.REMOVED_RESOURCE : {
-				if (!isReverting && hasResourceReference(anEvent.getChangedResources()))
-					removeResources(anEvent.getChangedResources());
-				else
-					return;
-				break;
-			}
-			case EditModelEvent.ADDED_RESOURCE :
-				if (!processResourcesIfInterrested(anEvent.getChangedResources()))
-					return;
-		}
-		if (hasListeners()) {
-			anEvent.setEditModel(this);
-			notifyListeners(anEvent);
-		}
-	}
-
-	/**
-	 * Return true if aResource is referenced by me.
-	 */
-	protected boolean hasResourceReference(Resource aResource) {
-		if (aResource != null)
-			return getResources().contains(aResource);
-		return false;
-	}
-
-	/**
-	 * Return true if any Resource in the list of
-	 * 
-	 * @resources is referenced by me.
-	 */
-	protected boolean hasResourceReference(List tResources) {
-		for (int i = 0; i < tResources.size(); i++) {
-			if (hasResourceReference((Resource) tResources.get(i)))
-				return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Remove reference to the Resource objects in
-	 * 
-	 * @aList. This should be called when one or more Resource objects are removed from the
-	 *         ResourceSet without the reference count going to zero.
-	 */
-	protected void removeResources(List aList) {
-		Resource res;
-		for (int i = 0; i < aList.size(); i++) {
-			res = (Resource) aList.get(i);
-			if (removeResource(res) && res instanceof ReferencedResource)
-				removedResource((ReferencedResource) res);
-		}
-	}
-
-	private final void removedResource(ReferencedResource referencedResource) {
-		if (!isReadOnly() && referencedResource.wasReverted()) {
-			isReverting = true;
-			try {
-				reverted(referencedResource);
-			} finally {
-				isReverting = false;
-			}
-		}
-	}
-
-	protected boolean removeResource(URI uri) {
-		Resource res = getLocalResource(uri);
-		return removeResource(res);
-	}
-
-	/**
-	 * Remove reference to the aResource.
-	 */
-	protected boolean removeResource(Resource aResource) {
-		if (aResource != null) {
-			aResource.eAdapters().remove(resourceAdapter);
-			return getResources().remove(aResource);
-		}
-		return false;
-	}
-
-	/**
-	 * Subclasses should override to post process a removed ReferencedResource.
-	 * 
-	 * @see J2EEEditModel#revertAllResources()
-	 */
-	protected void reverted(ReferencedResource revertedResource) {
-		revertAllResources();
-	}
-
-	protected void revertAllResources() {
-		List someResources = getSortedResources();
-		for (int i = 0; i < someResources.size(); i++)
-			((Resource) someResources.get(i)).unload();
-		getResources().removeAll(someResources);
-		for (int i = 0; i < someResources.size(); i++)
-			((Resource) someResources.get(i)).eAdapters().remove(resourceAdapter);
-	}
-
-	/**
-	 * group the resources by XMI first, then XML
-	 */
-	protected List getSortedResources() {
-
-		List theResources = getResources();
-		int size = theResources.size();
-		if (size == 0)
-			return Collections.EMPTY_LIST;
-		Resource[] sorted = new Resource[size];
-		int xmlInsertPos = size - 1;
-		int xmiInsertPos = 0;
-		Resource res = null;
-		for (int i = 0; i < size; i++) {
-			res = (Resource) theResources.get(i);
-			if (res instanceof TranslatorResource)
-				sorted[xmlInsertPos--] = res;
-			else
-				sorted[xmiInsertPos++] = res;
-		}
-
-		return Arrays.asList(sorted);
-	}
-
-	/**
-	 * Process Resources that we are interrested in.
-	 */
-	protected boolean processResourcesIfInterrested(List someResources) {
-		int size = someResources.size();
-		Resource res;
-		boolean processed = false;
-		for (int i = 0; i < size; i++) {
-			res = (Resource) someResources.get(i);
-			if ((res != null) && (isInterrestedInResource(res))) {
-				processResource(res);
-				processed = true;
-			}
-		}
-		return processed;
-	}
-
-	public EMFWorkbenchContext getEmfContext() {
-		if (isDisposed())
-			throw new IllegalStateException("Edit Model already disposed"); //$NON-NLS-1$
-		if (emfContext == null)
-			throw new IllegalStateException("EMF context is null"); //$NON-NLS-1$
-		return emfContext;
-	}
-
-	public boolean isDisposed() {
-		return disposed;
-	}
-
-
-
-	public IProject getProject() {
-		return project;
-	}
-
-	/**
-	 * This method should only be called by the EMFWorkbenchContext.
-	 */
-	public void access(Object accessorKey) {
-		registry.access(accessorKey);
-	}
-
-	/**
-	 * Access
-	 * 
-	 * @aResource for read or write.
-	 */
-	protected void access(ReferencedResource aResource) {
-		if (shouldAccessForRead(aResource))
-			aResource.accessForRead();
-		else
-			aResource.accessForWrite();
-	}
-
-	/**
-	 * This method should be called from each client when they are finished working with the
-	 * EditModel.
-	 */
-	public void releaseAccess(Object accessorKey) {
-
-		registry.release(accessorKey);
-
-		if (!isDisposing()) {
-			synchronized (this) {
-				if (registry.size() == 0) {
-					dispose();
-				}
-			}
-		}
-	}
-
-	/**
-	 * Release each of the referenced resources.
-	 */
-	protected void release(Resource aResource) {
-
-		removeResource(aResource);
-		if (aResource != null && aResource instanceof ReferencedResource)
-			release((ReferencedResource) aResource);
-	}
-
-	/**
-	 * Release each of the referenced resources.
-	 */
-	protected void release(ReferencedResource aResource) {
-		if (isReadOnly())
-			aResource.releaseFromRead();
-		else
-			aResource.releaseFromWrite();
-
-	}
-
-	/**
-	 * Release each of the referenced resources.
-	 */
-	protected void releaseResources() {
-		List tResources = getSortedResources();
-		Resource resource;
-		for (int i = 0; i < tResources.size(); i++) {
-			resource = (Resource) tResources.get(i);
-			release(resource);
-		}
-	}
-
-	public void deleteResource(Resource aResource) {
-		if (aResource == null || resources == null || !getResources().contains(aResource))
-			return;
-		getResourcesTargetedForTermination().add(aResource);
-
-	}
-
-	/**
-	 * @return
-	 */
-	protected List getResourcesTargetedForTermination() {
-		if (resourcesTargetedForTermination == null)
-			resourcesTargetedForTermination = new ArrayList(5);
-		return resourcesTargetedForTermination;
-	}
-
-
-
-	/**
-	 * Remove my reference to aResource, remove it from the ResourceSet, and delete its file from
-	 * the Workbench. This only happens if there is currently a reference to
-	 * 
-	 * @aResource.
-	 */
-	public void primDeleteResource(Resource aResource) {
-		if (primFlushResource(aResource)) {
-			try {
-				getEmfContext().deleteResource(aResource);
-			} catch (CoreException e) {
-				// what should we do here?
-			}
-			if (hasListeners()) {
-				EditModelEvent event = new EditModelEvent(EditModelEvent.REMOVED_RESOURCE, this);
-				event.addResource(aResource);
-				notifyListeners(event);
-			}
-		}
-	}
-
-	/**
-	 * Remove my reference to aResource and remove it from the ResourceSet.
-	 */
-	public void flushResource(Resource aResource) {
-		if (primFlushResource(aResource)) {
-			if (hasListeners()) {
-				EditModelEvent event = new EditModelEvent(EditModelEvent.REMOVED_RESOURCE, this);
-				event.addResource(aResource);
-				notifyListeners(event);
-			}
-		}
-	}
-
-	public Set getAffectedFiles() {
-		Set aSet = new HashSet();
-		List mofResources = getResources();
-		for (int i = 0; i < mofResources.size(); i++) {
-			Resource aResource = (Resource) mofResources.get(i);
-			IFile output = WorkbenchResourceHelper.getFile(aResource);
-			if (output != null)
-				aSet.add(output);
-		}
-		return aSet;
-	}
-
-	protected List resetKnownResourceUris() {
-
-		initializeKnownResourceUris();
-
-		return knownResourceUris;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (4/11/2001 4:14:26 PM)
-	 * 
-	 * @return java.util.List
-	 */
-	public List getResources() {
-		if (resources == null)
-			resources = new ArrayList(5);
-		return resources;
-	}
-
-	public String[] getResourceURIs() {
-		return getResourceURIs(false);
-	}
-
-	public String[] getResourceURIs(boolean onlyDirty) {
-		List list = getResources();
-		int dirtyCount = 0;
-		String[] uris = new String[list.size()];
-		Resource res;
-		for (int i = 0; i < list.size(); i++) {
-			res = (Resource) list.get(i);
-			if (!onlyDirty)
-				uris[i] = res.getURI().toString();
-			else if (res.isModified()) {
-				uris[i] = res.getURI().toString();
-				dirtyCount++;
-			}
-		}
-		if (onlyDirty && dirtyCount > 0) {
-			String[] dirty = new String[dirtyCount];
-			int j = 0;
-			for (int i = 0; i < uris.length; i++) {
-				if (uris[i] != null) {
-					dirty[j] = uris[i];
-					j++;
-				}
-			}
-			uris = dirty;
-		}
-		return uris;
-	}
-
-	/**
-	 * Returns the first element in the extent of the resource; logs an error and returns null if
-	 * the extent is empty
-	 */
-	public static EObject getRoot(Resource aResource) {
-		EList extent = aResource.getContents();
-		if (extent.size() < 1)
-			return null;
-		return (EObject) extent.get(0);
-	}
-
-	/**
-	 * Handle the failure of
-	 * 
-	 * @aResource.
-	 */
-	protected void handleSaveFailed(Resource aResource, Exception e) {
-		aResource.setModified(true);
-		if (isFailedWriteFileFailure(e) && shouldSaveReadOnly(aResource))
-			saveResource(aResource);
-		else
-			primHandleSaveFailed(aResource, e);
-	}
-
-	/**
-	 * Return whether any of my resources has been modified.
-	 */
-	protected boolean isAnyResourceDirty() {
-		List list = getResources();
-		for (int i = 0; i < list.size(); i++) {
-			if (((Resource) list.get(i)).isModified())
-				return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Return whether a save is needed on the CommandStack
-	 */
-	public boolean isDirty() {
-		return isAnyResourceDirty();
-	}
-
-	protected boolean isFailedWriteFileFailure(Exception ex) {
-		return SaveHandlerHeadless.isFailedWriteFileFailure(ex);
-	}
-
-	/**
-	 * Return true if you can only read the resources and not write.
-	 */
-	public boolean isReadOnly() {
-		return readOnly;
-	}
-
-	protected boolean isReadOnlyFailure(Exception ex) {
-		return false;
-	}
-
-	public boolean hasReadOnlyResource() {
-		try {
-			List list = getResources();
-			int size = list.size();
-			Resource res = null;
-			IFile file;
-			for (int i = 0; i < size; i++) {
-				res = (Resource) list.get(i);
-				file = WorkbenchResourceHelper.getFile(res);
-				if (file != null && file.isReadOnly())
-					return true;
-			}
-		} catch (NullPointerException e) {
-			System.out.println(e);
-		}
-		return false;
-	}
-
-	/**
-	 * @deprecated use createResource(URI) instead
-	 */
-	public Resource makeResource(String aUri) {
-		return createResource(URI.createURI(aUri));
-	}
-
-	/**
-	 * Return whether any of my resources has a reference count of one and it has been modified.
-	 */
-	public boolean needsToSave() {
-		return !isShared() && isDirty();
-	}
-
-	/**
-	 * Remove my reference to aResource and remove it from the ResourceSet. Return true if aResource
-	 * was removed.
-	 */
-	protected boolean primFlushResource(Resource aResource) {
-		if (aResource != null && hasResourceReference(aResource)) {
-			removeResource(aResource);
-			removeResourceSetResource(aResource);
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Handle the failure of
-	 * 
-	 * @aResource.
-	 */
-	protected void primHandleSaveFailed(Resource aResource, Exception e) {
-		org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError(e);
-		Exception nested = null;
-		if (e instanceof IWFTWrappedException)
-			nested = ((IWFTWrappedException) e).getNestedException();
-		else
-			nested = e;
-
-		throw new SaveFailedException(EMFWorkbenchResourceHandler.getString("An_error_occurred_while_sa_ERROR_"), nested); //$NON-NLS-1$ = "An error occurred while saving."
-	}
-
-	/**
-	 * Prompt for a save.
-	 */
-	protected boolean promptToSave(IOperationHandler operationHandler) {
-		if (operationHandler == null)
-			return false;
-		return operationHandler.canContinue(EMFWorkbenchResourceHandler.getString("The_following_resources_ne_UI_"), getResourceURIs(true)); //$NON-NLS-1$ = "The following resources need to be saved but are currently shared, do you want to save now?"
-	}
-
-	/**
-	 * This will force all of the referenced Resources to be saved.
-	 */
-	public void primSave(IProgressMonitor monitor) {
-		if (isReadOnly())
-			return; // do nothing
-		deleteResourcesIfNecessary();
-		Resource resource;
-		if (getResources().isEmpty())
-			return; // nothing to save
-		List localResources = getSortedResources();
-		for (int i = 0; i < localResources.size(); i++) {
-			resource = (Resource) localResources.get(i);
-			saveResource(resource);
-		}
-		getCommandStack().saveIsDone();
-		if (hasListeners()) {
-			EditModelEvent event = new EditModelEvent(EditModelEvent.SAVE, this);
-			notifyListeners(event);
-		}
-	}
-
-	/**
-	 * 
-	 */
-	protected void deleteResourcesIfNecessary() {
-		if (resourcesTargetedForTermination == null || resourcesTargetedForTermination.size() == 0)
-			return;
-		Resource deadres = null;
-		for (int i = 0; i < getResourcesTargetedForTermination().size(); i++) {
-			deadres = (Resource) getResourcesTargetedForTermination().get(i);
-			primDeleteResource(deadres);
-
-			getResources().remove(deadres);
-			getResourcesTargetedForTermination().remove(deadres);
-		}
-	}
-
-
-
-	/**
-	 * Save
-	 * 
-	 * @aResource.
-	 */
-	protected void primSaveResource(Resource aResource) throws Exception {
-		if (aResource.isModified())
-			aResource.save(Collections.EMPTY_MAP);
-	}
-
-	/**
-	 * Process resources that have already been loaded.
-	 */
-	protected void processLoadedResources() {
-		List loaded = getResourceSet().getResources();
-		if (!loaded.isEmpty())
-			processResourcesIfInterrested(loaded);
-	}
-
-	private void processPreloadResources() {
-		for (int i = 0; i < preloadResourceUris.size(); i++) {
-			URI uri = (URI) preloadResourceUris.get(i);
-			getResource(uri);
-		}
-	}
-
-	/**
-	 * Remove aResource from my ResourceSet. Return true if aResource was removed.
-	 */
-	protected boolean removeResourceSetResource(Resource aResource) {
-		aResource.eSetDeliver(false);
-		aResource.unload();
-		aResource.eSetDeliver(true);
-		return getResourceSet().getResources().remove(aResource);
-	}
-
-	protected void saveResource(Resource resource) {
-		try {
-			primSaveResource(resource);
-		} catch (Exception e) {
-			handleSaveFailed(resource, e);
-		}
-	}
-
-	/**
-	 * Should the resources be saved.
-	 */
-	protected boolean shouldSave() {
-		return !isReadOnly() && !isShared();
-	}
-
-	/**
-	 * Should the resources be saved.
-	 */
-	protected boolean shouldSave(IOperationHandler operationHandler) {
-		return shouldSave() || promptToSave(operationHandler);
-	}
-
-	protected boolean shouldSaveReadOnly(Resource aResource) {
-		IFile aFile = WorkbenchResourceHelper.getFile(aResource);
-		if (aFile == null || !aFile.isReadOnly())
-			return false;
-
-		return getSaveHandler().shouldContinueAndMakeFileEditable(aFile);
-	}
-
-	/**
-	 * Force all of the known resource URIs to be loaded if they are not already.
-	 */
-	public void forceLoadKnownResources() {
-		List uris = getKnownResourceUris();
-		URI uri = null;
-		for (int i = 0; i < uris.size(); i++) {
-			uri = (URI) uris.get(i);
-			getResource(uri);
-		}
-	}
-
-	/**
-	 * This method should be called when you want to extend this edit model to handle a resource
-	 * with a URI equal to <code>aRelativeURI</code>.
-	 */
-	public void manageExtensionResourceURI(String aRelativeURI) {
-		if (aRelativeURI != null && aRelativeURI.length() > 0) {
-			URI uri = URI.createURI(aRelativeURI);
-			if (!isInterrestedInResourceUri(uri)) {
-				getKnownResourceUris().add(uri);
-				// Process the resource if it is already loaded.
-				try {
-					Resource res = getEmfContext().getResource(uri);
-					if (res != null)
-						processResource(res);
-				} catch (Exception e) {
-					// Ignore
-				}
-			}
-		}
-	}
-
-	/**
-	 * Get a cached Resource or try to load the Resource prior to creating a Resource. This api
-	 * handles the case that the Resource may be created during the load.
-	 */
-	public Resource getOrCreateResource(URI uri) {
-		return getResource(uri);
-	}
-
-	/**
-	 * @return boolean
-	 */
-	public boolean isAccessAsReadForUnKnownURIs() {
-		return accessAsReadForUnKnownURIs;
-	}
-
-	/**
-	 * Use this api to indicate that you want all unknown Resources to be accessed for ReadOnly.
-	 * 
-	 * @param b
-	 */
-	public void setAccessAsReadForUnKnownURIs(boolean b) {
-		accessAsReadForUnKnownURIs = b;
-	}
-
-	public String toString() {
-		StringBuffer buffer = new StringBuffer(getClass().getName());
-		buffer.append(": "); //$NON-NLS-1$
-		if (isReadOnly())
-			buffer.append(" R = "); //$NON-NLS-1$
-		else
-			buffer.append(" W = "); //$NON-NLS-1$
-		buffer.append(getRegistry().size());
-		buffer.append("[ID: \""); //$NON-NLS-1$
-		buffer.append(getEditModelID());
-		buffer.append("\" Known Resources: ["); //$NON-NLS-1$
-		List uris = getKnownResourceUris();
-		if (uris != null) {
-			int i = 0;
-			for (i = 0; i < (uris.size() - 1); i++)
-				buffer.append(uris.get(i) + ", "); //$NON-NLS-1$
-			buffer.append(uris.get(i));
-			buffer.append("]"); //$NON-NLS-1$
-		} else
-			buffer.append("none"); //$NON-NLS-1$
-
-
-		buffer.append("]"); //$NON-NLS-1$
-		return buffer.toString();
-	}
-
-	public Reference getReference() {
-		if (reference == null)
-			reference = new Reference();
-		return reference;
-	}
-
-	/**
-	 * @return
-	 */
-	protected ClientAccessRegistry getRegistry() {
-		return registry;
-	}
-
-	public class Reference {
-
-		protected String tostring = null;
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see java.lang.Object#toString()
-		 */
-		public String toString() {
-			if (tostring == null) {
-				StringBuffer result = new StringBuffer("EditModel.Reference ["); //$NON-NLS-1$
-				result.append("{"); //$NON-NLS-1$
-				result.append(getEditModelID());
-				result.append("} {"); //$NON-NLS-1$
-				result.append(getProject().getName());
-				result.append("}]"); //$NON-NLS-1$
-				tostring = result.toString();
-			}
-			return tostring;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see java.lang.Object#hashCode()
-		 */
-		public int hashCode() {
-			return toString().hashCode();
-		}
-	}
-
-	/**
-	 * Subclasses can override - by default this will return the first root object from the first
-	 * resource referenced by the known resource URIs for this EditModel
-	 * 
-	 * @return an EObject or Null
-	 */
-	public EObject getPrimaryRootObject() {
-		Resource res = getPrimaryResource();
-		if (res == null || res.getContents().isEmpty())
-			return null;
-		return (EObject) res.getContents().get(0);
-	}
-
-	/**
-	 * Subclasses can override - by default this will return the first resource referenced by the
-	 * known resource URIs for this EditModel
-	 * 
-	 * @return
-	 */
-	public Resource getPrimaryResource() {
-		if (knownResourceUris == null)
-			getKnownResourceUris();
-		if (knownResourceUris == null || knownResourceUris.isEmpty())
-			return null;
-
-		URI uri = (URI) knownResourceUris.get(0);
-		return getResource(uri);
-	}
-
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.enablement.IEnablementIdentifierListener#identifierChanged(org.eclipse.wst.common.frameworks.internal.enablement.EnablementIdentifierEvent)
-	 */
-	public void identifierChanged(EnablementIdentifierEvent evt) {
-		if (evt.hasEnabledChanged()) {
-			EditModelEvent editModelEvent = new EditModelEvent(EditModelEvent.KNOWN_RESOURCES_ABOUT_TO_CHANGE, this);
-			notifyListeners(editModelEvent);
-			IEnablementIdentifier id = evt.getIdentifier();
-			if (id.isEnabled())
-				addKnownResources(id);
-			else
-				removeKnownResources(id);
-			editModelEvent = new EditModelEvent(EditModelEvent.KNOWN_RESOURCES_CHANGED, this);
-			notifyListeners(editModelEvent);
-		}
-	}
-
-	private void removeKnownResources(IEnablementIdentifier id) {
-		List editModelResources = getEditModelResources(id);
-		EditModelResource editModelResource = null;
-		ResourceSetWorkbenchEditSynchronizer sync = (ResourceSetWorkbenchEditSynchronizer) getResourceSetSynchronizer();
-		for (int i = 0; i < editModelResources.size(); i++) {
-			editModelResource = (EditModelResource) editModelResources.get(i);
-			if (editModelResource.isAutoLoad() && sync != null) {
-				sync.disableAutoload(editModelResource.getURI());
-				preloadResourceUris.remove(editModelResource.getURI());
-			}
-			knownResourceUris.remove(editModelResource.getURI());
-			removeResource(editModelResource.getURI());
-		}
-
-	}
-
-
-
-	private void addKnownResources(IEnablementIdentifier id) {
-		List editModelResources = getEditModelResources(id);
-		EditModelResource editModelResource = null;
-		ResourceSetWorkbenchEditSynchronizer sync = (ResourceSetWorkbenchEditSynchronizer) getResourceSetSynchronizer();
-		for (int i = 0; i < editModelResources.size(); i++) {
-			editModelResource = (EditModelResource) editModelResources.get(i);
-			if (editModelResource.isAutoLoad() && sync != null) {
-				sync.enableAutoload(editModelResource.getURI());
-				preloadResourceUris.add(editModelResource.getURI());
-				getResource(editModelResource.getURI());
-			}
-			knownResourceUris.add(editModelResource.getURI());
-
-		}
-	}
-
-
-	/**
-	 * @return Returns the params.
-	 */
-	public Map getParams() {
-		return params;
-	}
-
-	/**
-	 * @param params
-	 *            The params to set.
-	 */
-	public void setParams(Map params) {
-		this.params = params;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EditModelCommand.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EditModelCommand.java
deleted file mode 100644
index 00eed90..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EditModelCommand.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emfworkbench.integration;
-
-import org.eclipse.emf.common.command.Command;
-
-
-
-/**
- * Insert the type's description here. Creation date: (05/22/01 8:57:00 AM)
- * 
- * @author: Administrator
- */
-public abstract class EditModelCommand extends AbstractEditModelCommand {
-	protected EditModelCommand() {
-		super();
-	}
-
-	public EditModelCommand(Command targetCommand) {
-		super(targetCommand);
-	}
-
-	public boolean canUndo() {
-		return getTarget().canUndo();
-	}
-
-	protected abstract void executeInModel(AbstractEditModelCommand cmd);
-
-	public EditModelCommand getEditModelCommand() {
-		return this;
-	}
-
-	public String getLabel() {
-		return getTarget().getLabel();
-	}
-
-	public void invertAndPush() {
-		executeInModel(this.inverted());
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EditModelEvent.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EditModelEvent.java
deleted file mode 100644
index 460a84a..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EditModelEvent.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emfworkbench.integration;
-
-
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.ecore.resource.Resource;
-
-public class EditModelEvent {
-	//These are the event codes.
-
-	// Used when the edit model is saved.
-	public static final int SAVE = 1;
-	// Used when the command stack becomes dirty.
-	public static final int DIRTY = 2;
-	// Used when a referenced resource is removed from the ResourceSet.
-	public static final int REMOVED_RESOURCE = 3;
-	// Used when a referenced resource is added to the ResourceSet.
-	public static final int ADDED_RESOURCE = 4;
-	// Used when the edit model is disposed
-	public static final int PRE_DISPOSE = 5;
-	// Used when a Resource is loaded or the first object
-	// is added to the contents when created.
-	public static final int LOADED_RESOURCE = 6;
-	// Used when a Resource is unloaded.
-	public static final int UNLOADED_RESOURCE = 7;
-	// Indicates that the list of known resources managed by the edit model is about to change
-	public static final int KNOWN_RESOURCES_ABOUT_TO_CHANGE = 8;
-	// Indicates that the list of known resources managed by the edit model has changed
-	public static final int KNOWN_RESOURCES_CHANGED = 9;
-
-	private int eventCode;
-	private EditModel editModel;
-	private List changedResources;
-
-	/**
-	 * Insert the method's description here. Creation date: (4/12/2001 2:46:59 PM)
-	 */
-	public EditModelEvent(int anEventCode, EditModel model) {
-		setEventCode(anEventCode);
-		setEditModel(model);
-	}
-
-	public void addResource(Resource aResource) {
-		if (aResource != null)
-			getChangedResources().add(aResource);
-	}
-
-	public void addResources(Collection someResources) {
-		if (someResources != null)
-			getChangedResources().addAll(someResources);
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (4/12/2001 2:46:43 PM)
-	 * 
-	 * @return java.util.List
-	 */
-	public java.util.List getChangedResources() {
-		if (changedResources == null)
-			changedResources = new ArrayList();
-		return changedResources;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (05/21/01 9:01:08 PM)
-	 * 
-	 * @return com.ibm.etools.j2ee.workbench.EditModel
-	 */
-	public EditModel getEditModel() {
-		return editModel;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (4/12/2001 2:46:43 PM)
-	 * 
-	 * @return int
-	 */
-	public int getEventCode() {
-		return eventCode;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (4/12/2001 2:46:43 PM)
-	 * 
-	 * @param newChangedResources
-	 *            java.util.List
-	 */
-	public void setChangedResources(java.util.List newChangedResources) {
-		changedResources = newChangedResources;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (05/21/01 9:01:08 PM)
-	 * 
-	 * @param newEditModel
-	 *            com.ibm.etools.j2ee.workbench.EditModel
-	 */
-	public void setEditModel(EditModel newEditModel) {
-		editModel = newEditModel;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (4/12/2001 2:46:43 PM)
-	 * 
-	 * @param newEventCode
-	 *            int
-	 */
-	public void setEventCode(int newEventCode) {
-		eventCode = newEventCode;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EditModelFactory.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EditModelFactory.java
deleted file mode 100644
index d97bbe4..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EditModelFactory.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.internal.emfworkbench.integration;
-
-
-import java.util.Map;
-
-import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
-
- 
-public class EditModelFactory implements IEditModelFactory {
-	protected boolean loadKnownResourcesAsReadOnly = true;
-
-	public EditModel createEditModelForRead(String editModelID, EMFWorkbenchContext context) {
-		return createEditModelForRead(editModelID, context, null);
-	}
-
-	public EditModel createEditModelForWrite(String editModelID, EMFWorkbenchContext context) {
-		return createEditModelForWrite(editModelID, context, null);
-	}
-
-	public EditModel createEditModelForRead(String editModelID, EMFWorkbenchContext context, Map params) {
-		EditModel editModel = new EditModel(editModelID, context, true);
-		editModel.setAccessAsReadForUnKnownURIs(loadKnownResourcesAsReadOnly);
-		return editModel;
-	}
-
-	public EditModel createEditModelForWrite(String editModelID, EMFWorkbenchContext context, Map params) {
-		EditModel editModel = new EditModel(editModelID, context, false);
-		editModel.setAccessAsReadForUnKnownURIs(loadKnownResourcesAsReadOnly);
-		return editModel;
-	}
-
-	public String getCacheID(String editModelID, Map params) {
-		return editModelID;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.internal.emfworkbench.integration.IEditModelFactory#setLoadKnownResourcesAsReadOnly(boolean)
-	 */
-	public void setLoadKnownResourcesAsReadOnly(boolean value) {
-		this.loadKnownResourcesAsReadOnly = value;
-	}
-
-	/**
-	 * @return Returns the loadKnownResourcesAsReadOnly.
-	 */
-	protected boolean isLoadKnownResourcesAsReadOnly() {
-		return loadKnownResourcesAsReadOnly;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EditModelListener.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EditModelListener.java
deleted file mode 100644
index aefe9e4..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EditModelListener.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emfworkbench.integration;
-
-
-/**
- * Insert the type's description here. Creation date: (4/11/2001 4:45:13 PM)
- * 
- * @author: Administrator
- */
-public interface EditModelListener {
-	/**
-	 * An event ocurred on the J2EEEditModel.
-	 */
-	void editModelChanged(EditModelEvent anEvent);
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EditModelNature.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EditModelNature.java
deleted file mode 100644
index f80a886..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EditModelNature.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Mar 4, 2004
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.wst.common.internal.emfworkbench.integration;
-
-import java.util.Map;
-
-import org.eclipse.jem.util.emf.workbench.nature.EMFNature;
-import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
-
-/**
- * @author schacher
- * 
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public abstract class EditModelNature extends EMFNature {
-	/**
-	 *  
-	 */
-	public EditModelNature() {
-		super();
-	}
-
-	public EditModel getEditModelForRead(String editModelKey, Object accessorKey) {
-		return getEditModelForRead(editModelKey, accessorKey, null);
-	}
-
-	public EditModel getEditModelForWrite(String editModelKey, Object accessorKey) {
-		return getEditModelForWrite(editModelKey, accessorKey, null);
-	}
-
-	public EditModel getEditModelForRead(String editModelKey, Object accessorKey, Map params) {
-		EditModel result = null;
-		if (getEmfContext() != null)
-			result = getEmfContext().getEditModelForRead(editModelKey, accessorKey, params);
-		return result;
-	}
-
-	public EditModel getEditModelForWrite(String editModelKey, Object accessorKey, Map params) {
-		EditModel result = null;
-		if (getEmfContext() != null)
-			result = getEmfContext().getEditModelForWrite(editModelKey, accessorKey, params);
-		return result;
-	}
-
-	protected EMFWorkbenchContext getEmfContext() {
-		return (EMFWorkbenchContext) getEmfContextBase();
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/IEditModelFactory.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/IEditModelFactory.java
deleted file mode 100644
index 873209f..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/IEditModelFactory.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.internal.emfworkbench.integration;
-
-import java.util.Map;
-
-import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
-
-
-public interface IEditModelFactory {
-
-	public abstract EditModel createEditModelForRead(String editModelID, EMFWorkbenchContext context);
-
-	public abstract EditModel createEditModelForRead(String editModelID, EMFWorkbenchContext context, Map params);
-
-	public abstract EditModel createEditModelForWrite(String editModelID, EMFWorkbenchContext context);
-
-	public abstract EditModel createEditModelForWrite(String editModelID, EMFWorkbenchContext context, Map params);
-
-	public String getCacheID(String editModelID, Map params);
-
-	public void setLoadKnownResourcesAsReadOnly(boolean value);
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/LooseComposedEditModel.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/LooseComposedEditModel.java
deleted file mode 100644
index f9a5f82..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/LooseComposedEditModel.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emfworkbench.integration;
-
-import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
-
-
-/**
- * @author Administrator
- */
-public class LooseComposedEditModel extends ComposedEditModel {
-
-	public LooseComposedEditModel(String editModelID, EMFWorkbenchContext context) {
-		super(editModelID, context);
-
-	}
-
-	public EditModel.Reference addChild(EditModel editModel) {
-		getChildren().add(editModel);
-		Reference ref = editModel.getReference();
-		getChildrenMap().put(ref, editModel);
-		return ref;
-	}
-
-	public void removeChild(EditModel editModel) {
-		getChildren().remove(editModel);
-		getChildrenMap().remove(editModel.getReference());
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ModelModifier.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ModelModifier.java
deleted file mode 100644
index 53d88ec..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ModelModifier.java
+++ /dev/null
@@ -1,615 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.internal.emfworkbench.integration;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CommandStack;
-import org.eclipse.emf.common.util.Enumerator;
-import org.eclipse.emf.ecore.EEnum;
-import org.eclipse.emf.ecore.EEnumLiteral;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.resource.Resource;
-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.wst.common.internal.emf.utilities.ExtendedEcoreUtil;
-
-/**
- * Insert the type's description here. Creation date: (4/6/2001 3:40:35 PM)
- * 
- * @author: Administrator
- */
-public class ModelModifier {
-	private static final String SET_PATTERN = "Set {0}"; //$NON-NLS-1$
-	private static final String ADD_PATTERN = "Add {0}"; //$NON-NLS-1$
-	private static final String REMOVE_PATTERN = "Remove {0}"; //$NON-NLS-1$
-	private static final String DEFAULT_COMMAND_LABEL = "Command"; //$NON-NLS-1$
-	private EditingDomain editingDomain;
-	private List helpers;
-	private List extendedHelpers;
-	protected List additionalCommands;
-	protected int status;
-	public static final int NO_VALUE_CHANGE = 0;
-	public static final int VALUE_CHANGE = 1;
-	public static final int ERROR = 2;
-
-	/**
-	 * J2EEModelModifier constructor comment.
-	 */
-	public ModelModifier() {
-		super();
-	}
-
-	/**
-	 * J2EEModelModifier constructor comment.
-	 * 
-	 * @param aDomain
-	 *            EditingDomain
-	 */
-	public ModelModifier(EditingDomain aDomain) {
-		setEditingDomain(aDomain);
-	}
-
-	/**
-	 * Add
-	 * 
-	 * @aHelper to the list of helper that will be executed.
-	 */
-	public void addHelper(ModifierHelper aHelper) {
-		if (aHelper != null && !getHelpers().contains(aHelper))
-			getHelpers().add(aHelper);
-	}
-
-	public void addAdditionalCommand(Command aCommand) {
-		if (aCommand != null && !getAdditionalCommands().contains(aCommand))
-			additionalCommands.add(aCommand);
-	}
-
-	/**
-	 * Return true if this modifier can create a command that will perform the necessary operation.
-	 */
-	public boolean canExecuteCommand() {
-		return getEditingDomain() != null;
-	}
-
-	public int executeWithStatus() {
-		try {
-			execute();
-			return status;
-		} finally {
-			status = -1;
-		}
-	}
-
-	/**
-	 * Execute this modifier using the recording mechanism of the StructedTextUndoManager. If this
-	 * modifier cannot record, try to execute using the CommandStack (if it can execute commands).
-	 * Return true if the execution was attempted.
-	 * 
-	 * @see canExecuteCommand()
-	 * @see canRecord()
-	 * @see run()
-	 */
-	public boolean execute(ModifierHelper aHelper) {
-		addHelper(aHelper);
-		return execute();
-	}
-
-	/**
-	 * Execute this modifier using the recording mechanism of the StructedTextUndoManager. If this
-	 * modifier cannot record, try to execute using the CommandStack (if it can execute commands).
-	 * Return true if the execution was attempted.
-	 * 
-	 * @see canExecuteCommand()
-	 * @see canRecord()
-	 * @see run()
-	 */
-	public boolean execute(List someHelpers) {
-		setHelpers(someHelpers);
-		return execute();
-	}
-
-	/**
-	 * Execute this modifier by creating a Command that is executed on the CommandStack. If this
-	 * modifier cannot execute commands, the execution will not take place. Return true if the
-	 * execution was attempted.
-	 * 
-	 * @see canExecuteCommand()
-	 */
-	public boolean execute() {
-		boolean result = false;
-		if (canExecuteCommand()) {
-			try {
-				Command command = createCommand();
-				result = command != null;
-				if (result) {
-					getCommandStack().execute(command);
-				}
-			} finally {
-				release();
-			}
-		} else {
-			setStatus(ERROR);
-		}
-		return result;
-	}
-
-	protected CommandStack getCommandStack() {
-		if (getEditingDomain() != null)
-			return getEditingDomain().getCommandStack();
-		return null;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (4/6/2001 2:53:17 PM)
-	 * 
-	 * @return EditingDomain
-	 */
-	public EditingDomain getEditingDomain() {
-		return editingDomain;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (4/10/2001 8:46:35 AM)
-	 * 
-	 * @return J2EEModifierHelper
-	 */
-	public ModifierHelper getFirstHelper() {
-		if (helpers != null && getHelpers().size() > 0)
-			return (ModifierHelper) getHelpers().get(0);
-		return null;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (4/10/2001 8:46:35 AM)
-	 * 
-	 * @return java.util.List
-	 */
-	public java.util.List getHelpers() {
-		if (helpers == null)
-			helpers = new ArrayList();
-		return helpers;
-	}
-
-	public java.util.List getAdditionalCommands() {
-		if (additionalCommands == null)
-			additionalCommands = new ArrayList();
-		return additionalCommands;
-	}
-
-	/**
-	 * Release all model artifacts.
-	 */
-	protected void release() {
-		setEditingDomain(null);
-		setHelpers(null);
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (4/6/2001 2:53:17 PM)
-	 * 
-	 * @param newEditingDomain
-	 *            EditingDomain
-	 */
-	public void setEditingDomain(EditingDomain newEditingDomain) {
-		editingDomain = newEditingDomain;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (4/10/2001 8:46:35 AM)
-	 * 
-	 * @param newHelpers
-	 *            java.util.List
-	 */
-	public void setHelpers(java.util.List newHelpers) {
-		helpers = newHelpers;
-	}
-
-	protected void setStatus(int statusCode) {
-		if (statusCode > status)
-			status = statusCode;
-	}
-
-	/**
-	 * Return an AddCommand that will be executed by a CommandStack.
-	 */
-	protected Command createAddCommand(ModifierHelper aHelper) {
-		Object value = getValue(aHelper);
-		Command command = null;
-		if (valueChanged(aHelper.getOwner(), aHelper.getFeature(), value, false)) {
-			command = AddCommand.create(getEditingDomain(), aHelper.getOwner(), aHelper.getFeature(), value);
-			((AbstractCommand) command).setLabel(createCommandLabel(ADD_PATTERN, aHelper.getFeature()));
-			setStatus(VALUE_CHANGE);
-		} else {
-			setStatus(NO_VALUE_CHANGE);
-		}
-		return command;
-	}
-
-	/**
-	 * Return a Command that will be executed by a CommandStack. The default is to return null.
-	 * Subclasses should override this method.
-	 */
-	public Command createCommand() {
-		Command chainedCommand = createCommand(null, getHelpers());
-		if (null == chainedCommand && additionalCommands != null && additionalCommands.isEmpty()) {
-			setStatus(ERROR);
-			return null;
-		}
-		chainedCommand = appendAdditionalCommands(chainedCommand);
-		return chainedCommand;
-	}
-
-	protected Command createCommand(Command chainedCommand, List helpersArg) {
-		if (null == extendedHelpers) {
-			extendedHelpers = new ArrayList();
-		}
-
-		if (!helpersArg.isEmpty()) {
-			Iterator it = helpersArg.iterator();
-			Command nextCommand = null;
-			while (it.hasNext()) {
-				nextCommand = createCommand((ModifierHelper) it.next());
-				if (chainedCommand == null)
-					chainedCommand = nextCommand;
-				else if (nextCommand != null)
-					chainedCommand = chainedCommand.chain(nextCommand);
-			}
-		}
-		if (!extendedHelpers.isEmpty()) {
-			List copy = new ArrayList();
-			copy.addAll(extendedHelpers);
-			extendedHelpers.clear();
-			chainedCommand = createCommand(chainedCommand, copy);
-		}
-		return chainedCommand;
-	}
-
-	protected Command appendAdditionalCommands(Command chainedCommand) {
-		if (additionalCommands != null && !additionalCommands.isEmpty()) {
-			Command command;
-			for (int i = 0; i < additionalCommands.size(); i++) {
-				command = (Command) additionalCommands.get(i);
-				if (chainedCommand == null)
-					chainedCommand = command;
-				else
-					chainedCommand = chainedCommand.chain(command);
-			}
-		}
-		return chainedCommand;
-	}
-
-	/**
-	 * Return a Command that will be executed by a CommandStack.
-	 */
-	protected Command createCommand(ModifierHelper aHelper) {
-		if (aHelper == null)
-			return null;
-		Command command1, command2;
-		ModifierHelper ownerHelper = aHelper.getOwnerHelper();
-		if (aHelper.shouldUnsetValue() && ownerHelper != null)
-			return null; //we are unsetting a value on an owner that does not exist so do not
-		// create the owner
-		command1 = createCommand(ownerHelper);
-		command2 = primCreateCommand(aHelper);
-
-		if (command1 != null) {
-			if (command2 == null)
-				command2 = command1;
-			else
-				command2 = command2.chain(command1);
-		}
-		return command2;
-	}
-
-	protected String createCommandLabel(String aPattern, EStructuralFeature feature) {
-		String replacement = feature == null ? DEFAULT_COMMAND_LABEL : feature.getName();
-		return java.text.MessageFormat.format(aPattern, new String[]{replacement});
-	}
-
-	/**
-	 * Return a Command that will be executed by a CommandStack. The default is to return null.
-	 * Subclasses should override this method.
-	 */
-	protected Command createManyCommand(ModifierHelper aHelper) {
-		if (aHelper.shouldUnsetValue())
-			return createRemoveCommand(aHelper);
-		return createAddCommand(aHelper);
-	}
-
-	protected EObject createObjectFromHelper(ModifierHelper aHelper) {
-		return aHelper.createNewObjectFromFeature();
-	}
-
-	public class ProxyWrappingCommand extends AbstractCommand {
-		protected Command baseCommand = null;
-		protected EObject eObject = null;
-		protected Resource resource = null;
-
-		public ProxyWrappingCommand(Command baseCommand, EObject eObject) {
-			this.baseCommand = baseCommand;
-			this.eObject = eObject;
-			this.resource = eObject.eResource();
-		}
-
-		public boolean canExecute() {
-			return baseCommand.canExecute();
-		}
-
-		public void execute() {
-			ExtendedEcoreUtil.becomeProxy(eObject, resource);
-			baseCommand.execute();
-		}
-
-		public boolean canUndo() {
-			return baseCommand.canUndo();
-		}
-
-		public void undo() {
-			baseCommand.undo();
-			ExtendedEcoreUtil.removeProxy(eObject, resource);
-		}
-
-		public void redo() {
-			baseCommand.redo();
-		}
-
-		public Collection getResult() {
-			return baseCommand.getResult();
-		}
-
-		public Collection getAffectedObjects() {
-			return baseCommand.getAffectedObjects();
-		}
-
-		public String getLabel() {
-			return baseCommand.getLabel();
-		}
-
-		public String getDescription() {
-			return baseCommand.getDescription();
-		}
-
-		public void dispose() {
-			super.dispose();
-			baseCommand.dispose();
-		}
-	}
-
-	/**
-	 * Return a Remove Command that will be executed by a CommandStack.
-	 */
-	protected Command createRemoveCommand(ModifierHelper aHelper) {
-		Object value = getValue(aHelper);
-		Command command = null;
-		EStructuralFeature feature = aHelper.getFeature();
-		if (valueChanged(aHelper.getOwner(), feature, value, true)) {
-			if (isValueEqual(aHelper, value)) {
-				command = RemoveCommand.create(getEditingDomain(), aHelper.getOwner(), feature, (Collection) value);
-			} else {
-				command = RemoveCommand.create(getEditingDomain(), aHelper.getOwner(), feature, value);
-			}
-			((AbstractCommand) command).setLabel(createCommandLabel(REMOVE_PATTERN, feature));
-			setStatus(VALUE_CHANGE);
-		} else {
-			setStatus(NO_VALUE_CHANGE);
-		}
-		return command;
-	}
-
-	private boolean isValueEqual(ModifierHelper aHelper, Object value) {
-		return aHelper.getOwner().eGet(aHelper.getFeature()) == value;
-	}
-
-	/**
-	 * Return a SetCommand that will be executed by a CommandStack.
-	 */
-	protected Command createSingleCommand(ModifierHelper aHelper) {
-		Object value = getValue(aHelper);
-		Command command = null;
-		if (valueChanged(aHelper.getOwner(), aHelper.getFeature(), value, aHelper.shouldUnsetValue())) {
-			command = SetCommand.create(getEditingDomain(), aHelper.getOwner(), aHelper.getFeature(), value);
-			((AbstractCommand) command).setLabel(createCommandLabel(SET_PATTERN, aHelper.getFeature()));
-			setStatus(VALUE_CHANGE);
-		} else {
-			setStatus(NO_VALUE_CHANGE);
-		}
-		return command;
-	}
-
-	protected Object createValueFromHelper(ModifierHelper aHelper) {
-		EObject newObject = createObjectFromHelper(aHelper);
-		setNewObjectAttributes(newObject, aHelper);
-		return newObject;
-	}
-
-	protected boolean enumValueChanged(EObject anObject, EStructuralFeature aFeature, Object aValue) {
-		if (!anObject.eIsSet(aFeature))
-			return true;
-		Enumerator existingEnumerator = (Enumerator) anObject.eGet(aFeature);
-		Enumerator newEnumerator = getEnumerator(aFeature, aValue);
-		return existingEnumerator != newEnumerator;
-	}
-
-	private Enumerator getEnumerator(EStructuralFeature aFeature, Object aValue) {
-		if (aValue instanceof Enumerator)
-			return (Enumerator) aValue;
-		EEnum anEnum = (EEnum) aFeature.getEType();
-		EEnumLiteral literal = null;
-		if (aValue instanceof String)
-			literal = anEnum.getEEnumLiteral((String) aValue);
-		else if (aValue instanceof Integer)
-			literal = anEnum.getEEnumLiteral(((Integer) aValue).intValue());
-		if (literal != null)
-			return literal.getInstance();
-		return null;
-	}
-
-	protected Object getValue(ModifierHelper aHelper) {
-		if (aHelper.mustCreateValue()) {
-			Object value = createValueFromHelper(aHelper);
-			aHelper.setValue(value);
-		}
-		return aHelper.getValue();
-	}
-
-	protected boolean manyValueChanged(EObject anObject, EStructuralFeature aFeature, Object aValue, boolean isUnset) {
-		List list = (List) anObject.eGet(aFeature);
-		if (isUnset)
-			return list.contains(aValue) || (list == aValue && !list.isEmpty());
-		return !list.contains(aValue);
-	}
-
-	/**
-	 * Return a Command that will be executed by a CommandStack. The default is to return null.
-	 * Subclasses should override this method.
-	 */
-	protected Command primCreateCommand(ModifierHelper aHelper) {
-		Command command = doCreateCommand(aHelper);
-		if (aHelper.shouldUnsetValue()) {
-			Object value = aHelper.getValue();
-			if (value instanceof EObject && !((EObject) value).eIsProxy()) {
-				command = new ProxyWrappingCommand(command, (EObject) value);
-			}
-		}
-		return command;
-	}
-
-	protected Command doCreateCommand(ModifierHelper aHelper) {
-		if (!aHelper.isComplete()) {
-			setStatus(ERROR);
-			return null;
-		}
-		Command command = null;
-		if (aHelper.getFeature().isMany())
-			command = createManyCommand(aHelper);
-		else
-			command = createSingleCommand(aHelper);
-
-		if (null != command) {
-			List localHelpers = ModifierHelperRegistry.getInstance().getHelpers(aHelper);
-			if (null != localHelpers) {
-				extendedHelpers.addAll(localHelpers);
-			}
-		}
-		return command;
-
-	}
-
-	/**
-	 * Run using
-	 * 
-	 * @aHelper. This will set a MOF attibute value to the owner of the helper.
-	 */
-	protected void primRun(ModifierHelper aHelper) {
-		if (aHelper.isComplete()) {
-			Object value = getValue(aHelper);
-			if (valueChanged(aHelper.getOwner(), aHelper.getFeature(), value, aHelper.shouldUnsetValue()))
-				setObjectAttribute(aHelper.getOwner(), aHelper.getFeature(), value, aHelper.shouldUnsetValue());
-		}
-	}
-
-	/**
-	 * The default is to do nothing. Subclasses should override this method if they are using
-	 * recordable commands. The implementation of this method should update the MOF model directly.
-	 * Any modification will be recorded.
-	 */
-	public void run() {
-		if (!getHelpers().isEmpty()) {
-			Iterator it = getHelpers().iterator();
-			while (it.hasNext())
-				run((ModifierHelper) it.next());
-		}
-	}
-
-	/**
-	 * Run using
-	 * 
-	 * @aHelper's ownerHelper first before running with
-	 * @aHelper.
-	 */
-	protected void run(ModifierHelper aHelper) {
-		if (aHelper != null) {
-			run(aHelper.getOwnerHelper());
-			primRun(aHelper);
-		}
-	}
-
-	protected void setNewObjectAttributes(EObject anObject, ModifierHelper aHelper) {
-		HashMap attributes = aHelper.getAttributes();
-		Iterator it = attributes.keySet().iterator();
-		EStructuralFeature feature;
-		Object value = null;
-		while (it.hasNext()) {
-			feature = (EStructuralFeature) it.next();
-			value = attributes.get(feature);
-			setObjectAttribute(anObject, feature, value, false);
-		}
-	}
-
-	protected void setObjectAttribute(EObject anObject, EStructuralFeature aFeature, Object aValue, boolean shouldUnsetValue) {
-		if (aFeature.isMany())
-			setObjectManyAttribute(anObject, aFeature, aValue, shouldUnsetValue);
-		else
-			setObjectSingleAttribute(anObject, aFeature, aValue, shouldUnsetValue);
-	}
-
-	protected void setObjectEnumAttribute(EObject anObject, EStructuralFeature aFeature, Object aValue) {
-		Enumerator enumerator = getEnumerator(aFeature, aValue);
-		anObject.eSet(aFeature, enumerator);
-	}
-
-	protected void setObjectManyAttribute(EObject anObject, EStructuralFeature aFeature, Object aValue, boolean shouldUnsetValue) {
-		List list = (List) anObject.eGet(aFeature);
-		if (shouldUnsetValue)
-			list.remove(aValue);
-		else
-			list.add(aValue);
-	}
-
-	protected void setObjectSingleAttribute(EObject anObject, EStructuralFeature aFeature, Object aValue, boolean shouldUnsetValue) {
-		if (shouldUnsetValue)
-			anObject.eUnset(aFeature);
-		else if (aFeature.getEType() instanceof EEnum)
-			setObjectEnumAttribute(anObject, aFeature, aValue);
-		else
-			anObject.eSet(aFeature, aValue);
-	}
-
-	protected boolean singleValueChanged(EObject anObject, EStructuralFeature aFeature, Object aValue, boolean isUnset) {
-		if (aFeature.getEType() instanceof EEnum)
-			return enumValueChanged(anObject, aFeature, aValue);
-
-		Object existingValue = anObject.eGet(aFeature);
-		if (existingValue == null && aValue == null)
-			return false;
-		if (existingValue != null && !existingValue.equals(aValue))
-			return true;
-		if (aValue != null && !aValue.equals(existingValue))
-			return true;
-		return false;
-	}
-
-	protected boolean valueChanged(EObject anObject, EStructuralFeature aFeature, Object aValue, boolean isUnset) {
-		if (aFeature.isMany())
-			return manyValueChanged(anObject, aFeature, aValue, isUnset);
-		return singleValueChanged(anObject, aFeature, aValue, isUnset);
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ModifierHelper.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ModifierHelper.java
deleted file mode 100644
index 1020c31..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ModifierHelper.java
+++ /dev/null
@@ -1,362 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.internal.emfworkbench.integration;
-
-
-import java.util.HashMap;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.EClassImpl;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.internal.emf.utilities.FeatureValueConversionException;
-import org.eclipse.wst.common.internal.emf.utilities.FeatureValueConverter;
-
-/**
- * Insert the type's description here. Creation date: (4/6/2001 3:23:36 PM)
- * 
- * @author: Administrator
- */
-public class ModifierHelper {
-
-	private EObject owner;
-	private ModifierHelper ownerHelper;
-	private OwnerProvider ownerProvider;
-	private Object value;
-	private EStructuralFeature feature;
-	private HashMap attributes;
-	private boolean shouldUnsetValue = false;
-	private String valueXSITypeName;
-	private FeatureValueConverter featureValueConverter;
-
-	public static final int ACTION_SET = 0;
-	public static final int ACTION_UNSET = 1;
-	public static final int ACTION_BOTH = 2;
-
-	/**
-	 * J2EEModifierHelper constructor comment.
-	 */
-	public ModifierHelper() {
-		super();
-	}
-
-	/**
-	 * J2EEModifierHelper constructor comment.
-	 */
-	public ModifierHelper(EObject anOwner, EStructuralFeature aFeature, Object aValue) {
-		setOwner(anOwner);
-		setFeature(aFeature);
-		setValue(aValue);
-	}
-
-	/**
-	 * J2EEModifierHelper constructor comment.
-	 */
-	public ModifierHelper(ModifierHelper anOwnerHelper, EStructuralFeature aFeature, Object aValue) {
-		setOwnerHelper(anOwnerHelper);
-		setFeature(aFeature);
-		setValue(aValue);
-	}
-
-	/**
-	 * J2EEModifierHelper constructor comment.
-	 */
-	public ModifierHelper(OwnerProvider anOwnerProvider, EStructuralFeature aFeature, Object aValue) {
-		setOwnerProvider(anOwnerProvider);
-		setFeature(aFeature);
-		setValue(aValue);
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (4/6/2001 3:28:16 PM)
-	 * 
-	 * @return java.util.HashMap
-	 */
-	public void addAttribute(EStructuralFeature aFeature, Object aValue) {
-		if (aFeature != null && aValue != null)
-			getAttributes().put(aFeature, aValue);
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (4/6/2001 3:28:16 PM)
-	 * 
-	 * @param newValue
-	 *            java.lang.Object
-	 */
-	protected Object convertValue(java.lang.Object newValue) {
-		return getFeatureValueConverter().convertValue(newValue, getFeature());
-	}
-
-	//Calling this will cause the value to be removed or unset from the owner.
-	public void doUnsetValue() {
-		shouldUnsetValue = true;
-		if (value != null && feature != null && !feature.isMany())
-			setValue(null);
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (4/6/2001 3:28:16 PM)
-	 * 
-	 * @return java.util.HashMap
-	 */
-	public java.util.HashMap getAttributes() {
-		if (attributes == null)
-			attributes = new HashMap();
-		return attributes;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (4/6/2001 3:28:16 PM)
-	 * 
-	 * @return org.eclipse.emf.ecore.EFactory
-	 */
-	protected org.eclipse.emf.ecore.EFactory getFactory() {
-		return getPackage().getEFactoryInstance();
-	}
-
-	protected EPackage getPackage() {
-		return ((EClassImpl) getFeatureType()).getEPackage();
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (4/6/2001 3:28:16 PM)
-	 * 
-	 * @return org.eclipse.emf.ecore.EStructuralFeature
-	 */
-	public org.eclipse.emf.ecore.EStructuralFeature getFeature() {
-		return feature;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (4/6/2001 3:28:16 PM)
-	 * 
-	 * @return EObject
-	 */
-	protected EObject getFeatureType() {
-		return getFeature().getEType();
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (5/10/2001 4:51:58 PM)
-	 * 
-	 * @return com.ibm.etools.j2ee.commands.FeatureValueConverter
-	 */
-	public FeatureValueConverter getFeatureValueConverter() {
-		if (featureValueConverter == null)
-			featureValueConverter = FeatureValueConverter.DEFAULT;
-		return featureValueConverter;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (4/6/2001 3:28:16 PM)
-	 * 
-	 * @return String
-	 */
-	protected String getNewValueTypeName() {
-		if (getValueXSITypeName() != null && getValueXSITypeName().length() > 0)
-			return getValueXSITypeName();
-		return (((EClass) getFeatureType()).getName());
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (4/6/2001 3:28:16 PM)
-	 * 
-	 * @return org.eclipse.emf.ecore.EObject
-	 */
-	public org.eclipse.emf.ecore.EObject getOwner() {
-		if (owner == null) {
-			OwnerProvider provider = getOwnerProvider();
-			EObject providerOwner = null;
-			if (provider != null)
-				providerOwner = provider.getOwner();
-			if (providerOwner == null && getOwnerHelper() != null)
-				providerOwner = (EObject) getOwnerHelper().getValue();
-			return providerOwner;
-		}
-		return owner;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (4/8/2001 2:47:54 PM)
-	 * 
-	 * @return com.ibm.etools.j2ee.commands.J2EEModifierHelper
-	 */
-	public ModifierHelper getOwnerHelper() {
-		if (ownerHelper == null) {
-			if (getOwnerProvider() != null && getOwnerProvider().getOwner() == null)
-				return getOwnerProvider().getOwnerHelper();
-		}
-		return ownerHelper;
-	}
-
-	public ModifierHelper primGetOwnerHelper() {
-		return ownerHelper;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (9/18/2001 1:31:14 PM)
-	 * 
-	 * @return com.ibm.etools.j2ee.ui.J2EEOwnerProvider
-	 */
-	public OwnerProvider getOwnerProvider() {
-		return ownerProvider;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (4/6/2001 3:28:16 PM)
-	 * 
-	 * @return java.lang.Object
-	 */
-	public java.lang.Object getValue() {
-		return value;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (4/10/2001 3:39:31 PM)
-	 * 
-	 * @return java.lang.String
-	 */
-	public java.lang.String getValueXSITypeName() {
-		return valueXSITypeName;
-	}
-
-	/**
-	 * This will automatically get called from the J2EEModelModifier before executing so it is not
-	 * necessary to call it directly.
-	 */
-	public boolean isComplete() {
-		boolean result = true;
-		if (getOwnerHelper() != null)
-			result = getOwnerHelper().isComplete();
-		if (!mustCreateValue())
-			result = getValue() != null || shouldUnsetValue();
-		else
-			result = getFeatureType() != null;
-		return result && getFeature() != null && (getOwner() != null || getOwnerHelper() != null);
-	}
-
-	public boolean mustCreateValue() {
-		return getValue() == null && getFeature() != null && !shouldUnsetValue();
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (4/6/2001 3:28:16 PM)
-	 * 
-	 * @param newValue
-	 *            java.lang.Object
-	 */
-	public void primSetValue(java.lang.Object newValue) {
-		value = newValue;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (4/6/2001 3:28:16 PM)
-	 * 
-	 * @param newFeature
-	 *            org.eclipse.emf.ecore.EStructuralFeature
-	 */
-	public void setFeature(org.eclipse.emf.ecore.EStructuralFeature newFeature) {
-		feature = newFeature;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (5/10/2001 4:51:58 PM)
-	 * 
-	 * @param newFeatureValueConverter
-	 *            com.ibm.etools.j2ee.commands.FeatureValueConverter
-	 */
-	public void setFeatureValueConverter(FeatureValueConverter newFeatureValueConverter) {
-		featureValueConverter = newFeatureValueConverter;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (4/6/2001 3:28:16 PM)
-	 * 
-	 * @param newOwner
-	 *            org.eclipse.emf.ecore.EObject
-	 */
-	public void setOwner(org.eclipse.emf.ecore.EObject newOwner) {
-		owner = newOwner;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (4/8/2001 2:47:54 PM)
-	 * 
-	 * @param newOwnerHelper
-	 *            com.ibm.etools.j2ee.commands.J2EEModifierHelper
-	 */
-	public void setOwnerHelper(ModifierHelper newOwnerHelper) {
-		ownerHelper = newOwnerHelper;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (9/18/2001 1:31:14 PM)
-	 * 
-	 * @param newOwnerProvider
-	 *            com.ibm.etools.j2ee.ui.J2EEOwnerProvider
-	 */
-	public void setOwnerProvider(OwnerProvider newOwnerProvider) {
-		ownerProvider = newOwnerProvider;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (4/6/2001 3:28:16 PM)
-	 * 
-	 * @param newValue
-	 *            java.lang.Object
-	 */
-	public void setValue(java.lang.Object newValue) {
-		try {
-			primSetValue(convertValue(newValue));
-		} catch (FeatureValueConversionException featureException) {
-			Logger.getLogger().logError(featureException);
-			primSetValue(null);
-		}
-	}
-
-	/**
-	 * Treat an empty String as a null value. Creation date: (4/6/2001 3:28:16 PM)
-	 * 
-	 * @param newValue
-	 *            java.lang.Object
-	 */
-	public void setValueFromWidget(String newValue) {
-		Object data = newValue;
-		if (newValue != null && newValue.length() == 0)
-			data = null;
-		setValue(data);
-		if (data == null)
-			doUnsetValue();
-		else
-			shouldUnsetValue = false;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (4/10/2001 3:39:31 PM)
-	 * 
-	 * @param newValueXSITypeName
-	 *            java.lang.String
-	 */
-	public void setValueXSITypeName(java.lang.String newValueXSITypeName) {
-		valueXSITypeName = newValueXSITypeName;
-	}
-
-	public boolean shouldUnsetValue() {
-		return shouldUnsetValue;
-	}
-
-	public EObject createNewObjectFromFeature() {
-		EClass metaClass = (EClass) getPackage().getEClassifier(getNewValueTypeName());
-		return getFactory().create(metaClass);
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ModifierHelperChainer.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ModifierHelperChainer.java
deleted file mode 100644
index d36148d..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ModifierHelperChainer.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emfworkbench.integration;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-
-
-/**
- * @version 1.0
- * @author
- */
-public class ModifierHelperChainer {
-
-	ModifierHelper helper;
-
-	public ModifierHelperChainer(EStructuralFeature feature, EObject owner, Object value) {
-		helper = new ModifierHelper();
-
-		if (owner != null)
-			helper.setOwner(owner);
-
-		helper.setFeature(feature);
-
-		if (value != null)
-			helper.setValue(value);
-
-	}
-
-	public ModifierHelper getHelper() {
-		return helper;
-	}
-
-	public void setOwnerBasedOnType(Object owner) {
-		if (owner instanceof EObject)
-			helper.setOwner((EObject) owner);
-		else if (owner instanceof ModifierHelper)
-			helper.setOwnerHelper((ModifierHelper) owner);
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ModifierHelperFactory.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ModifierHelperFactory.java
deleted file mode 100644
index bc41a62..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ModifierHelperFactory.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Apr 27, 2004
- *
- * To change the template for this generated file go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-package org.eclipse.wst.common.internal.emfworkbench.integration;
-
-/**
- * @author jsholl
- * 
- * To change the template for this generated type comment go to Window - Preferences - Java - Code
- * Generation - Code and Comments
- */
-public interface ModifierHelperFactory {
-
-
-	/**
-	 * @param baseHelper
-	 * @param actionFlag
-	 * @return
-	 */
-	ModifierHelper getHelper(ModifierHelper baseHelper, int actionFlag);
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ModifierHelperRegistry.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ModifierHelperRegistry.java
deleted file mode 100644
index b1da8ad..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ModifierHelperRegistry.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Apr 27, 2004
- * 
- * To change the template for this generated file go to Window - Preferences -
- * Java - Code Generation - Code and Comments
- */
-package org.eclipse.wst.common.internal.emfworkbench.integration;
-
-import java.util.ArrayList;
-import java.util.Hashtable;
-import java.util.Iterator;
-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.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EClassifier;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jem.util.logger.proxy.Logger;
-
-/**
- * @author jsholl
- *  
- */
-public class ModifierHelperRegistry {
-	private static final String PLUGIN_ID = "org.eclipse.wst.common.internal.emfworkbench.integration"; //$NON-NLS-1$
-	private static final String EXTENSION_POINT = "ModifierHelperFactory"; //$NON-NLS-1$
-	private static final String FACTORY_CLASS = "class"; //$NON-NLS-1$
-	private static final String PACKAGE = "package"; //$NON-NLS-1$
-	private static final String PACKAGE_URI = "uri"; //$NON-NLS-1$
-	private static final String NAME = "name"; //$NON-NLS-1$
-	private static final String TYPE = "type"; //$NON-NLS-1$
-	private static final String FEATURE = "feature"; //$NON-NLS-1$
-	private static final String FEATURE_ACTION = "action"; //$NON-NLS-1$
-	private static final String FEATURE_ACTION_SET = "set"; //$NON-NLS-1$
-	private static final String FEATURE_ACTION_UNSET = "unset"; //$NON-NLS-1$
-	private static final String FEATURE_ACTION_BOTH = "both"; //default //$NON-NLS-1$
-	private static ModifierHelperRegistry INSTANCE = null;
-	// Hashtable mapping features to a list of FactoryHolders
-	private Hashtable featureHash = new Hashtable();
-	private Hashtable factoryHash = new Hashtable();
-
-	private class FactoryHolder {
-		private int actionType;
-		private IConfigurationElement element;
-
-		public FactoryHolder(IConfigurationElement element, int actionType) {
-			this.element = element;
-			this.actionType = actionType;
-		}
-
-		public ModifierHelperFactory getFactory(int actionTypeArg) {
-			if (this.actionType == actionTypeArg || this.actionType == ModifierHelper.ACTION_BOTH) {
-				String hashKey = getFactoryHash(element);
-				ModifierHelperFactory factory = (ModifierHelperFactory) factoryHash.get(hashKey);
-				if (null == factory) {
-					try {
-						factory = (ModifierHelperFactory) element.createExecutableExtension(FACTORY_CLASS);
-						factoryHash.put(hashKey, factory);
-					} catch (CoreException e) {
-						Logger.getLogger().logError(e);
-					}
-				}
-				return factory;
-			}
-			return null;
-		}
-
-		public boolean equals(Object obj) {
-			if (super.equals(obj)) {
-				return true;
-			}
-			FactoryHolder holder = (FactoryHolder) obj;
-			return getFactoryHash(element).equals(getFactoryHash(holder.element));
-		}
-	}
-
-	private ModifierHelperRegistry() {
-		readExtensions();
-	}
-
-	private void readExtensions() {
-		IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(PLUGIN_ID, EXTENSION_POINT);
-		if (point == null)
-			return;
-		IConfigurationElement[] elements = point.getConfigurationElements();
-		for (int i = 0; i < elements.length; i++) {
-			readFactory(elements[i]);
-		}
-	}
-
-	private void readFactory(IConfigurationElement element) {
-		String factoryClassName = element.getAttribute(FACTORY_CLASS);
-		if (null == factoryClassName) {
-			logError(element, "No " + FACTORY_CLASS + " defined."); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		IConfigurationElement[] packages = element.getChildren(PACKAGE);
-		if (packages.length == 0) {
-			logError(element, "No " + PACKAGE + " defined."); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		for (int j = 0; j < packages.length; j++) {
-			readPackage(element, packages[j]);
-		}
-	}
-
-	private void readPackage(IConfigurationElement factoryElement, IConfigurationElement element) {
-		String packageURI = element.getAttribute(PACKAGE_URI);
-		if (null == packageURI) {
-			logError(element, "No " + PACKAGE_URI + " defined."); //$NON-NLS-1$ //$NON-NLS-2$
-			return;
-		}
-		EPackage ePackage = EPackage.Registry.INSTANCE.getEPackage(packageURI);
-		if (null == ePackage) {
-			logError(element, PACKAGE + " " + packageURI + " can not be found."); //$NON-NLS-1$ //$NON-NLS-2$
-			return;
-		}
-		IConfigurationElement[] types = element.getChildren(TYPE);
-		if (types.length == 0) {
-			logError(element, "No " + TYPE + " defined."); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		for (int i = 0; i < types.length; i++) {
-			readType(factoryElement, ePackage, types[i]);
-		}
-	}
-
-	private void readType(IConfigurationElement factoryElement, EPackage ePackage, IConfigurationElement element) {
-		String typeName = element.getAttribute(NAME);
-		if (null == typeName) {
-			logError(element, "No " + NAME + " defined."); //$NON-NLS-1$ //$NON-NLS-2$
-			return;
-		}
-		EClassifier eClassifier = ePackage.getEClassifier(typeName);
-		if (null == eClassifier) {
-			logError(element, TYPE + " " + typeName + " can not be found in " + PACKAGE + " " + ePackage.getName()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			return;
-		}
-		EClass eClass = (EClass) eClassifier;
-		IConfigurationElement[] features = element.getChildren(FEATURE);
-		if (features.length == 0) {
-			logError(element, "No " + FEATURE + " defined."); //$NON-NLS-1$ //$NON-NLS-2$
-			return;
-		}
-		for (int i = 0; i < features.length; i++) {
-			readFeature(factoryElement, eClass, features[i]);
-		}
-	}
-
-	private void readFeature(IConfigurationElement factoryElement, EClass eClass, IConfigurationElement element) {
-		String featureName = element.getAttribute(NAME);
-		if (null == featureName) {
-			logError(element, "No " + NAME + " defined."); //$NON-NLS-1$ //$NON-NLS-2$
-			return;
-		}
-		String action = element.getAttribute(FEATURE_ACTION);
-		if (null == action) {
-			action = FEATURE_ACTION_BOTH;
-		}
-		int actionType = -1;
-		if (action.equalsIgnoreCase(FEATURE_ACTION_BOTH)) {
-			actionType = ModifierHelper.ACTION_BOTH;
-		} else if (action.equalsIgnoreCase(FEATURE_ACTION_SET)) {
-			actionType = ModifierHelper.ACTION_SET;
-		} else if (action.equalsIgnoreCase(FEATURE_ACTION_UNSET)) {
-			actionType = ModifierHelper.ACTION_UNSET;
-		}
-		if (actionType == -1) {
-			logError(element, "Invalid " + FEATURE_ACTION + "=" + action + " defined.  Valid values are: " + FEATURE_ACTION_BOTH + ", " + FEATURE_ACTION_SET + ", or " + FEATURE_ACTION_UNSET); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-			return;
-		}
-		EStructuralFeature feature = null;
-		EList allFeatures = eClass.getEAllStructuralFeatures();
-		EStructuralFeature tempFeature = null;
-		Iterator iterator = allFeatures.iterator();
-		while (null == feature && iterator.hasNext()) {
-			tempFeature = (EStructuralFeature) iterator.next();
-			if (tempFeature.getName().equals(featureName)) {
-				feature = tempFeature;
-			}
-		}
-		if (feature == null) {
-			logError(element, FEATURE + " " + featureName + " can not be found in " + TYPE + " " + eClass.getName()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			return;
-		}
-		List factoryHolderList = (List) featureHash.get(feature);
-		if (null == factoryHolderList) {
-			factoryHolderList = new ArrayList();
-			featureHash.put(feature, factoryHolderList);
-		}
-		FactoryHolder factoryHolder = new FactoryHolder(factoryElement, actionType);
-		if (factoryHolderList.contains(factoryHolder)) {
-			logError(element, "Duplicate" + FEATURE + ":" + featureName + " defined for " + FACTORY_CLASS + ":" + factoryElement.getAttribute(FACTORY_CLASS)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-			return;
-		}
-		factoryHolderList.add(factoryHolder);
-	}
-
-	private String getFactoryHash(IConfigurationElement factoryElement) {
-		return factoryElement.getDeclaringExtension().getNamespace() + factoryElement.getAttribute(FACTORY_CLASS);
-	}
-
-	public static void logError(IConfigurationElement element, String text) {
-		IExtension extension = element.getDeclaringExtension();
-		StringBuffer buf = new StringBuffer();
-		buf.append("Plugin " + extension.getNamespace() + ", extension " + extension.getExtensionPointUniqueIdentifier()); //$NON-NLS-1$ //$NON-NLS-2$
-		buf.append("\n" + text); //$NON-NLS-1$
-		Logger.getLogger().logError(buf.toString());
-	}
-
-	public static ModifierHelperRegistry getInstance() {
-		if (null == INSTANCE) {
-			INSTANCE = new ModifierHelperRegistry();
-		}
-		return INSTANCE;
-	}
-
-	/**
-	 * returns a list of ModifierHelpers
-	 * 
-	 * @param baseHelper
-	 * @param actionFlag
-	 * @return
-	 */
-	public List getHelpers(ModifierHelper baseHelper) {
-		int actionFlag = baseHelper.shouldUnsetValue() ? ModifierHelper.ACTION_UNSET : ModifierHelper.ACTION_SET;
-		EStructuralFeature feature = baseHelper.getFeature();
-		List factoryList = getFactories(feature, actionFlag);
-		if (null == factoryList) {
-			return null;
-		}
-		ArrayList helpers = new ArrayList();
-		Iterator it = factoryList.iterator();
-		ModifierHelperFactory factory = null;
-		while (it.hasNext()) {
-			factory = (ModifierHelperFactory) it.next();
-			Object helper = factory.getHelper(baseHelper, actionFlag);
-			if (null != helper) {
-				helpers.add(helper);
-			}
-		}
-		return helpers;
-	}
-
-	private List getFactories(EStructuralFeature feature, int actionFlag) {
-		List factoryHolderList = (List) featureHash.get(feature);
-		if (null == factoryHolderList) {
-			return null;
-		}
-		List factoryList = new ArrayList();
-		ModifierHelperFactory factory = null;
-		for (int i = 0; i < factoryHolderList.size(); i++) {
-			factory = ((FactoryHolder) factoryHolderList.get(i)).getFactory(actionFlag);
-			if (null != factory) {
-				factoryList.add(factory);
-			}
-		}
-		return factoryList;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/OwnerProvider.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/OwnerProvider.java
deleted file mode 100644
index e082439..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/OwnerProvider.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emfworkbench.integration;
-
-import org.eclipse.emf.ecore.EObject;
-
-
-/**
- * Insert the type's description here. Creation date: (6/20/2001 10:24:46 PM)
- * 
- * @author: Administrator
- */
-public interface OwnerProvider {
-	/**
-	 * Return the EObject that will serve as the owner of a given J2EEModifierHelper.
-	 */
-	EObject getOwner();
-
-	/**
-	 * Return a J2EEModifierHelper for the owner if the owner does not yet exist.
-	 */
-	ModifierHelper getOwnerHelper();
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ProjectResourceSetEditImpl.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ProjectResourceSetEditImpl.java
deleted file mode 100644
index aa8f271..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ProjectResourceSetEditImpl.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Mar 4, 2004
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.wst.common.internal.emfworkbench.integration;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.jem.internal.util.emf.workbench.ProjectResourceSetImpl;
-import org.eclipse.wst.common.internal.emf.resource.ReferencedResource;
-import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
-
-/**
- * @author schacher
- * 
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public class ProjectResourceSetEditImpl extends ProjectResourceSetImpl {
-
-	/**
-	 * @param aProject
-	 */
-	public ProjectResourceSetEditImpl(IProject aProject) {
-		super(aProject);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jem.internal.util.emf.workbench.ProjectResourceSetImpl#createResource(org.eclipse.emf.common.util.URI)
-	 */
-	public Resource createResource(URI uri) {
-		Resource result = super.createResource(uri);
-		if (result != null && WorkbenchResourceHelper.isReferencedResource(result))
-			WorkbenchResourceHelper.cacheSynchronizationStamp((ReferencedResource) result);
-		return result;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ResourceSetWorkbenchEditSynchronizer.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ResourceSetWorkbenchEditSynchronizer.java
deleted file mode 100644
index 3c5c4b5..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ResourceSetWorkbenchEditSynchronizer.java
+++ /dev/null
@@ -1,356 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Mar 4, 2004
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.wst.common.internal.emfworkbench.integration;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-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.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.common.util.WrappedException;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.jem.internal.util.emf.workbench.EMFWorkbenchContextFactory;
-import org.eclipse.jem.util.emf.workbench.ProjectResourceSet;
-import org.eclipse.jem.util.emf.workbench.ResourceSetWorkbenchSynchronizer;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jem.util.plugin.JEMUtilPlugin;
-import org.eclipse.wst.common.internal.emf.resource.ReferencedResource;
-import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
-
-/**
- * @author schacher
- * 
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public class ResourceSetWorkbenchEditSynchronizer extends ResourceSetWorkbenchSynchronizer implements IResourceDeltaVisitor {
-	private static final String CLASS_EXTENSION = "class"; //$NON-NLS-1$
-	private static final String JAVA_EXTENSION = "java"; //$NON-NLS-1$
-	private Set recentlySavedFiles = new HashSet();
-	private Map ignoredFilesCache = new HashMap();
-
-	/** The emf resources to be removed from the resource set as a result of a delta */
-	protected List deferredRemoveResources = new ArrayList();
-	protected List deferredUnloadResources = new ArrayList();
-	protected List deferredLoadResources = new ArrayList();
-
-	protected List autoloadResourcesURIs = new ArrayList();
-
-
-
-	/**
-	 * @param aResourceSet
-	 * @param aProject
-	 */
-	public ResourceSetWorkbenchEditSynchronizer(ResourceSet aResourceSet, IProject aProject) {
-		super(aResourceSet, aProject);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.internal.emfworkbench.ResourceSetWorkbenchSynchronizer#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
-	 */
-	public void resourceChanged(IResourceChangeEvent event) {
-		super.resourceChanged(event);
-		try {
-			acceptDelta(event);
-			notifyExtendersIfNecessary();
-			processDeferredResources();
-		} catch (Exception e) {
-			e.printStackTrace();
-		} finally {
-			deferredRemoveResources.clear();
-			deferredUnloadResources.clear();
-			deferredLoadResources.clear();
-		}
-	}
-
-	protected void processDeferredRemovedResources() {
-		Resource resource = null;
-		for (int i = 0; i < deferredRemoveResources.size(); i++) {
-			resource = (Resource) deferredRemoveResources.get(i);
-			resourceSet.getResources().remove(resource);
-			resource.unload();
-		}
-	}
-
-	protected void processDeferredUnloadedResources() {
-		Resource resource = null;
-		for (int i = 0; i < deferredUnloadResources.size(); i++) {
-			resource = (Resource) deferredUnloadResources.get(i);
-			resource.unload();
-		}
-	}
-
-	private void processDeferredLoadResources() {
-		URI uri = null;
-		for (int i = 0; i < deferredLoadResources.size(); i++) {
-			uri = (URI) deferredLoadResources.get(i);
-			try {
-				resourceSet.getResource(uri, true);
-			} catch (WrappedException ex) {
-				Logger.getLogger().logError(ex);
-			}
-
-		}
-	}
-
-	protected void acceptDelta(IResourceChangeEvent event) {
-		IResourceDelta delta = event.getDelta();
-		// search for changes to any projects using a visitor
-		if (delta != null) {
-			try {
-				delta.accept(this);
-			} catch (Exception e) {
-				Logger.getLogger().logError(e);
-			}
-		}
-	}
-
-	/**
-	 * The project is going away so we need to cleanup ourself and the ResourceSet. TODO Need to
-	 * push up this code to ResourceSetWorkbenchSynchronizer in next release.
-	 */
-	protected void release() {
-		if (JEMUtilPlugin.isActivated()) {
-			try {
-				if (resourceSet instanceof ProjectResourceSet)
-					((ProjectResourceSet) resourceSet).release();
-			} finally {
-				EMFWorkbenchContextFactory.INSTANCE.removeCachedProject(getProject());
-				dispose();
-			}
-		}
-	}
-
-	private void processDeferredResources() {
-		processDeferredRemovedResources();
-		processDeferredUnloadedResources();
-		processDeferredLoadResources();
-	}
-
-	public boolean visit(IResourceDelta delta) {
-		IResource resource = delta.getResource();
-		// only respond to project changes
-		if (resource != null) {
-			if (resource.getType() == IResource.PROJECT) {
-				IProject p = (IProject) resource;
-				if (isInterrestedInProject(p)) {
-					currentProjectDelta = delta;
-					return true;
-				}
-				// added line
-				currentProjectDelta = null;
-				return false;
-			}
-			if (resource.getType() == IResource.FILE && isInterrestedInFile((IFile) resource)) {
-				switch (delta.getKind()) {
-					case IResourceDelta.REMOVED :
-						removedResource((IFile) resource);
-						break;
-					case IResourceDelta.ADDED :
-						addedResource((IFile) resource);
-						break;
-					case IResourceDelta.CHANGED :
-						if ((delta.getFlags() & IResourceDelta.CONTENT) != 0)
-							changedResource((IFile) resource);
-						break;
-					default :
-						if ((delta.getFlags() & IResourceDelta.MOVED_FROM) != 0 || (delta.getFlags() & IResourceDelta.MOVED_TO) != 0)
-							movedResource((IFile) resource);
-						break;
-				}
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * Queue up the <code>Resource</code> that corresponds to <code>aFile</code>, for removal
-	 * from the cache of resources.
-	 * 
-	 * @post Return true if a <code>Resource</code> was queued up to be removed.
-	 */
-	protected boolean removedResource(IFile aFile) {
-		return processResource(aFile, true);
-	}
-
-	/**
-	 * Queue up the <code>Resource</code> that corresponds to <code>aFile</code>, for reload.
-	 * 
-	 * @post Return true if a <code>Resource</code> was queued up to be reloaded.
-	 */
-	protected boolean addedResource(IFile aFile) {
-		//Process resource as a refresh.
-		return processResource(aFile, false);
-	}
-
-	protected boolean processResource(IFile aFile, boolean isRemove) {
-		Resource resource = getResource(aFile);
-		if ((resource != null) || (recentlySavedFiles.contains(resource))){
-			if (resource.isModified()) {
-				if (WorkbenchResourceHelper.isReferencedResource(resource)) {
-					ReferencedResource refRes = (ReferencedResource) resource;
-					if (!refRes.shouldForceRefresh())
-						return false; //Do not do anything
-				} else
-					return false;
-			}
-			if (isRemove)
-				deferredRemoveResources.add(resource);
-			else if (resource.isLoaded())
-				deferredUnloadResources.add(resource);
-			else if (autoloadResourcesURIs.contains(resource.getURI()))
-				deferredLoadResources.add(resource.getURI());
-		}
-		return false;
-	}
-
-	/**
-	 * For now, do the same as if the <code>aFile</code> was removed.
-	 */
-	protected boolean movedResource(IFile aFile) {
-		return removedResource(aFile);
-	}
-
-	/**
-	 * The contents of <code>aFile</code> have changed in the Workbench and we may need to update
-	 * our cached resources.
-	 * 
-	 * We will process this resource to be refreshed and not removed.
-	 * 
-	 * @post Return true if a <code>Resource</code> was actually removed.
-	 */
-
-	protected boolean changedResource(IFile aFile) {
-		//Process resource as a refresh.
-		return processResource(aFile, false);
-	}
-
-	protected Resource getResource(IFile aFile) {
-		return resourceSet.getResource(URI.createPlatformResourceURI(aFile.getFullPath().toString()), false);
-	}
-
-
-	/**
-	 * This method should be called prior to writing to an IFile from a MOF resource.
-	 */
-	public void preSave(IFile aFile) {
-		if (aFile != null) {
-			recentlySavedFiles.add(aFile);
-			ignoredFilesCache.remove(aFile);
-		}
-	}
-
-	/**
-	 * This method should be called after a preSave if the save fails
-	 */
-	public void removeFromRecentlySavedList(IFile aFile) {
-		if (aFile != null) {
-			recentlySavedFiles.remove(aFile);
-			ignoredFilesCache.remove(aFile);
-		}
-	}
-
-	/**
-	 * This method should be called just after writing to an IFile from a MOF resource.
-	 * 
-	 * @deprecated No longer needs to be called.
-	 */
-	public void postSave(IFile aFile) {
-		//TODO remove this method
-	}
-
-	/**
-	 * Return <code>true</code> if <code>aProject</code> has the projectNatureID.
-	 */
-	protected boolean isInterrestedInProject(IProject aProject) {
-		return aProject.equals(getProject());
-	}
-
-	/**
-	 * Optimized not to be not interrested in files with an extension of .java or .class or if the
-	 * file has just been saved by our own internal mechanism.
-	 */
-	protected boolean isInterrestedInFile(IFile aFile) {
-		String extension = aFile.getFileExtension();
-		if (CLASS_EXTENSION.equals(extension) || JAVA_EXTENSION.equals(extension))
-			return false;
-		if (recentlySavedFiles.remove(aFile)) {
-			cacheIgnored(aFile);
-			return false;
-		}
-		return !hasIgnored(aFile);
-	}
-
-	/**
-	 * Return true if we have already ignored this <code>file</code> and that its modification
-	 * stamp is the same as when we processed it.
-	 * 
-	 * @param file
-	 * @return
-	 */
-	private boolean hasIgnored(IFile file) {
-		Long cachedStamp = (Long) ignoredFilesCache.get(file);
-		if (cachedStamp == null)
-			return false;
-		long stamp = WorkbenchResourceHelper.computeModificationStamp(file);
-		return cachedStamp.longValue() == stamp;
-	}
-
-	/**
-	 * Cache the modification stamp of the <code>file</code>.
-	 * 
-	 * @param file
-	 */
-	private void cacheIgnored(IFile file) {
-		long stamp = WorkbenchResourceHelper.computeModificationStamp(file);
-		ignoredFilesCache.put(file, new Long(stamp));
-	}
-
-	public void enableAutoload(URI uri) {
-		URI normalized = resourceSet.getURIConverter().normalize(uri);
-		autoloadResourcesURIs.add(normalized);
-	}
-
-	public void disableAutoload(URI uri) {
-		URI normalized = resourceSet.getURIConverter().normalize(uri);
-		autoloadResourcesURIs.remove(normalized);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.internal.emfworkbench.ResourceSetWorkbenchSynchronizer#initialize()
-	 */
-	protected void initialize() {
-		getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.PRE_CLOSE | IResourceChangeEvent.PRE_DELETE | IResourceChangeEvent.POST_CHANGE);
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/validateedit/IValidateEditContext.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/validateedit/IValidateEditContext.java
deleted file mode 100644
index e965900..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/validateedit/IValidateEditContext.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on May 18, 2004
- */
-package org.eclipse.wst.common.internal.emfworkbench.validateedit;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.wst.common.internal.emfworkbench.integration.EditModel;
-
-
-/**
- * @author jlanuti This is the abstraction layer for validate edit
- */
-public interface IValidateEditContext extends ResourceStateValidatorPresenter {
-
-	public static final String CLASS_KEY = "ValidateEditContext"; //$NON-NLS-1$
-
-	public void setEditModel(EditModel fValidator);
-
-	public IStatus validateState(EditModel fValidator);
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/validateedit/ResourceStateInputProvider.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/validateedit/ResourceStateInputProvider.java
deleted file mode 100644
index 4b8bc60..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/validateedit/ResourceStateInputProvider.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emfworkbench.validateedit;
-
-
-import java.util.List;
-
-public interface ResourceStateInputProvider {
-	/**
-	 * Return true if any of the controlled resources or files has been modified.
-	 * 
-	 * @return boolean
-	 */
-	boolean isDirty();
-
-	/**
-	 * Return a <code>List</code> of the MOF Resources that are being managed. Synchronization
-	 * checking will only work if you are using the emf.workbench plugin apis for loading resources.
-	 * This will ensure that you get an instance of a <code>ReferencedResource</code>. This
-	 * resource type is capable of caching its last known synchronization stamp that may be used to
-	 * test if the resource is consitent with the underlying IFile.
-	 * 
-	 * @return List
-	 */
-	List getResources();
-
-	/**
-	 * Return a <code>List</code> of IFiles that are not MOF Resources that are also being
-	 * modified.
-	 * 
-	 * @return List
-	 */
-	List getNonResourceFiles();
-
-	/**
-	 * Return a subset of the List from getNonResourceFiles() that are inconsistent with the
-	 * underlying java.io.File.
-	 * 
-	 * @return List
-	 * @see ResourceStateInputProvider#getNonResourceFiles()
-	 */
-	List getNonResourceInconsistentFiles();
-
-	/**
-	 * It is the responsibility of the provider to cache the synchronization stamp for the List of
-	 * <code>roNonResourceFiles</code>. This stamp will be used to determine the inconsistent
-	 * files. This is only necessary of IFiles that are not MOF resources.
-	 * 
-	 * @param roNonResourceFiles
-	 * @see ResourceStateInputProvider#getNonResourceInconsistentFiles()
-	 */
-	void cacheNonResourceValidateState(List roNonResourceFiles);
-}
-
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/validateedit/ResourceStateValidator.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/validateedit/ResourceStateValidator.java
deleted file mode 100644
index ef337c4..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/validateedit/ResourceStateValidator.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.internal.emfworkbench.validateedit;
-
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jem.util.plugin.JEMUtilPlugin;
-
-public interface ResourceStateValidator {
-	static final IStatus OK_STATUS = new Status(IStatus.OK, JEMUtilPlugin.ID, 0, "", null); //$NON-NLS-1$
-
-	/**
-	 * This method should be called whenever a <code>presenter</code> is activated (becomes
-	 * active). This will check the timestamps of the underlying files to see if they are different
-	 * from the last cached modified value. The <code>presenter</code> should be prepared to
-	 * prompt the user if they would like to refresh with the contents on disk if we are dirty.
-	 */
-	void checkActivation(ResourceStateValidatorPresenter presenter) throws CoreException;
-
-	/**
-	 * This method should be called whenever a <code>presenter</code> looses activation. This will
-	 * check the timestamps of the underlying files to see if they are different from the last
-	 * cached modified value. The <code>presenter</code> should be prepared to prompt the user if
-	 * they would like to refresh with the contents on disk if we are dirty.
-	 */
-	void lostActivation(ResourceStateValidatorPresenter presenter) throws CoreException;
-
-	/**
-	 * This method should be called the first time the files are about to be modified after a
-	 * <code>presenter</code> becomes active. The returned IStatus may have an ERROR status which
-	 * should be presented to the user.
-	 */
-	IStatus validateState(ResourceStateValidatorPresenter presenter) throws CoreException;
-
-	/**
-	 * This method should be called prior to the <code>presenter</code> saving the modified
-	 * contents. This will check the consistency of the underlying files to ensure that they are
-	 * synchronized. If true is returned, the save can proceed.
-	 */
-	boolean checkSave(ResourceStateValidatorPresenter presenter) throws CoreException;
-
-	/**
-	 * Return true if there are any read only files.
-	 */
-	boolean checkReadOnly();
-}
-
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/validateedit/ResourceStateValidatorImpl.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/validateedit/ResourceStateValidatorImpl.java
deleted file mode 100644
index 8be0814..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/validateedit/ResourceStateValidatorImpl.java
+++ /dev/null
@@ -1,446 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.internal.emfworkbench.validateedit;
-
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
-import org.eclipse.wst.common.internal.emf.resource.ReferencedResource;
-import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
-
-public class ResourceStateValidatorImpl implements ResourceStateValidator {
-	protected ResourceStateInputProvider provider;
-	protected Map lastNonRefreshStateMap;
-	protected boolean isCheckingConsistency;
-
-	class RefreshRunnable implements IWorkspaceRunnable {
-		CoreException thrownException;
-		List files;
-		List resources;
-
-		RefreshRunnable(List someFiles, List inconsistentResources) {
-			files = someFiles;
-			resources = inconsistentResources;
-		}
-
-		public CoreException getThrownException() {
-			return thrownException;
-		}
-
-		public void run(IProgressMonitor aMonitor) {
-			try {
-				prepareResourcesForRefresh(resources);
-				primRefreshFiles(files);
-			} catch (CoreException e) {
-				thrownException = e;
-			}
-		}
-	}
-
-	/**
-	 * Constructor for ResourceStateValidator.
-	 */
-	public ResourceStateValidatorImpl(ResourceStateInputProvider aProvider) {
-		provider = aProvider;
-	}
-
-	/**
-	 * This method should be called whenever <code>aListener</code> is activated (becomes active).
-	 * This will check the timestamps of the underlying files to see if they are different from the
-	 * last cached modified value. <code>aListener</code> should be prepared to prompt the user if
-	 * they would like to refresh with the contents on disk if we are dirty.
-	 */
-	public void checkActivation(ResourceStateValidatorPresenter presenter) throws CoreException {
-		checkConsistency(presenter);
-	}
-
-	public void lostActivation(ResourceStateValidatorPresenter presenter) throws CoreException {
-		checkConsistency(presenter);
-	}
-
-	public boolean checkSave(ResourceStateValidatorPresenter presenter) throws CoreException {
-		if (presenter == null)
-			return false;
-		if (!provider.isDirty())
-			return false;
-		List inconsistentResources = getInconsistentResources();
-		List inconsistentFiles = getFiles(inconsistentResources);
-		inconsistentFiles = addOtherInconsistentFiles(inconsistentFiles);
-		if (inconsistentFiles == null || inconsistentFiles.isEmpty())
-			return true;
-		return presenter.promptForInconsistentFileOverwrite(inconsistentFiles);
-	}
-
-	/**
-	 * @see ResourceStateValidator#checkReadOnly()
-	 */
-	public boolean checkReadOnly() {
-		boolean result = checkReadOnlyResources();
-		if (!result)
-			result = checkReadOnlyNonResourceFiles();
-		return result;
-	}
-
-	/**
-	 * Method checkReadOnlyNonResourceFiles.
-	 * 
-	 * @return boolean
-	 */
-	private boolean checkReadOnlyNonResourceFiles() {
-		List files = provider.getNonResourceFiles();
-		if (files == null || files.isEmpty())
-			return false;
-		int size = files.size();
-		IFile file = null;
-		for (int i = 0; i < size; i++) {
-			file = (IFile) files.get(i);
-			if (file.isReadOnly())
-				return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Method checkReadOnlyResources.
-	 * 
-	 * @return boolean
-	 */
-	private boolean checkReadOnlyResources() {
-		List resources = provider.getResources();
-		if (resources == null || resources.isEmpty())
-			return false;
-		int size = resources.size();
-		Resource res = null;
-		IFile file = null;
-		for (int i = 0; i < size; i++) {
-			res = (Resource) resources.get(i);
-			file = WorkbenchResourceHelper.getFile(res);
-			if (file != null && file.isReadOnly())
-				return true;
-		}
-		return false;
-	}
-
-	protected void checkConsistency(ResourceStateValidatorPresenter presenter) throws CoreException {
-		if (isCheckingConsistency || presenter == null)
-			return;
-		isCheckingConsistency = true;
-		try {
-			List inconsistentResources = getInconsistentResources();
-			List inconsistentFiles = getFiles(inconsistentResources);
-			inconsistentFiles = addOtherInconsistentFiles(inconsistentFiles);
-			if (inconsistentFiles == null || inconsistentFiles.isEmpty())
-				return;
-			boolean shouldRefreshFiles = true;
-			//Defect 208654 & 209631 want prompt no matter what.
-			if (anyFileChangedSinceLastRefreshPrompt(inconsistentFiles)) {
-				clearLastNonRefreshStateMap();
-				shouldRefreshFiles = presenter.promptForInconsistentFileRefresh(inconsistentFiles);
-			} else
-				return;
-			if (shouldRefreshFiles)
-				refreshFiles(inconsistentFiles, inconsistentResources);
-			else
-				cacheLastNonRefreshFileStamps(inconsistentFiles);
-		} finally {
-			isCheckingConsistency = false;
-		}
-	}
-
-	/**
-	 * Method cacheLastNonRefreshFileStamps.
-	 * 
-	 * @param inconsistentFiles
-	 */
-	private void cacheLastNonRefreshFileStamps(List inconsistentFiles) {
-		if (inconsistentFiles != null && !inconsistentFiles.isEmpty()) {
-			Map map = getLastNonRefreshStateMap();
-			IFile file = null;
-			long stamp = 0;
-			for (int i = 0; i < inconsistentFiles.size(); i++) {
-				file = (IFile) inconsistentFiles.get(i);
-				stamp = WorkbenchResourceHelper.computeModificationStamp(file);
-				map.put(file, new Long(stamp));
-			}
-		}
-	}
-
-	/**
-	 * Method cacheValidateState.
-	 * 
-	 * @param result
-	 */
-	private void cacheValidateState(IStatus aStatus, List readOnlyResources, List roNonResourceFiles) {
-		if (aStatus.isOK()) {
-			if (readOnlyResources != null && !readOnlyResources.isEmpty()) {
-				ReferencedResource res = null;
-				for (int i = 0; i < readOnlyResources.size(); i++) {
-					res = (ReferencedResource) readOnlyResources.get(i);
-					WorkbenchResourceHelper.setSynhronizationStamp(res, computeModificationStamp(res));
-				}
-			}
-			provider.cacheNonResourceValidateState(roNonResourceFiles);
-		}
-	}
-
-	private void clearLastNonRefreshStateMap() {
-		if (lastNonRefreshStateMap != null)
-			lastNonRefreshStateMap.clear();
-	}
-
-	/**
-	 * Method anyFileChangedSinceLastRefreshPrompt.
-	 * 
-	 * @param inconsistentFiles
-	 * @return boolean
-	 */
-	private boolean anyFileChangedSinceLastRefreshPrompt(List inconsistentFiles) {
-		if (inconsistentFiles == null || inconsistentFiles.isEmpty())
-			return false;
-		if (lastNonRefreshStateMap == null || lastNonRefreshStateMap.isEmpty())
-			return true;
-		int size = inconsistentFiles.size();
-		IFile file = null;
-		Long stamp = null;
-		for (int i = 0; i < size; i++) {
-			file = (IFile) inconsistentFiles.get(i);
-			stamp = (Long) getLastNonRefreshStateMap().get(file);
-			if (stamp == null || (stamp.longValue() != WorkbenchResourceHelper.computeModificationStamp(file)))
-				return true;
-		}
-		return false;
-	}
-
-	protected List addOtherInconsistentFiles(List inconsistentFiles) {
-		if (inconsistentFiles == null || inconsistentFiles.isEmpty())
-			return getNonResourceInconsistentFiles();
-		List nonResFiles = getNonResourceInconsistentFiles();
-		if (nonResFiles != null)
-			inconsistentFiles.addAll(nonResFiles);
-		return inconsistentFiles;
-	}
-
-	/**
-	 * Method getNonResourceInconsistentFiles.
-	 * 
-	 * @return List
-	 */
-	private List getNonResourceInconsistentFiles() {
-		List files = provider.getNonResourceInconsistentFiles();
-		if (files != null && !files.isEmpty())
-			return files;
-		//Determine consistency based on the synchronization of the IFile
-		files = provider.getNonResourceFiles();
-		if (files == null || files.isEmpty())
-			return Collections.EMPTY_LIST;
-		List inconsistent = null;
-		int size = files.size();
-		IFile file = null;
-		for (int i = 0; i < size; i++) {
-			file = (IFile) files.get(i);
-			if (file.isAccessible() && !file.isSynchronized(IResource.DEPTH_ZERO)) {
-				if (inconsistent == null)
-					inconsistent = new ArrayList();
-				inconsistent.add(file);
-			}
-		}
-		if (inconsistent == null)
-			inconsistent = Collections.EMPTY_LIST;
-		return inconsistent;
-	}
-
-	protected List getInconsistentResources() {
-		List mofResources = provider.getResources();
-		List inconsistent = null;
-		int size = mofResources.size();
-		Resource res = null;
-		ReferencedResource refRes = null;
-		for (int i = 0; i < size; i++) {
-			res = (Resource) mofResources.get(i);
-			if (WorkbenchResourceHelper.isReferencedResource(res)) {
-				refRes = (ReferencedResource) res;
-				if (!WorkbenchResourceHelper.isConsistent(refRes)) {
-					if (inconsistent == null)
-						inconsistent = new ArrayList();
-					inconsistent.add(refRes);
-				}
-			}
-		}
-		if (inconsistent == null)
-			inconsistent = Collections.EMPTY_LIST;
-		return inconsistent;
-	}
-
-	protected List getFiles(List refResources) {
-		List files = new ArrayList(refResources.size());
-		IFile file = null;
-		ReferencedResource refRes = null;
-		for (int i = 0; i < refResources.size(); i++) {
-			refRes = (ReferencedResource) refResources.get(i);
-			file = WorkbenchResourceHelper.getFile(refRes);
-			if (file != null)
-				files.add(file);
-		}
-		return files;
-	}
-
-	/**
-	 * This method should be called at least the first time a ResourceStateValidatorPresenter
-	 * becomes active and is about to edit its contents. The returned IStatus may have an ERROR
-	 * status which should be presented to the user.
-	 */
-	public IStatus validateState(ResourceStateValidatorPresenter presenter) throws CoreException {
-		List roResources, nonResROFiles, roFiles = null;
-		List[] readOnly = selectReadOnlyResources(provider.getResources());
-		roResources = readOnly[0];
-		roFiles = readOnly[1];
-		nonResROFiles = selectReadOnlyFiles(provider.getNonResourceFiles());
-		if (nonResROFiles != null) {
-			if (roFiles == null)
-				roFiles = nonResROFiles;
-			else
-				roFiles.addAll(nonResROFiles);
-		}
-		if (roFiles == null || roFiles.isEmpty())
-			return OK_STATUS;
-		IFile[] files = new IFile[roFiles.size()];
-		roFiles.toArray(files);
-		Object ctx = presenter != null ? presenter.getValidateEditContext() : null;
-		IStatus result = ResourcesPlugin.getWorkspace().validateEdit(files, ctx);
-		cacheValidateState(result, roResources, nonResROFiles);
-		if (!result.isOK())
-			checkConsistency(presenter);
-		return result;
-	}
-
-	/**
-	 * Method selectReadOnlyFiles.
-	 * 
-	 * @param list
-	 * @param roFiles
-	 */
-	private List selectReadOnlyFiles(List files) {
-		if (files == null || files.isEmpty())
-			return files;
-		int size = files.size();
-		List readOnly = null;
-		IFile file = null;
-		for (int i = 0; i < size; i++) {
-			file = (IFile) files.get(i);
-			if (file.isReadOnly()) {
-				if (readOnly == null)
-					readOnly = new ArrayList(size);
-				readOnly.add(file);
-			}
-		}
-		return readOnly;
-	}
-
-	/**
-	 * Method selectReadOnlyResources.
-	 * 
-	 * @param list
-	 * @param roFiles
-	 * @return List
-	 */
-	private List[] selectReadOnlyResources(List resources) {
-		if (resources == null || resources.isEmpty())
-			return new List[]{resources, null};
-		IFile file = null;
-		int size = resources.size();
-		Resource res = null;
-		List readOnly = null;
-		List roFiles = null;
-		for (int i = 0; i < size; i++) {
-			res = (Resource) resources.get(i);
-			file = WorkbenchResourceHelper.getFile(res);
-			if (file != null && file.isReadOnly()) {
-				if (readOnly == null)
-					readOnly = new ArrayList(size);
-				readOnly.add(res);
-				if (roFiles == null)
-					roFiles = new ArrayList(size);
-				roFiles.add(file);
-			}
-		}
-		return new List[]{readOnly, roFiles};
-	}
-
-	protected long computeModificationStamp(ReferencedResource resource) {
-		return WorkbenchResourceHelper.computeModificationStamp(resource);
-	}
-
-
-	protected void refreshFiles(List someFiles, List inconsitentResources) throws CoreException {
-		RefreshRunnable runnable = new RefreshRunnable(someFiles, inconsitentResources);
-		ResourcesPlugin.getWorkspace().run(runnable, null);
-		if (runnable.getThrownException() != null)
-			throw runnable.getThrownException();
-	}
-
-	protected void primRefreshFiles(List someFiles) throws CoreException {
-		int size = someFiles.size();
-		IFile file = null;
-		for (int i = 0; i < size; i++) {
-			file = (IFile) someFiles.get(i);
-			if (!file.isSynchronized(IResource.DEPTH_ZERO))
-				file.refreshLocal(IResource.DEPTH_ONE, null);
-			else
-				refreshResource(file);
-		}
-	}
-
-	/**
-	 * We need to remove the Resource that corresponds to the <code>file</code> to force a
-	 * refresh.
-	 */
-	protected void refreshResource(IFile file) {
-		Resource res = WorkbenchResourceHelperBase.getResource(file);
-		if (res != null)
-			res.unload();
-	}
-
-	/**
-	 * Force the resources to not be dirty to ensure that they will be removed from their
-	 * ResourceSet when their file is refreshed.
-	 */
-	protected void prepareResourcesForRefresh(List refResources) {
-		ReferencedResource res = null;
-		for (int i = 0; i < refResources.size(); i++) {
-			res = (ReferencedResource) refResources.get(i);
-			res.setForceRefresh(true);
-		}
-	}
-
-	/**
-	 * Gets the lastNonRefreshStateMap.
-	 * 
-	 * @return Returns a Map
-	 */
-	protected Map getLastNonRefreshStateMap() {
-		if (lastNonRefreshStateMap == null)
-			lastNonRefreshStateMap = new HashMap();
-		return lastNonRefreshStateMap;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/validateedit/ResourceStateValidatorPresenter.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/validateedit/ResourceStateValidatorPresenter.java
deleted file mode 100644
index 47545d3..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/validateedit/ResourceStateValidatorPresenter.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.emfworkbench.validateedit;
-
-
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-
-public interface ResourceStateValidatorPresenter {
-	/**
-	 * Present to the user that the <code>inconsistentFiles</code> will need to be refreshed in
-	 * the workbench. Return true if the refresh should occur. The List will be a list of IFiles.
-	 * 
-	 * @param inconsistentFiles
-	 * @return boolean
-	 */
-	boolean promptForInconsistentFileRefresh(List inconsistentFiles);
-
-	/**
-	 * Return the context (Shell) that would be passed to the validateEdit method. If this method
-	 * returns null, a prompt to check out code will not be presented to the user.
-	 * 
-	 * @see org.eclipse.core.resources.IWorkspace#validateEdit(org.eclipse.core.resources.IFile[],
-	 *      java.lang.Object)
-	 */
-	Object getValidateEditContext();
-
-	/**
-	 * Present a dialog to the user that indicates that the user is about to save and overwrite the
-	 * list of <code>inconsitentFiles</codes>.  Return true if
-	 * the overwrite should proceed.  The list of <code>inconsitentFiles</codes> will
-	 * be a list of IFiles. 
-	 * @param inconsistentFiles
-	 * @return boolean
-	 */
-	boolean promptForInconsistentFileOverwrite(List inconsistentFiles);
-
-	/**
-	 * This method should be called by any action that is about to edit any contents of any IFile.
-	 */
-	public IStatus validateState();
-}
-
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/validateedit/ValidateEditHeadlessContext.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/validateedit/ValidateEditHeadlessContext.java
deleted file mode 100644
index 11efe03..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/validateedit/ValidateEditHeadlessContext.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on May 18, 2004
- */
-package org.eclipse.wst.common.internal.emfworkbench.validateedit;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.wst.common.internal.emfworkbench.integration.EditModel;
-
-
-/**
- * @author jlanuti Headless Validate Edit Context Implementation
- */
-public class ValidateEditHeadlessContext implements IValidateEditContext {
-
-	protected boolean fNeedsStateValidation = true;
-	protected boolean fMessageUp = false;
-	protected EditModel fValidator = null;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.internal.emfworkbench.validateedit.IValidateEditContext#validateState()
-	 */
-	public IStatus validateState() {
-		// For now do nothing in headless state
-		return Status.OK_STATUS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.internal.emfworkbench.validateedit.ResourceStateValidatorPresenter#getValidateEditContext()
-	 */
-	public Object getValidateEditContext() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.internal.emfworkbench.validateedit.ResourceStateValidatorPresenter#promptForInconsistentFileOverwrite(java.util.List)
-	 */
-	public boolean promptForInconsistentFileOverwrite(List inconsistentFiles) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.internal.emfworkbench.validateedit.ResourceStateValidatorPresenter#promptForInconsistentFileRefresh(java.util.List)
-	 */
-	public boolean promptForInconsistentFileRefresh(List inconsistentFiles) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	/**
-	 * @see IValidateEditListener#setNeedsStateValidation(boolean)
-	 */
-	public void setNeedsStateValidation(boolean needsStateValidation) {
-		fNeedsStateValidation = needsStateValidation;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.internal.emfworkbench.validateedit.IValidateEditContext#setEditModel(org.eclipse.wst.common.internal.emfworkbench.integration.EditModel)
-	 */
-	public void setEditModel(EditModel fValidator) {
-		this.fValidator = fValidator;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.internal.emfworkbench.validateedit.IValidateEditContext#validateState(org.eclipse.wst.common.internal.emfworkbench.integration.EditModel)
-	 */
-	public IStatus validateState(EditModel editModel) {
-		setEditModel(editModel);
-		return validateState();
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.environment/.classpath b/plugins/org.eclipse.wst.common.environment/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/plugins/org.eclipse.wst.common.environment/.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"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/plugins/org.eclipse.wst.common.environment/.cvsignore b/plugins/org.eclipse.wst.common.environment/.cvsignore
deleted file mode 100644
index 60286c3..0000000
--- a/plugins/org.eclipse.wst.common.environment/.cvsignore
+++ /dev/null
@@ -1,5 +0,0 @@
-bin
-build.xml
-temp.folder
-@dot
-src.zip
diff --git a/plugins/org.eclipse.wst.common.environment/.options b/plugins/org.eclipse.wst.common.environment/.options
deleted file mode 100644
index b293015..0000000
--- a/plugins/org.eclipse.wst.common.environment/.options
+++ /dev/null
@@ -1,21 +0,0 @@
-# Debugging options for the org.eclipse.wst.env plugin.
-
-# Turn on debugging master switch for the org.eclipse.wst.common.environment plugin.
-org.eclipse.wst.common.environment/debug=true
-
-# Turn on different tracing level
-org.eclipse.wst.common.environment/trace/info=true
-org.eclipse.wst.common.environment/trace/warning=true
-org.eclipse.wst.common.environment/trace/error=true
-
-# Turn on data flow tracing
-org.eclipse.wst.common.environment/trace/data=true
-
-# Turn on command tracing
-org.eclipse.wst.common.environment/trace/command=true
-
-# Turn on emitter tracing
-org.eclipse.wst.common.environment/trace/emitter=true
-
-# Turn on web service ant tracing
-org.eclipse.wst.common.environment/trace/ws_ant=true
diff --git a/plugins/org.eclipse.wst.common.environment/.project b/plugins/org.eclipse.wst.common.environment/.project
deleted file mode 100644
index 557b51d..0000000
--- a/plugins/org.eclipse.wst.common.environment/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.common.enviornment</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/plugins/org.eclipse.wst.common.environment/about.html b/plugins/org.eclipse.wst.common.environment/about.html
deleted file mode 100644
index 3962f54..0000000
--- a/plugins/org.eclipse.wst.common.environment/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>October 7, 2005</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/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/Choice.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/Choice.java
deleted file mode 100644
index 7ec982c..0000000
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/Choice.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.environment;
-
-/**
- * 
- * This class is used by the IStatusHandler interface.
- * It allows code that is reporting status to specify choices to the user
- * which this reporting code can react to. 
- *
- * @since 1.0
- */
-public class Choice {
-
-  private char   shortcut = ' '; 
-  private String label = null;
-  private String description = null;
-  	
-	/**
-	 * Constructor for Choice.
-	 */
-	public Choice() {
-	}
-
-	/**
-	 * Constructor for Choice.
-	 * @param shortcut the single letter shortcut for this choice.
-	 * @param label the label to be displayed to the user for this choice.
-	 */
-	public Choice(char shortcut, String label) {
-		this.shortcut = shortcut;
-		this.label = label;
-	}
-	
-	/**
-	 * Constructor for Choice.
-   * @param shortcut the single letter shortcut for this choice.
-   * @param label the label to be displayed to the user for this choice.
-	 * @param description the description for this choice.
-	 */
-	public Choice(char shortcut, String label, String description) {
-		this.shortcut = shortcut;
-		this.label = label;
-		this.description = description;
-	}
-
-	/**
-	 * Gets the label.
-	 * @return Returns a String
-	 */
-	public String getLabel() {
-		return label;
-	}
-
-	/**
-	 * Sets the label.
-	 * @param label The label to set
-	 */
-	public void setLabel(String label) {
-		this.label = label;
-	}
-
-	/**
-	 * Gets the description.
-	 * @return Returns a String
-	 */
-	public String getDescription() {
-		return description;
-	}
-
-	/**
-	 * Sets the description.
-	 * @param description The description to set
-	 */
-	public void setDescription(String description) {
-		this.description = description;
-	}
-
-	/**
-	 * Gets the shortcut.
-	 * @return Returns a char
-	 */
-	public char getShortcut() {
-		return shortcut;
-	}
-
-	/**
-	 * Sets the shortcut.
-	 * @param shortcut The shortcut to set
-	 */
-	public void setShortcut(char shortcut) {
-		this.shortcut = shortcut;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/EnvironmentException.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/EnvironmentException.java
deleted file mode 100644
index 6e3f70b..0000000
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/EnvironmentException.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.environment;
-
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * This is the exception class for conditions raised by the IEnvironment.
- * 
- * @since 1.0
- */
-public class EnvironmentException extends Exception
-{
-  /**
-   * Comment for <code>serialVersionUID</code>
-   */
-  private static final long serialVersionUID = 3978983275899402036L;
-  
-  /**
-   * The status for this exception.
-   */
-  protected IStatus status = null;
-  
-  /**
-   * Creates a new EnvironmentException.
-   */
-  public EnvironmentException ()
-  {
-    super();
-  }
-
-  /**
-   * Creates a new EnvironmentException.
-   * 
-   * @param status the status for this exception.
-   */
-  public EnvironmentException ( IStatus status )
-  {
-    super(status == null ? null : status.getMessage());
-    this.status = status;
-  }
-
-  /**
-   * Returns the Status object.
-   * 
-   * @return the status for this exception.
-   */
-  public IStatus getStatus()
-  {
-    return status;
-  }
-}
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/EnvironmentService.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/EnvironmentService.java
deleted file mode 100644
index 5663fec..0000000
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/EnvironmentService.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 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
- **************************************************************************************************/
-package org.eclipse.wst.common.environment;
-
-import org.eclipse.wst.common.environment.uri.IURIScheme;
-import org.eclipse.wst.common.environment.uri.URIException;
-import org.eclipse.wst.common.internal.environment.eclipse.ConsoleEclipseEnvironment;
-
-/**
- * 
- * This class creates a console environment.  It also contains static
- * conviences methods for creating an ILog object as well as an Eclipse and
- * File Scheme.
- * 
- * @since 1.0
- *
- */
-public class EnvironmentService
-{
-  static private IEnvironment environment;
-  
-  /**
-   * 
-   * @return returns an Eclipse console environment.
-   */
-  public static IEnvironment getEclipseConsoleEnvironment()
-  {
-    if( environment == null ) environment = new ConsoleEclipseEnvironment();
-    
-    return environment; 
-  }  
-  
-  /**
-   * 
-   * @return returns an Eclipse logger.
-   */
-  public static ILog getEclipseLog()
-  {
-    IEnvironment environment = getEclipseConsoleEnvironment();
-    
-    return environment.getLog();
-  }
-  
-  /**
-   * 
-   * @return returns an Eclipse scheme.
-   */
-  public static IURIScheme getEclipseScheme()
-  {
-    IEnvironment environment = getEclipseConsoleEnvironment();
-    IURIScheme   scheme      = null;
-    
-    try
-    {
-      scheme = environment.getURIFactory().newURIScheme( "platform" );
-    }
-    catch( URIException exc )
-    {    
-    }
-    
-    return scheme;
-  }  
-  
-  /**
-   * 
-   * @return returns a File scheme.
-   */
-  public static IURIScheme getFileScheme()
-  {
-    IEnvironment environment = getEclipseConsoleEnvironment();
-    IURIScheme   scheme      = null;
-    
-    try
-    {
-      scheme = environment.getURIFactory().newURIScheme( "file" );
-    }
-    catch( URIException exc )
-    {    
-    }
-    
-    return scheme;
-  }
-}
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/IEnvironment.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/IEnvironment.java
deleted file mode 100644
index 568a4f4..0000000
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/IEnvironment.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.environment;
-
-import org.eclipse.wst.common.environment.uri.IURIFactory;
-
-
-/**
- * An IEnvironment provides the means for getting a 
- * <ol>
- * <li>A log for writing messages to a logging facility,</li>
- * <li>A progress monitor for receiving progress information,</li>
- * <li>A status handler for receiving and processing status reports,</li>
- * <li>A factory for the handling of URIs (resources).</li>
- * </ol>
- * 
- * @since 1.0
- */
-public interface IEnvironment
-{
-  /**
-   * Returns a logging facility.
-   * 
-   * @return returns a logging facility.
-   */
-  public ILog getLog ();
-
-  /**
-   * Returns a status handler.
-   * 
-   * @return returns a status handler.
-   */
-  public IStatusHandler getStatusHandler ();
-
-  /**
-   * Returns a IURI factory.
-   * Hint: Implementers should insure that the Factory they return
-   * has a reference to this IEnvironment so that IURI objects can
-   * report progress and announce status.
-   * 
-   * @return returns a URI factory.
-   */
-  public IURIFactory getURIFactory ();
-}
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/ILog.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/ILog.java
deleted file mode 100644
index 925ed24..0000000
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/ILog.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.environment;
-
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * ILog objects provide a means for logging information for FFDC etc.
- * 
- * @since 1.0
- */
-public interface ILog
-{
-  /**
-   * This constant indicates that a logging message is Ok.
-   */
-  public static final int OK = 0;
-  
-  /**
-   * This constant indicates that a logging message is informational.
-   */
-  public static final int INFO = 1;
-  
-  /**
-   * This constant indicates that a logging message is warning.
-   */
-  public static final int WARNING = 2;
-  
-  /**
-   * This constant indicates that a logging message is an error.
-   */
-  public static final int ERROR = 4;
-
-  /**
-   * Returns true if logging is enabled.
-   * There is no requirement to call this method before attempting
-   * a call to one of the <code>log</code> methods, as they will
-   * quietly do nothing if logging is disabled. This method can be
-   * useful, however, anywhere the cost of building up the parameters
-   * to a log method might be high and best avoided except when logging
-   * is enabled.
-   * @return True if logging is enabled, and false otherwise.
-   */
-  public boolean isEnabled ();
-  
-  /**
-   * Returns true if this debug option is set to true.
-   * 
-   * @param option this debug option string.
-   * @return returns true if this debug option is set to true.
-   */
-  public boolean isEnabled (String option);
-
-  /**
-   * Logs a <code>Throwable</code>.
-   * @param severity The severity of the logging entry.
-   * @param messageNum  The message number.
-   * @param caller The object (for non-static methods) or class (for
-   * static methods) doing the logging.
-   * @param method The simple name of the method doing the loging.
-   * @param throwable The Throwable to log.
-   */
-  public void log ( int severity, int messageNum, Object caller, String method, Throwable throwable );
-  
-  /**
-   * Logs a <code>Throwable</code>.
-   * @param severity The severity of the logging entry.
-   * @param option this debug option string.
-   * @param messageNum The message number.
-   * @param caller The object (for non-static methods) or class (for
-   * static methods) doing the logging.
-   * @param method The simple name of the method doing the loging.
-   * @param throwable The Throwable to log.
-   */
-  public void log ( int severity, String option, int messageNum, Object caller, String method, Throwable throwable );
-
-  /**
-   * Logs a <code>Status</code>.
-   * @param severity The severity of the logging entry.
-   * @param messageNum  The message number.
-   * @param caller The object (for non-static methods) or class (for
-   * static methods) doing the logging.
-   * @param method The simple name of the method doing the loging.
-   * @param status The Status to log.
-   */
-  public void log ( int severity, int messageNum, Object caller, String method, IStatus status );
-  
-  /**
-   * Logs a <code>Status</code>.
-   * @param severity The severity of the logging entry.
-   * @param option this debug option string.
-   * @param messageNum  The message number.
-   * @param caller The object (for non-static methods) or class (for
-   * static methods) doing the logging.
-   * @param method The simple name of the method doing the loging.
-   * @param status The Status to log.
-   */
-  public void log ( int severity, String option, int messageNum, Object caller, String method, IStatus status );
-
-  /**
-   * Logs an <code>Object</code>.
-   * @param severity The severity of the logging entry.
-   * @param messageNum  The message number.
-   * @param caller The object (for non-static methods) or class (for
-   * static methods) doing the logging.
-   * @param method The simple name of the method doing the loging.
-   * @param object The Object to log.
-   */
-  public void log ( int severity, int messageNum, Object caller, String method, Object object );
-  
-  /**
-   * Logs an <code>Object</code>.
-   * @param severity The severity of the logging entry.
-   * @param option this debug option string.
-   * @param messageNum  The message number.
-   * @param caller The object (for non-static methods) or class (for
-   * static methods) doing the logging.
-   * @param method The simple name of the method doing the loging.
-   * @param object The Object to log.
-   */
-  public void log ( int severity, String option, int messageNum, Object caller, String method, Object object );
-}
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/IStatusHandler.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/IStatusHandler.java
deleted file mode 100644
index 9c3aee6..0000000
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/IStatusHandler.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.environment;
-
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * Processes status events raised by the caller and returns an
- * indication of choices made by the recipient of the status and
- * may raise an exception against the caller to have them abort
- * procesing.
- * 
- * @since 1.0
- */
-public interface IStatusHandler
-{
-  /**
-   * Reports the given Status and set of possible responses.
-   * 
-   * @param status the status to report.
-   * @param choices the choices that will be displayed to the user.
-   * @return returns the choice made by the user/handler.
-   */
-  public Choice report ( IStatus status, Choice[] choices );
-  
-  /**
-   * Reports the given Status with implied options to either
-   * continue or abort.
-   * @param status the status to report.
-   * @throws StatusException Throws an exception if the handler decides the caller
-   * should stop processing.
-   */
-  public void report ( IStatus status ) throws StatusException;
-  
-  /**
-   * Report the given Error Status.  No user feedback is provided.
-   * @param status the error status to report.
-   */
-  public void reportError( IStatus status );
-  
-  /**
-   * Report the given Info Status.  No user feedback is provided.
-   * @param status the info status to report.
-   */
-  public void reportInfo( IStatus status );
-}
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/NullStatusHandler.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/NullStatusHandler.java
deleted file mode 100644
index 3e22891..0000000
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/NullStatusHandler.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.environment;
-
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * 
- * This class provides a default implementation of the IStatusHandler interface.
- * 
- * @since 1.0
- *
- */
-public class NullStatusHandler implements IStatusHandler
-{
-  
-  /**
-   * @see org.eclipse.env.common.IStatusHandler#report(org.eclipse.core.runtime.IStatus, org.eclipse.env.common.Choice[])
-   */
-  public Choice report(IStatus status, Choice[] choices) 
-  {
-  	Choice result = null;
-  	
-  	// Always take the first choice if available.
-    if( choices != null && choices.length > 0 )
-    {
-    	result = choices[0];
-    }
-    
-    return result;
-  }
-
-  /**
-   * @see org.eclipse.env.common.IStatusHandler#report(org.eclipse.core.runtime.IStatus)
-   */
-  public void report(IStatus status) throws StatusException
-  {
-  }
-  
-  /*
-   * Report and error.
-   */
-  private boolean reportErrorStatus(IStatus status)
-  {
-    return false;
-  }
-  
-  /**
-   * @see org.eclipse.wst.common.environment.IStatusHandler#reportError(org.eclipse.core.runtime.IStatus)
-   */
-  public void reportError(IStatus status)
-  {
-    reportErrorStatus( status );
-  }
-  
-  /**
-   * @see org.eclipse.wst.common.environment.IStatusHandler#reportInfo(org.eclipse.core.runtime.IStatus)
-   */
-  public void reportInfo(IStatus status)
-  {
-  }
-}
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/StatusException.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/StatusException.java
deleted file mode 100644
index e747ed0..0000000
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/StatusException.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.environment;
-
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * This is the exception class used by StatusHandlers to tell their
- * callers that processing should stop.
- * 
- * @since 1.0
- */
-public class StatusException extends EnvironmentException
-{
-  /**
-   * Comment for <code>serialVersionUID</code>
-   * */
-  private static final long serialVersionUID = 3618141160322119992L;
-
-  /**
-   * The Choice that lead to the exception being thrown,
-   * if any (ie. may be null).
-   */
-  protected Choice choice;
-
-  /**
-   * Creates a new StatusException with the given Status.
-   * @param status the status for this exception.
-   */
-  public StatusException( IStatus status )
-  {
-    super( status );  
-  }
-  
-  /**
-   * Creates a new StatusException with the given Choice.
-   * The Choice may be null.
-   * @param choice the choice for this exception.
-   */
-  public StatusException ( Choice choice )
-  {
-    super();
-    this.choice = choice;
-  }
-
-  /**
-   * Creates a new StatusException with the given Choice
-   * and status object. The Choice may be null.
-   * 
-   * @param status the status for this exception.
-   * @param choice the choice for this exception.
-   */
-  public StatusException ( IStatus status, Choice choice )
-  {
-    super(status);
-    this.choice = choice;
-  }
-
-  /**
-   * @return Returns the Choice object inside this exception.
-   */
-  public Choice getChoice ()
-  {
-    return choice;
-  }
-}
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/uri/IURI.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/uri/IURI.java
deleted file mode 100644
index 9352326..0000000
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/uri/IURI.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.environment.uri;
-
-import java.io.File;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.URL;
-
-/**
- * A IURI represents a Univeral Resource Identifer.
- * 
- * @since 1.0
- */
-public interface IURI
-{
-  /**
-   * @return Returns the string form of the IURI.
-   * The resource need not exist.
-   */
-  public String toString ();
-
-  /**
-   * @return Returns the IURIScheme for the scheme of this IURI.
-   * The resource need not exist.
-   */
-  public IURIScheme getURIScheme ();
-
-  /**
-   * @return Returns true iff the resource identified by this IURI exists.
-   */
-  public boolean isPresent ();
-
-  /**
-   * @return Returns true iff the resource identified by this IURI exists
-   * and is a leaf. Returns true always for non-hierarchical schemes.
-   */
-  public boolean isLeaf ();
-
-  /**
-   * @return Returns true iff the resource identified by this IURI exists
-   * and is readable. A readable leaf resource indicates that an
-   * input stream can be opened on the resource. A readable folder
-   * resource indicates that the children of the folder, if any,
-   * can be determined via the list() or visit() methods.
-   */
-  public boolean isReadable ();
-
-  /**
-   * @return Returns true iff the resource identified by this IURI exists
-   * and is writable. A writable leaf resource indicates that an
-   * output stream can be opened on the resource. A writable folder
-   * resource indicates that new resources can be created in the folder.
-   */
-  public boolean isWritable ();
-
-  /**
-   * @return Returns true iff this IURI belongs to a hierarchical scheme.
-   * The resource need not exist.
-   * this.isHierarchical() == this.getURIScheme().isHierarchical().
-   */
-  public boolean isHierarchical ();
-
-  /**
-   * @return Returns true iff this IURI is a relative IURI.
-   * The resource need not exist.
-   */
-  public boolean isRelative ();
-
-  /**
-   * @return Returns the IURI of the folder containing this IURI.
-   * The resource need not exist.
-   * @throws URIException if there is no parent URI.
-   */
-  public IURI parent () throws URIException;
-
-  /**
-   * @param relativeURI a relative URI.
-   * @return Returns a new, normalized IURI formed by appending the given
-   * relative IURI to this IURI. Both URIs must be hierarchical.
-   * The resulting IURI will always be hierarchical. The given
-   * IURI must be relative. This IURI can be relative or absolute.
-   * the resulting IURI will be equivalently relative or absolute.
-   * @throws URIException if relativeURI is not relative.
-   */
-  public IURI append ( IURI relativeURI ) throws URIException;
-
-  /**
-   * @return Gets an InputStream for reading from the resource
-   * identified by this leaf or non-hierarchical IURI.
-   * 
-   * @throws URIException if a stream for this URI can not be created.
-   */
-  public InputStream getInputStream () throws URIException;
-
-  /**
-   * @return Gets an OutputStream for writing to the resource
-   * identified by this leaf or non-hierarchical IURI.
-   * @throws URIException if a stream for this URI can not be created.
-   */
-  public OutputStream getOutputStream () throws URIException;
-
-  /**
-   * Creates a new, empty resource at the location identified by
-   * the IURI. On completion, this.isLeaf() == true. If a leaf
-   * resource already exists, this method does nothing. If a
-   * non-leaf resource already exists under this IURI, creation
-   * will fail and an exception will be thrown.
-   * @throws URIException if an error occurs touching this leaf resource.
-   */
-  public void touchLeaf () throws URIException;
-
-  /**
-   * Creates a new folder resource at the location identified by
-   * the IURI. The scheme of the IURI must be hierarchical.
-   * On completion, this.isLeaf() == false. If a folder resource
-   * already exists, this method does nothing. If a leaf resource
-   * already exists under this IURI, creation will fail and an
-   * exception will be thrown.
-   * @throws URIException if an error occurs touching this folder resource.
-   */
-  public void touchFolder () throws URIException;
-
-  /**
-   * Erases the resource identified by this IURI.
-   * @throws URIException if an error occurs erasing this resource.
-   */
-  public void erase () throws URIException;
-
-  /**
-   * Renames or moves the resource identified by this IURI
-   * to the new IURI.
-   * @param newURI the new URI name for this URI.
-   * @throws URIException if an error occurs renaming this resource.
-   */
-  public void rename ( IURI newURI ) throws URIException;
-
-  /**
-   * Visits this resource and its decendants in pre-order fashion.
-   * For each resource, whether a folder or a leaf, the given
-   * IURIVisitor's visit() method is called with the IURI of the
-   * resource. If IURIVisitor.visit() returns false, the visiting
-   * algorithm will "prune" the decendants of the resource and
-   * carry on visiting the rest of the tree. If IURIVisitor.visit()
-   * returns true, the visiting algorithm will continue its walk
-   * down the resource's descendants.
-   * @param uriVisitor the visitor that will be called for each resource visited.
-   * @throws URIException if an error occurs visiting this resource and its children.
-   */
-  public void visit ( IURIVisitor uriVisitor ) throws URIException;
-
-  /**
-   * As for visit(IURIVisitor), except only resource URIs that are
-   * accepted by the given filter are visited. If a folder resource
-   * fails to be accepted by the filter, this will not prevent the
-   * visiting algorithm from walking the resource's descendants.
-   * It remains the job of the visitor to choose whether or not to
-   * prune a branch by returning false or true.
-   * @param uriVisitor the visitor that will be called for each resource visited.
-   * @param uriFilter the resource filter.
-   * @throws URIException if an error occurs visiting this resource and its children.
-   */
-  public void visit ( IURIVisitor uriVisitor, IURIFilter uriFilter ) throws URIException;
-
-  /**
-   * Returns a list of URIs for the immediate children of the given
-   * hierarchical, non-leaf IURI. This method never returns null,
-   * though it may return a zero length array.
-   * @return returns the children for this URI.
-   * @throws URIException if an error occurs locating the children for this URI.
-   */
-  public IURI[] list () throws URIException;
-
-  /**
-   * As for list(), except only URIs that are accepted by the given
-   * filter are returned in the array. This method never returns null,
-   * though it may return a zero length array.
-   * @param uriFilter the child filter.
-   * @return returns the filtered children for this URI.
-   * @throws URIException if an error occurs locating the children for this URI.
-   */
-  public IURI[] list ( IURIFilter uriFilter ) throws URIException;
-
-  /**
-   * @return Returns true if the asURL() method is fair game,
-   * in other words, if this IURI can be converted into a URL.
-   */
-  public boolean isAvailableAsURL ();
-
-  /**
-   * @return Returns a URL object for the resource under this IURI.
-   * There are many URIs and URISchemes for which this method
-   * will fail and throw an exception. It should be used only
-   * in cases where URIs are known to be representable as URLs.
-   * @throws URIException if an error occurs returning this URL.
-   */
-  public URL asURL () throws URIException;
-
-  /**
-   * @return Returns true if the asFile() method is fair game,
-   * in other words, if this IURI can be converted into a File.
-   */
-  public boolean isAvailableAsFile ();
-
-  /**
-   * @return Returns a File object for the resource under this IURI.
-   * There are many URIs and URISchemes for which this method
-   * will fail and throw an exception. It should be used only
-   * in cases where URIs are known to be backed by physical files.
-   * @throws URIException if an error occurs returning this File.
-   */
-  public File asFile () throws URIException;
-
-  /**
-   * @return Returns the IURI as a string.
-   * Equivalent to toString().
-   */
-  public String asString ();
-}
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/uri/IURIFactory.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/uri/IURIFactory.java
deleted file mode 100644
index f8a3123..0000000
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/uri/IURIFactory.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.environment.uri;
-
-import java.net.URL;
-
-/**
- * This is a factory for creating new IURI and IURIScheme objects.
- * 
- * @since 1.0
- */
-public interface IURIFactory
-{
-  /**
-   * Creates and returns a new IURI for the given string.
-   * @param uri the uri to be created.
-   * @return the new URI.
-   * @throws URIException if the uri parameter is not a valid URI.
-   */
-  public IURI newURI ( String uri ) throws URIException;
-
-  /**
-   * Creates and returns a new IURI for the given URL.
-   * @param url the url to use to create this URI
-   * @return the new URI.
-   * @throws URIException if the url parameter is not a valid url.
-   */
-  public IURI newURI ( URL url ) throws URIException;
-
-  /**
-   * Creates and returns a new IURIScheme for the given scheme string.
-   * If the string contains no colons, the entire string is interpretted
-   * as the name of the scheme. If the string contains a colon, then the
-   * substring up to but excluding the first colon is interpretted as the
-   * name of the scheme, meaning the caller can pass in any IURI string in
-   * order to get a IURIScheme object.
-   * 
-   * @param schemeOrURI the scheme or URI from which to create the scheme.
-   * @return the new Scheme.
-   * @throws URIException if schemeOrUri parameter does not contain
-   * a valid scheme or URI name.
-   */
-  public IURIScheme newURIScheme ( String schemeOrURI ) throws URIException;
-}
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/uri/IURIFilter.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/uri/IURIFilter.java
deleted file mode 100644
index 3e41c8e..0000000
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/uri/IURIFilter.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.environment.uri;
-
-/**
- * This interface is implemented by classes that visit or list URIs.
- * Refer to {@link IURI#getChildren}.
- * 
- * @since 1.0
- */
-public interface IURIFilter
-{
-  /**
-   * Filters the given IURI.
-   * @param uri The resource to filter.
-   * @return True if the resource matches the filter,
-   * false if it does not.
-   * @param uri the uri that will be accepted or rejected.
-   * @return returns true if this uri is accepted.
-   * @throws URIException If the filter fails to analyze the resource.
-   */
-  public boolean accepts ( IURI uri ) throws URIException;
-}
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/uri/IURIScheme.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/uri/IURIScheme.java
deleted file mode 100644
index 61177ce..0000000
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/uri/IURIScheme.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.environment.uri;
-
-import java.net.URL;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * A IURIScheme represents a single scheme for some a family of
- * Univeral Resource Identifiers. Examples include "file", "http"
- * and "platform" (Eclipse).
- * 
- * @since 1.0
- */
-public interface IURIScheme
-{
-  /**
-   * @param uri the URI to be created.
-   * @return Returns a new IURI.
-   * @throws URIException if the uri specified is not valid or
-   * can not be created.
-   */
-  public IURI newURI ( String uri ) throws URIException;
-
-  /**
-   * @param url the url used to create the URI.
-   * @return Returns a new IURI.
-   * @throws URIException if the url specified is not valid or
-   * can not be created.
-   */
-  public IURI newURI ( URL url ) throws URIException;
-
-  /**
-   * @param uri the URI to be created.
-   * @return Returns a new IURI.
-   * @throws URIException if the uri specified is not valid or
-   * can not be created.
-   */
-  public IURI newURI ( IURI uri ) throws URIException;
-
-  /**
-   * @return Returns the proper name of the scheme.
-   */
-  public String toString ();
-
-  /**
-   * @return Returns true if and only if this is a hierarchical scheme.
-   */
-  public boolean isHierarchical ();
-
-  /**
-   * @param uri the uri to check for validity.
-   * @return Returns true if and only if the given IURI satisfies the
-   * grammatical requirements of the scheme. Absolute URIs must
-   * begin with "<scheme>:". Relative URIs must either not contain
-   * a colon, ":", or it must begin with "./".
-   */
-  public boolean isValid ( IURI uri );
-
-  /**
-   * @param uri the uri to check for validity.
-   * @return Returns a Status object indicating whether or not the given
-   * IURI is valid. The severity and message of the Status object
-   * will describe this.
-   */
-  public IStatus validate ( IURI uri );
-}
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/uri/IURIVisitor.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/uri/IURIVisitor.java
deleted file mode 100644
index aa752eb..0000000
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/uri/IURIVisitor.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.environment.uri;
-
-/**
- * This interface is implemented by classes that visit URIs.
- * Refer to {@link IURI#visit}.
- * 
- * @since 1.0
- */
-public interface IURIVisitor
-{
-  /**
-   * Visits the given IURI.
-   * @param uri The resource to visit.
-   * @return True if the resource's descendants should be visited,
-   * or false if they should not be visited.
-   * @throws URIException If the visit method fails.
-   */
-  public boolean visit ( IURI uri ) throws URIException;
-}
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/uri/SimpleURIFactory.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/uri/SimpleURIFactory.java
deleted file mode 100644
index 90945ac..0000000
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/uri/SimpleURIFactory.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.environment.uri;
-
-import java.net.URL;
-import java.util.Hashtable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.common.internal.environment.eclipse.Messages;
-import org.eclipse.wst.common.internal.environment.relative.RelativeScheme;
-
-/**
- * 
- * This class provides a default implementation of the IURIFactory interface.
- * 
- * @since 1.0
- */
-public class SimpleURIFactory implements IURIFactory
-{
-  private Hashtable    schemes_ = new Hashtable();  
-  
-  /**
-   * @param uri the uri to be created.
-   * @return Creates and returns a new IURI for the given string.
-   * @throws URIException if an error occurs creating this URI.
-   */
-  public IURI newURI(String uri) throws URIException
-  {
-    IURIScheme scheme = newURIScheme( uri, false );
-    
-    return scheme.newURI( uri );
-  }
-
-  /**
-   * @param url the url to use to create this uri.
-   * @return Creates and returns a new IURI for the given URL.
-   * @throws URIException if an error occurs creating this URI.
-   */
-  public IURI newURI(URL url) throws URIException
-  {
-    IURIScheme scheme = newURIScheme( url.toString(), false );
-    
-    return scheme.newURI( url );
-  }
-
-  /**
-   * @param schemeOrURI the scheme name or URI from which this scheme is 
-   * to be created.
-   * @return Creates and returns a new IURIScheme for the given scheme string.
-   * If the string contains no colons, the entire string is interpretted
-   * as the name of the scheme. If the string contains a colon, then the
-   * substring up to but excluding the first colon is interpretted as the
-   * name of the scheme, meaning the caller can pass in any IURI string in
-   * order to get a IURIScheme object.
-   * @throws URIException if an error occurs creating this URI scheme.
-   */
-  public IURIScheme newURIScheme(String schemeOrURI) throws URIException
-  {
-    return newURIScheme( schemeOrURI, true );
-  }
-  
-  /**
-   * This method registers a scheme for a particular protocol.
-   * 
-   * @param protocol the protocol.
-   * @param scheme the scheme.
-   */
-  public void registerScheme( String protocol, IURIScheme scheme )
-  {
-    schemes_.put( protocol, scheme );
-  }
-  
-  private IURIScheme newURIScheme(String schemeOrURI, boolean checkForScheme ) throws URIException
-  {
-    IURIScheme newScheme = null;
-    
-    if( schemeOrURI == null )
-    {
-      throw new URIException( 
-              new Status( IStatus.ERROR, "id", 0, 
-                 NLS.bind( Messages.MSG_NULL_ARG_SPECIFIED, "newURIScheme"), null ) );
-    }
-    
-    int colon    = schemeOrURI.indexOf(':');
-    int slash    = schemeOrURI.indexOf('/');
-    
-    // A protocol was specified.  Note: a colon appearing after a path is not
-    // considered part of the protocol for this IURI.
-    if( ( checkForScheme && colon == -1 ) ||
-        ( colon != -1 && slash == -1) || 
-        ( colon != -1 && colon < slash ) )
-    {
-      // If colon is -1 then we will treat the entire input parameter as the protocol.
-      if( colon == -1 ) colon = schemeOrURI.length();
-      
-      String protocol = schemeOrURI.substring(0, colon );
-      newScheme       = (IURIScheme)schemes_.get( protocol );
-      
-      if( newScheme == null )
-      {
-        throw new URIException( 
-            new Status( IStatus.ERROR, "id", 0, 
-                NLS.bind( Messages.MSG_SCHEME_NOT_FOUND, schemeOrURI ), null ) );
-                
-      }
-    }
-    else if( schemeOrURI.startsWith( "/") )
-    {
-      throw new URIException( 
-          new Status( IStatus.ERROR, "id", 0,
-              NLS.bind( Messages.MSG_ABSOLUTE_PATH_WITHOUT_SCHEME, schemeOrURI ), null ) );
-      
-    }
-    else
-    {
-      newScheme = new RelativeScheme();
-    }
-    
-    return newScheme;
-  }
-}
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/uri/URIException.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/uri/URIException.java
deleted file mode 100644
index e1aee84..0000000
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/uri/URIException.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.environment.uri;
-
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * This is the base class for most exceptions thrown by IURI classes.
- * Every URIException carries a IURI and a Status, each of which may
- * be null. The getMessage() method as inherited from Exception will
- * return the message from the URIExceptin's Status object, if any.
- * 
- * @since 1.0
- */
-public class URIException extends Exception
-{
-  /**
-   * Comment for <code>serialVersionUID</code>
-   */
-  private static final long serialVersionUID = 3258130271424756018L;
-
-  /**
-   * A Status object containing details about the exception,
-   * if applicable.
-   */
-  protected IStatus status;
-
-  /**
-   * The IURI for which the exception occured,
-   * if applicable.
-   */
-  protected IURI uri;
-
-  /**
-   * Creates a new URIException with the given Status.
-   * The status may be null.
-   * 
-   * @param status the staus for this exception.
-   */
-  public URIException ( IStatus status )
-  {
-    super();
-    this.status = status;
-  }
-
-  /**
-   * Creates a new URIException for the given Status and IURI,
-   * each of which may be null.
-   * 
-   * @param status the status for this exception.
-   * @param uri the uri that caused this exception.
-   */
-  public URIException ( IStatus status, IURI uri )
-  {
-    super(status != null ? status.getMessage() : null);
-    this.status = status;
-    this.uri = uri;
-  }
-
-  /**
-   * @return returns the Status object inside this exception.
-   */
-  public IStatus getStatus ()
-  {
-    return status;
-  }
-
-  /**
-   * @return returns the IURI inside this exception.
-   */
-  public IURI getURI ()
-  {
-    return uri;
-  }
-}
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/ConsoleEclipseEnvironment.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/ConsoleEclipseEnvironment.java
deleted file mode 100644
index 8e1c1e1..0000000
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/ConsoleEclipseEnvironment.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.environment.eclipse;
-
-import org.eclipse.wst.common.environment.IEnvironment;
-import org.eclipse.wst.common.environment.ILog;
-import org.eclipse.wst.common.environment.NullStatusHandler;
-import org.eclipse.wst.common.environment.IStatusHandler;
-import org.eclipse.wst.common.environment.uri.SimpleURIFactory;
-import org.eclipse.wst.common.environment.uri.IURIFactory;
-import org.eclipse.wst.common.internal.environment.uri.file.FileScheme;
-
-
-/**
- *  This class is intended for use in a headless Eclipse environment.  
- */
-public class ConsoleEclipseEnvironment implements IEnvironment
-{
-	private SimpleURIFactory  uriFactory_      = null;
-	private IStatusHandler     statusHandler_   = null;
-	  
-	public ConsoleEclipseEnvironment()
-	{
-	  this( new NullStatusHandler() );	
-	}
-	
-	public ConsoleEclipseEnvironment( IStatusHandler  statusHandler )
-	{
-	  uriFactory_      = new SimpleURIFactory();
-	  statusHandler_   = statusHandler;
-	    
-	  uriFactory_.registerScheme( "platform", new EclipseScheme( this ) );
-	  uriFactory_.registerScheme( "file", new FileScheme() );
-	}
-			
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.environment.IEnvironment#getLog()
-	 */
-	public ILog getLog() 
-	{
-		return new EclipseLog();
-	}
-		
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.environment.IEnvironment#getStatusHandler()
-	 */
-	public IStatusHandler getStatusHandler() 
-	{
-		return statusHandler_;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.environment.IEnvironment#getURIFactory()
-	 */
-	public IURIFactory getURIFactory() 
-	{
-		return uriFactory_;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/EclipseLog.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/EclipseLog.java
deleted file mode 100644
index ef48ab5..0000000
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/EclipseLog.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.environment.eclipse;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.wst.common.environment.ILog;
-
-public class EclipseLog implements org.eclipse.wst.common.environment.ILog 
-{
-//	private Logger logger;
-	public EclipseLog() {
-		/*
-		logger = Logger.getLogger("org.eclipse.wst.command.env");
-		// logger.setLogFileName("env.log");
-		logger.setLevel(Level.INFO); // log all levels for now
-		*/
-	}
-	
-	/**
-	 * @see org.eclipse.wst.common.environment.ILog#isEnabled()
-	 */
-	public boolean isEnabled() 
-  {
-		return Platform.inDebugMode();
-	}
-	
-	/**
-	 * @see org.eclipse.wst.common.Environment.ILog#isEnabled(java.lang.String)
-	 */
-	public boolean isEnabled(String option) {
-		return "true".equals(Platform.getDebugOption("org.eclipse.wst.common.environment/trace/"
-				+ option));
-	}
-	
-	/**
-	 * @see org.eclipse.wst.common.environment.ILog#log(int, int, java.lang.Object, java.lang.String, java.lang.Object)
-	 */
-	public void log(int severity, int messageNum, Object caller,
-			String method, Object object) {
-		
-		if (isEnabled()) {
-			switch (severity) {
-				case ILog.ERROR :
-					if (isEnabled("error"))
-						System.out.println(getMessageNumString(messageNum) + "E "
-							+ caller + "::" + method + ": object="
-							+ object);
-					break;
-				case ILog.WARNING :
-					if (isEnabled("warning"))
-						System.out.println(getMessageNumString(messageNum)
-								+ "W " + caller + "::" + method
-								+ ": object=" + object);
-					break;
-				case ILog.INFO :
-					if (isEnabled("info"))
-						System.out.println(getMessageNumString(messageNum) + "I "
-								+ caller + "::" + method + ": object="
-								+ object);
-					break;
-			}
-		}
-		
-	}
-	
-	/**
-	 * @see org.eclipse.wst.common.environment.ILog#log(int, int, java.lang.Object, java.lang.String, org.eclipse.core.runtime.IStatus)
-	 */
-	public void log(int severity, int messageNum, Object caller,
-			String method, IStatus status) {
-		log(severity, messageNum, caller, method, (Object)status);
-	}
-	
-	/**
-	 * @see org.eclipse.wst.common.environment.ILog#log(int, int, java.lang.Object, java.lang.String, java.lang.Throwable)
-	 */
-	public void log(int severity, int messageNum, Object caller,
-			String method, Throwable throwable) {
-		log( severity, messageNum, caller, method, (Object)null );
-	}
-	
-	/**
-	 * @see org.eclipse.wst.common.environment.ILog#log(int, java.lang.String, int, java.lang.Object, java.lang.String, java.lang.Object)
-	 */
-	public void log(int severity, String option, int messageNum,
-			Object caller, String method, Object object) {
-		if (isEnabled(option))
-			System.out.println(getMessageNumString(messageNum) + "I " + caller
-					+ "::" + method + ": object=" + object);
-	}
-	
-	/**
-	 * @see org.eclipse.wst.common.environment.ILog#log(int, java.lang.String, int, java.lang.Object, java.lang.String, java.lang.Throwable)
-	 */
-	public void log(int severity, String option, int messageNum,
-			Object caller, String method, Throwable throwable) {
-		if (isEnabled(option)) {
-			System.out.println(getMessageNumString(messageNum) + "I " + caller
-					+ "::" + method);
-			throwable.printStackTrace();
-		}
-	}
-	
-	/**
-	 * @see org.eclipse.wst.common.environment.ILog#log(int, java.lang.String, int, java.lang.Object, java.lang.String, org.eclipse.core.runtime.IStatus)
-	 */
-	public void log(int severity, String option, int messageNum,
-			Object caller, String method, IStatus status) {
-		log(severity, option, messageNum, caller, method, (Object)status);
-	}
-	
-	private String getMessageNumString(int messageNum) {
-		String messageNumString = "IWAB";
-		if (messageNum > 9999 || messageNum < 0)
-			messageNum = 9999; //default message number
-		messageNumString += (new Integer(messageNum)).toString();
-		return messageNumString;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/EclipseScheme.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/EclipseScheme.java
deleted file mode 100644
index 46a30c6..0000000
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/EclipseScheme.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.environment.eclipse;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.common.environment.IEnvironment;
-import org.eclipse.wst.common.environment.uri.IURI;
-import org.eclipse.wst.common.environment.uri.IURIScheme;
-import org.eclipse.wst.common.environment.uri.URIException;
-import org.eclipse.wst.common.internal.environment.relative.RelativeURI;
-
-
-public class EclipseScheme implements IURIScheme
-{
-  private IEnvironment      environment_;
-  
-  public EclipseScheme( IEnvironment environment )
-  {
-    environment_ = environment;
-  }
-  
-  public String toString()
-  {
-    return "platform";  
-  }
-  
-  /**
-   */
-  public boolean isHierarchical()
-  {
-    return true;
-  }
-
-  /**
-   */
-  public boolean isValid(IURI uri)
-  {
-    boolean result = true;
-    
-    if( uri == null ) return false;
-    
-    try
-    {
-      IURIScheme scheme = uri.getURIScheme();
-      
-      if( scheme.toString().equals( "relative") ) return scheme.isValid( uri );
-        
-      getPathFromPlatformURI( uri.toString() );
-    }
-    catch( URIException exc )
-    {
-      result = false;
-    }
-    
-    return result;
-  }
-
-  /**
-   */
-  public IURI newURI(String uri) throws URIException
-  {
-    String newURI = null;
-    
-    if( uri != null && uri.startsWith( "platform:") )
-    {
-      // The platform has been specified so keep it as is.
-      newURI = uri;
-    }
-    else if( uri == null || uri.indexOf( ":") != -1 )
-    {
-      // The platform uri is not allowed to contain some other protocol. 
-      throw new URIException(
-          new Status( IStatus.ERROR, "id", 0,
-              NLS.bind( Messages.MSG_INVALID_PLATFORM_URL,uri), null ) );
-              
-    }
-    else if( uri.startsWith( "/") )
-    {
-      // The platform scheme has not been specified so we will add it.
-      newURI = "platform:/resource" + uri;
-    }
-    
-    if( newURI == null )
-    {
-      return new RelativeURI( uri );
-    }
-    else
-    {
-      return new EclipseURI( newURI, environment_ );
-    }
-  }
-
-  /**
-   */
-  public IURI newURI(IURI uri) throws URIException
-  {
-    return newURI( uri == null ? null : uri.toString() );
-  }
-
-  /**
-   */
-  public IURI newURI(URL url) throws URIException
-  {
-    return newURI( url == null ? null : url.toString() );
-  }
-
-  /**
-   */
-  public IStatus validate(IURI uri)
-  {
-    IStatus status = null;
-    
-    try
-    {
-      IURIScheme scheme = uri.getURIScheme();
-      
-      if( scheme.toString().equals( "relative") ) return scheme.validate( uri );
-      
-      getPathFromPlatformURI( uri.toString() );
-      status = Status.OK_STATUS;
-    }
-    catch( URIException exc )
-    {
-      status = exc.getStatus(); 
-    }
-    
-    return status;
-  }
-  
-  /**
-   * Gets the "platform:/resource" IPath given a url
-   * 
-   */
-  public String getPathFromPlatformURI(String uri) throws URIException 
-  {
-    String resourceFile = null;
-    URL    url          = null;
-    
-    try
-    {
-      url = new URL( uri ); 
-    }
-    catch( MalformedURLException exc )
-    { 
-      throw new URIException(
-          new Status( IStatus.ERROR, "id", 0,
-              NLS.bind( Messages.MSG_INVALID_PLATFORM_URL, uri ), exc ) );
-    }
-    
-    if( url == null )
-    {
-      throw new URIException(
-          new Status( IStatus.ERROR, "id", 0,
-              NLS.bind( Messages.MSG_INVALID_PLATFORM_URL, uri ), null ) );
-    }
-    if( url.getProtocol().equals("platform") ) 
-    {
-      String resourceURL = url.getFile();
-      
-      if (resourceURL.startsWith("/resource")) 
-      {
-        resourceFile = resourceURL.substring(10);   // omit the "/resource" portion
-      }
-    }
-    else 
-    {
-      throw new URIException(
-          new Status( IStatus.ERROR, "id", 0,
-                      NLS.bind( Messages.MSG_INVALID_PLATFORM_URL,url.getFile() ), null ) );
-    }
-    
-    return resourceFile;
-  }
-  
-  /**
-   * 
-   * @param absolutePath an absolute IPath
-   * @return returns the platform IURI for this path.
-   */
-  public String getURLFromPath( IPath absolutePath )
-  {
-    return "platform:/resource" + absolutePath;
-  }
-}
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/EclipseURI.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/EclipseURI.java
deleted file mode 100644
index feb22d4..0000000
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/EclipseURI.java
+++ /dev/null
@@ -1,518 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.environment.eclipse;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Vector;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-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.core.runtime.Status;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.common.environment.IEnvironment;
-import org.eclipse.wst.common.environment.uri.IURI;
-import org.eclipse.wst.common.environment.uri.IURIFilter;
-import org.eclipse.wst.common.environment.uri.IURIScheme;
-import org.eclipse.wst.common.environment.uri.URIException;
-import org.eclipse.wst.common.internal.environment.relative.RelativeURI;
-
-
-public class EclipseURI extends RelativeURI
-{
-  private IEnvironment   environment_;
-  private EclipseScheme  scheme_;
-  private File           file_;
-  
-  public EclipseURI( String uri, IEnvironment environment )
-  {
-    super( uri );
-    
-    environment_  = environment;
-    scheme_       = new EclipseScheme( environment );
-    file_         = getFile();
-  }
-  
-  public String toString()
-  {
-    return uri_;
-  }
-  
-  /**
-   * @see org.eclipse.env.uri.IURI#erase()
-   */
-  public void erase() throws URIException
-  {
-    try 
-    {
-      IResource file = getResource();
-      
-      if( file != null && file.exists() ) 
-      {
-        if( file instanceof IFile )
-        {
-          FileResourceUtils.deleteFile( (IFile)file,
-                                        environment_.getStatusHandler() );
-        }
-        else if( file instanceof IFolder )
-        {
-          FileResourceUtils.deleteFolder( (IFolder)file,
-                                          environment_.getStatusHandler() );          
-        }
-      }
-      
-    }
-    catch( Exception exc ) 
-    {      
-      throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this );
-    }
-  }
-
-  /**
-   * @see org.eclipse.env.uri.IURI#getInputStream()
-   */
-  public InputStream getInputStream() throws URIException
-  {
-    try 
-    {
-      // If a class cast exception is throw it will be propogated as
-      // a URIException.
-      IFile file = (IFile)getResource();
-
-      //call getContents on the eclipse File object
-      if( file != null ) 
-      {
-        return file.getContents();
-      }
-    }
-    catch( Throwable exc ) 
-    {
-      throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this );
-    }
-    
-    return null;
-  }
-
-  /**
-   * @see org.eclipse.env.uri.IURI#getOutputStream()
-   */
-  public OutputStream getOutputStream() throws URIException
-  {
-    // Ensure that the parent folder exists.
-    IURI parent = parent();
-    
-    if( !parent.isPresent() )
-    {
-      parent().touchFolder();
-    }
-    
-    return getOutStream();
-  }
-
-  /**
-   * @see org.eclipse.env.uri.IURI#getURIScheme()
-   */
-  public IURIScheme getURIScheme()
-  {
-    return scheme_;
-  }
-
-  /**
-   * @see org.eclipse.env.uri.IURI#isLeaf()
-   */
-  public boolean isLeaf()
-  {
-    boolean result = false;
-  
-    try
-    {
-      IResource resource = getResource();
-      
-      if( resource != null && 
-          resource.exists() && 
-          resource.getType() == IResource.FILE )
-      {  
-        result = true;
-      }
-    }
-    catch( URIException exc )
-    {
-      // This IURI does not exist.
-      result = false;
-    }
-   
-    return result;
-  }
-
-  /**
-   * @see org.eclipse.env.uri.IURI#isPresent()
-   */
-  public boolean isPresent()
-  {
-    boolean result = false;
-    
-    try
-    {
-      IResource resource = getResource();
-      
-      if( resource != null && resource.exists() )
-       {  
-        result = true;
-      }
-    }
-    catch( URIException exc )
-    {
-      // This IURI does not exist.
-      result = false;
-    }
-    
-    return result;
-  }
-
-  /**
-   * @see org.eclipse.env.uri.IURI#isReadable()
-   */
-  public boolean isReadable()
-  {
-    boolean result = false;
-    
-    try
-    {
-      IResource resource = getResource();
-      
-      if( resource != null && resource.isAccessible() )
-       {  
-        result = true;
-      }
-    }
-    catch( URIException exc )
-    {
-      // This IURI does not exist.
-      result = false;
-    }
-    
-    return result;
-   }
-
-  /**
-   * @see org.eclipse.env.uri.IURI#isRelative()
-   */
-  public boolean isRelative()
-  { 
-    return false;
-  }
-
-  /**
-   * @see org.eclipse.env.uri.IURI#isWritable()
-   */
-  public boolean isWritable()
-  {
-    boolean result = false;
-    
-    try
-    {
-      IResource resource = getResource();
-      
-      if( resource != null && 
-          resource.isAccessible() && 
-          !resource.getResourceAttributes().isReadOnly() )
-       {  
-        result = true;
-      }
-    }
-    catch( URIException exc )
-    {
-      // This IURI does not exist.
-      result = false;
-    }
-    
-    return result;
-  }
-
-  /**
-   * @see org.eclipse.env.uri.IURI#list()
-   */
-  public IURI[] list() throws URIException
-  {
-    IResource resource    = getResource();
-    IURI[]     uriChildren = new IURI[0];
-    
-    if( resource.getType() == IResource.FOLDER )
-    {
-      IFolder     folder   = (IFolder)resource;
-      
-      try
-      {
-        IResource[] children    = folder.members();  
-  
-        uriChildren = new IURI[children.length];
-        
-        for( int index = 0; index < children.length; index++ )
-        {
-          IPath path = children[index].getFullPath();
-          uriChildren[index] = new EclipseURI( scheme_.getURLFromPath(path), environment_  );
-        }
-      }
-      catch( CoreException exc )
-      {
-      }
-    }
-    
-    return uriChildren;
-  }
-
-  /**
-   * @see org.eclipse.env.uri.IURI#list(org.eclipse.env.uri.IURIFilter)
-   */
-  public IURI[] list(IURIFilter uriFilter) throws URIException
-  {
-    IResource resource = getResource();
-    IURI[]     result   = new IURI[0];
-    
-    if( resource.getType() == IResource.FOLDER )
-     {
-      IFolder     folder   = (IFolder)resource;
-      
-      try
-      {
-        IResource[] children    = folder.members();       
-        Vector      uriChildren = new Vector();
-        
-        for( int index = 0; index < children.length; index++ )
-         {
-          IPath path = children[index].getFullPath();
-          IURI   uri  = new EclipseURI( scheme_.getURLFromPath(path), environment_ );
-          
-          if( uriFilter.accepts( uri ) )
-          {
-            uriChildren.add( uri );
-          }
-        }
-        
-        result = (IURI[])uriChildren.toArray( new IURI[0] );
-      }
-      catch( CoreException exc )
-      {
-      }
-    }
-    
-    return result;
-  }
-   
-  /**
-   * @see org.eclipse.env.uri.IURI#rename(org.eclipse.env.uri.IURI)
-   */
-  public void rename(IURI newURI ) throws URIException
-  {
-    if( newURI == null || !(newURI instanceof EclipseURI) ) return;
-    
-    try
-    {
-      EclipseURI newEclipseURI = (EclipseURI)newURI;
-      IPath      newPath       = new Path( scheme_.getPathFromPlatformURI( newEclipseURI.uri_ ) ).makeAbsolute();
-      IResource  resource      = getResource();
-      
-      if( resource != null )
-      {
-        resource.move( newPath, true, null );
-      }
-    }
-    catch( CoreException exc )
-    {
-      exc.printStackTrace();
-      throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ) );
-    }
-  }
-
-  /**
-   * @see org.eclipse.env.uri.IURI#touchFolder()
-   */
-  public void touchFolder() throws URIException
-  {
-    IResource resource = getResource();
-    
-    if( resource != null )
-    { 
-      if( resource.getType() == IResource.FOLDER )
-      {
-        IFolder folder = (IFolder)resource;
-        
-        try
-        {
-          if( folder.members().length > 0 )
-          {
-            throw new URIException( 
-                new Status( IStatus.ERROR, "id", 0, 
-                    NLS.bind( Messages.MSG_ERROR_FOLDER_HAS_CHILDREN, folder.toString() ), null ),
-                this );
-								
-          }
-        }
-        catch( CoreException exc )
-        {        
-          throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this );
-        }
-      }
-      else
-      {
-         //??? Not sure what to do if touching a folder and the IURI exists and it is not a folder.
-      }
-    }
-    else
-    {
-      IPath newPath = new Path( scheme_.getPathFromPlatformURI( uri_ ) ).makeAbsolute();
-      
-      try
-      {
-        FileResourceUtils.makeFolderPath( newPath,
-			  	                                environment_.getStatusHandler() );
-      }
-      catch( CoreException exc )
-      {
-        throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this );
-      }
-    }
-  }
-
-  /**
-   * @see org.eclipse.env.uri.IURI#touchLeaf()
-   */
-  public void touchLeaf() throws URIException
-  {
-    IResource resource = getResource();
-    
-    if( resource != null )
-    {
-      // The resource already exists so do nothing.
-    }    
-    else
-    {
-      // Get the parent for this leaf and create it if required.
-      IURI parent = parent();
-      
-      if( !parent.isPresent() )
-      {  
-        parent().touchFolder();
-      }
-      
-      try
-      {
-        // Get an output stream to the specified file and immediately close it.
-        // This should create a 0 byte file.
-        getOutStream().close();
-      }
-      catch( IOException exc )
-      {
-        throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this );
-      }
-    }
-
-  }
-
-  private IResource getResource() throws URIException
-  {    
-    IPath  path             = new Path( scheme_.getPathFromPlatformURI(uri_) );
-    String absolutePathname = path.makeAbsolute().toString();
-   
-    return FileResourceUtils.findResource(absolutePathname);
-  }
-  
-  /**
-   * @see org.eclipse.env.uri.IURI#getOutputStream()
-   */
-  private OutputStream getOutStream() throws URIException
-  {
-    IPath        file   = new Path( scheme_.getPathFromPlatformURI( uri_ ) ).makeAbsolute();
-    OutputStream stream = null;
-    
-    stream = FileResourceUtils.newFileOutputStream ( file,
- 			                                               environment_.getStatusHandler() );    
-    return stream;
-  }
-  
-  /**
-   * Returns a File object for the resource under this IURI.
-   * There are many URIs and URISchemes for which this method
-   * will fail and throw an exception. It should be used only
-   * in cases where URIs are known to be backed by physical files.
-   */
-  public File asFile ()
-  {
-  	return file_;
-  }
-  
-  /* (non-Javadoc)
-   * @see org.eclipse.wst.common.environment.uri.IURI#isAvailableAsFile()
-   */
-  public boolean isAvailableAsFile() 
-  {
-  	return file_ != null;
-  }
-  
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#asURL()
-   */
-  public URL asURL() throws URIException
-  {
-    URL url = null;
-    
-    try
-    {
-      url = new URL( uri_ );
-    }
-    catch( MalformedURLException exc )
-    {
-      throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this ); 
-    }
-    
-    return url;
-  }
-  
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#isAvailableAsURL()
-   */
-  public boolean isAvailableAsURL()
-  {
-    URL theURL = null;
-    
-    try
-    {
-      theURL = asURL();  
-    }
-    catch( URIException exc )
-    {  
-    }
-    
-    return theURL != null ;
-  }
-
-  private File getFile()
-  {
-    String platformRes = "platform:/resource";
-    File   result      = null;
-    
-    if (uri_.startsWith(platformRes))
-    {
-      result = new File(ResourcesPlugin.getWorkspace().getRoot().getLocation().removeTrailingSeparator().append(uri_.substring(platformRes.length(), uri_.length())).toString());
-    }
-    
-    return result;
-  }
-}
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/FileResourceOutputStream.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/FileResourceOutputStream.java
deleted file mode 100644
index d1a21f1..0000000
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/FileResourceOutputStream.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.environment.eclipse;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.wst.common.environment.IStatusHandler;
-
-
-
-/**
-* This class defines an output stream that writes to an
-* {@link org.eclipse.core.resources.IFile IFile}.
-*/
-public class FileResourceOutputStream extends OutputStream
-{
-
-  IPath                 fFilePath;
-  IStatusHandler         fStatusHandler;
-  ByteArrayOutputStream fByteArrayOutputStream;
-  boolean               fOpen;
-
-  /**
-  * Constructs an output stream that can be used to write to the
-  * given <code>file</code>. The workspace is neither examined nor
-  * altered during construction. All resource creation is deferred
-  * until later in the stream's lifecycle, such as during writing
-  * or closure.
-  * <b>Note:</b> The preferred mechanism for creating a stream that
-  * writes to an IFile is to call the static factory method
-  * {@link FileResourceUtils#newFileOutputStream FileResourceUtils.newFileOutputStream()}
-  * and work with the resulting <code>OutputStream</code>.
-  * Direct construction of a FileResourceOutputStream is not recommended.
-  * @param file The {@link org.eclipse.core.resources.IFile IFile}
-  * handle of the file resource to create. The project implied by the
-  * pathname of the file must already exist,
-  * that is, this method cannot be used to create projects.
-  * @param progressMonitor The progress monitor for the operation, or null.
-  */
-  public FileResourceOutputStream ( 
-  			IPath           filePath, 
-  			IStatusHandler   statusHandler
-  			)
-  {
-    fFilePath = filePath;
-    fStatusHandler = statusHandler;
-    fByteArrayOutputStream = new ByteArrayOutputStream();
-    fOpen = true;
-  }
-
-  /**
-  * Closes the stream.
-  * @throws IOException If an error occurs while closing the stream.
-  * For example, if this stream was constructed with overwriteFile = false
-  * and a file of the same name already exists, then an IOException will
-  * be thrown either now or during an earlier {@link #write write}.
-  */
-  public void close ()
-  throws IOException
-  {
-    if (!fOpen) return;
-    fOpen = false;
-    fByteArrayOutputStream.close();
-    byte[] buffer = fByteArrayOutputStream.toByteArray();
-    ByteArrayInputStream tempInputStream = new ByteArrayInputStream(buffer);
-    try
-    {
-      FileResourceUtils.createFile(fFilePath, tempInputStream, fStatusHandler);
-    }
-    catch (CoreException e)
-    {
-      throw new IOException(e.getMessage());
-    }
-  }
-
-  /**
-  * Flushes the stream. This does not imply the File resource
-  * will be created or become visible within the workbench.
-  * @throws IOException If an error occurs. For example, if this
-  * stream was constructed with overwriteFile = false and a file of the
-  * same name already exists, then an IOException may be thrown at
-  * this point.
-  */
-  public void flush ()
-  throws IOException
-  {
-    fByteArrayOutputStream.flush();
-  }
-
-  /**
-  * Writes all bytes from the given array to the stream.
-  * @param b The array of bytes to write.
-  * @throws IOException If an error occurs. For example, if this
-  * stream was constructed with overwriteFile = false and a file of the
-  * same name already exists, then an IOException may be thrown at
-  * this point.
-  */
-  public void write ( byte[] b )
-  throws IOException
-  {
-    fByteArrayOutputStream.write(b);
-  }
-
-  /**
-  * Writes bytes from the given array beginning at some offset
-  * and continuing for some number of bytes (len) to the stream.
-  * @param b The array of bytes to write.
-  * @param off The offset into the array to begin writing.
-  * @param len The number of bytes to write.
-  * @throws IOException If an error occurs. For example, if this
-  * stream was constructed with overwriteFile = false and a file of the
-  * same name already exists, then an IOException may be thrown at
-  * this point.
-  */
-  public void write ( byte[] b, int off, int len )
-  {
-    fByteArrayOutputStream.write(b,off,len);
-  }
-
-  /**
-  * Writes a single byte to the stream.
-  * @param b The byte to write.
-  * @throws IOException If an error occurs. For example, if this
-  * stream was constructed with overwriteFile = false and a file of the
-  * same name already exists, then an IOException may be thrown at
-  * this point.
-  */
-  public void write ( int b )
-  {
-    fByteArrayOutputStream.write(b);
-  }
-}
-
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/FileResourceUtils.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/FileResourceUtils.java
deleted file mode 100644
index cde954f..0000000
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/FileResourceUtils.java
+++ /dev/null
@@ -1,550 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.environment.eclipse;
-
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Vector;
-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.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.common.environment.Choice;
-import org.eclipse.wst.common.environment.StatusException;
-import org.eclipse.wst.common.environment.IStatusHandler;
-
-
-
-/**
-* This class contains useful methods for working with Eclipse resources.
-*/
-public final class FileResourceUtils
-{
-  //
-  // Keeps the IWorkspace hanging around. See getWorkspace().
-  //
-  private static IWorkspace workspace_ = null;
-  //
-  // Keeps the IWorkspaceRoot hanging around. See getWorkspaceRoot().
-  //
-  private static IWorkspaceRoot root_ = null;
-
- /**
-  * Returns the IWorkspaceRoot object.
-  * @return The IWorkspaceRoot object.
-  */
-  public static IWorkspaceRoot getWorkspaceRoot ()
-  {
-    if (root_ == null)
-    {
-      root_ = ResourcesPlugin.getWorkspace().getRoot();
-    }
-    return root_;
-  }
-
- /**
-  * Returns the IWorkspace object.
-  * @return The IWorkspace object.
-  */
-  public static IWorkspace getWorkspace ()
-  {
-    if (workspace_ == null)
-    {
-      if (root_ == null)
-      {
-        root_ = ResourcesPlugin.getWorkspace().getRoot();
-      }
-      
-      workspace_ = root_.getWorkspace();
-    }
-    
-    return workspace_;
-  }
-  
-  /**
-   * 
-   * @return returns an array of three common choices. (ie. Yes, yes all, and cancel )
-   */
-  public static Choice[] getThreeStateFileOptions() 
-  {
-    Vector choices = new Vector();
-    
-    choices.add(new Choice( 'Y', Messages.LABEL_YES ));
-    choices.add(new Choice( 'A', Messages.LABEL_YES_TO_ALL ));
-    choices.add(new Choice( 'C', Messages.LABEL_CANCEL ));
-    
-    return (Choice[])choices.toArray(new Choice[choices.size()]);
-  }
-  
-  /**
-  * Returns an
-  * {@link org.eclipse.core.resources.IResource IResource}
-  * of the given absolute pathname or null if no such resource exists.
-  * @param absolutePathname The absolute path of the resource.
-  * @return The <code>IResource</code>.
-  */
-  public static IResource findResource ( String absolutePathname )
-  {
-    if (absolutePathname == null)
-    {
-      return null;
-    }
-    
-    return findResource(new Path(absolutePathname));
-  }
-
-  /**
-  * Returns an
-  * {@link org.eclipse.core.resources.IResource IResource}
-  * of the given absolute path or null if no such resource exists.
-  * @param absolutePath The absolute <code>IPath</code> of the resource.
-  * @return The <code>IResource</code>.
-  */
-  public static IResource findResource ( IPath absolutePath )
-  {
-    if (absolutePath == null)
-    {
-      return null;
-    }
-    
-    return FileResourceUtils.getWorkspaceRoot().findMember(absolutePath);
-  }
-  
-  /**
-   * Copies a file from a plugin's installation location
-   * to an Eclipse folder.
-   * @param plugin The plugin containing the files to copy.
-   * Must not be null.
-   * @param sourcePath The path, relative to the <code>plugin</code>
-   * install location, containing the files to copy.
-   * If null, then the plugin install location is the source path
-   * (ie. null is equivalent to ".").
-   * @param pathname The pathname of the file to copy.
-   * The pathname is relative to the <code>plugin sourcePath</code>.
-   * Must not be null.
-   * @param targetPath The absolute Eclipse path of the folder to
-   * which the file will be copied. The relative pathname of the
-   * file is preserved.
-   * Must not be null.
-   * @param createFolders The intermediate folder creation policy, one of
-   * {@link #CREATE CREATE} or {@link #DONT_CREATE DONT_CREATE}.
-   * <ul>
-   * <li><code>CREATE</code> -
-   * If any intermediate folders in the given <code>absolutePath</code>
-   * do not exist, they will be created.
-   * <li><code>DONT_CREATE</code> -
-   * If any intermediate folders in the given <code>absolutePath</code>
-   * do not exist, the method will throw a <code>CoreException</code>.
-   * </ul>
-   * @param overwriteFile The policy for existing files, one of
-   * {@link #OVERWRITE OVERWRITE} or {@link #DONT_OVERWRITE DONT_OVERWRITE}.
-   * <ul>
-   * <li><code>OVERWRITE</code> -
-   * If a resource of the same name as the given
-   * <code>absolutePath</code> already exists and is a file,
-   * it will be replaced.
-   * If the resource already exists and it is not a file,
-   * then no file will be created and
-   * a <code>CoreException</code> will be thrown.
-   * <li><code>DONT_OVERWRITE</code> -
-   * If any resource of the same name as the given
-   * <code>absolutePath</code> already exists,
-   * then no file will be created and
-   * a <code>CoreException</code> will be thrown.
-   * </ul>
-   * @param progressMonitor The progress monitor for the operation, or null.
-   * @throws CoreException An exception containing an
-   * {@link org.eclipse.core.runtime.IStatus IStatus}
-   * with a severity of <code>IStatus.ERROR</code> and a
-   * locale-specific description of the cause.
-   */
-   static public void copyFile( Plugin plugin,
-                                IPath sourcePath,
-                                IPath pathname,
-                                IPath targetPath,
-                                IStatusHandler statusMonitor )
-     throws CoreException
-   {
-     try
-     {
-       IPath target = targetPath.append(pathname);
-       IPath source = sourcePath == null ? pathname : sourcePath.append(pathname);
-       InputStream input = plugin.openStream(source);
-       createFile(target, input, statusMonitor);
-     }
-     catch (IOException e)
-     {
-       throw new CoreException(new Status(IStatus.ERROR,
-                               plugin.getBundle().getSymbolicName(),
-                               0,
-                               Messages.MSG_ERROR_IO,e));
-     }
-   }
-   
-  /**
-   * Deletes a file under a container.
-   * The container must already exist.
-   * @param file - the IFile to be deleted
-   * @param progressMonitor
-   * @param statusMonitor
-   * @return True if the file does not exist or if it exists and is successfully deleted. False otherwise.
-   */
-  public static boolean deleteFile( IFile file,
-                                    IStatusHandler statusMonitor)
-    throws CoreException
-  {
-    if (file.exists())
-    {      
-      //We have permission to overwrite so check if file is read-only
-      if (file.isReadOnly())
-      {        
-        IFile[] files = new IFile[1];
-        files[0] = file;
-        IStatus status = getWorkspace().validateEdit(files, null);
-        
-        if( status.getSeverity() == IStatus.ERROR )
-        {
-          statusMonitor.reportError( status );
-          return false;
-        }
-      }
-      
-      file.delete(true, null);
-    }
-    //At this point, either the file did not exist or we successfully deleted
-    // it. Return success.
-    return true;
-  }
-
-  /**
-   * Deletes a folder under a container.
-   * @param folder - the IFolder to be deleted
-   * @param progressMonitor
-   * @param statusMonitor
-   * @return True if the folder does not exist or if it exists and is successfully deleted along with its members. False otherwise.
-   */
-   public static boolean deleteFolder( IFolder folder,
-                                       IStatusHandler statusMonitor )
-     throws CoreException
-   {
-     if (!folder.exists()) return true;
-
-     boolean     deleted   = true;
-     IResource[] resources = folder.members();
-     
-     for (int i=0; i<resources.length; i++)
-     {
-       IResource resource = resources[i];
-       if (resource instanceof IFile)
-       {
-         deleted = deleteFile((IFile)resource, statusMonitor);
-       }
-       if (resource instanceof IFolder)
-       {
-         deleted = deleteFolder( (IFolder)resource, statusMonitor);
-       }
-
-       if( !deleted ) break;
-     }
-     
-     if( deleted )
-     {
-       folder.delete(true, true, null);
-       return true;
-     }
-     else
-       return false;
-   }
-
-  /**
-  * Creates a file of the given <code>absolutePath</code>
-  * and returns its handle as an <code>IFile</code>.
-  * If the file cannot be created, a
-  * <code>CoreException</code> containing an
-  * <code>IStatus</code> object is thrown.
-  * @param absolutePath The absolute path of the file to create.
-  * The project at the beginning of the path must already exist,
-  * that is, this method cannot be used to create projects.
-  * @param progressMonitor The progress monitor for the operation, or null.
-  * @return The {@link org.eclipse.core.resources.IFile IFile}
-  * handle of the file.
-  * @throws CoreException An exception containing an
-  * {@link org.eclipse.core.runtime.IStatus IStatus}
-  * with a severity of <code>IStatus.ERROR</code> and a
-  * locale-specific description of the cause.
-  */
-  public static IFile createFile (
-    IPath           absolutePath,
-    InputStream     inputStream,
-    IStatusHandler   statusHandler )
-
-    throws CoreException 
-  {    
-    if (!absolutePath.isAbsolute())
-    {
-      throw new CoreException(new Status(IStatus.ERROR, "ResourceUtils",0, NLS.bind( Messages.MSG_ERROR_PATH_NOT_ABSOLUTE, absolutePath.toString() ),null));
-    }
-    if (absolutePath.segmentCount() < 1)
-    {
-      throw new CoreException(new Status(IStatus.ERROR,"ResourceUtils",0,NLS.bind( Messages.MSG_ERROR_PATH_EMPTY, absolutePath.toString() ),null));
-    }
-    if (absolutePath.segmentCount() < 2)
-    {
-      throw new CoreException(new Status(IStatus.ERROR,"ResourceUtils",0,NLS.bind( Messages.MSG_ERROR_PATH_NOT_FOLDER, absolutePath.toString() ),null));
-    }
-    IContainer parent   = makeFolderPath(absolutePath.removeLastSegments(1), statusHandler);
-    String     fileName = absolutePath.lastSegment();
-    
-    return makeFile(parent, fileName, inputStream, statusHandler);
-  }
-
-  /**
-  * Creates under the given <code>project</code>
-  * a file of the given <code>relativePath</code>
-  * and returns its handle as an <code>IFile</code>.
-  * If the file cannot be created, a
-  * <code>CoreException</code> containing an
-  * <code>IStatus</code> object is thrown.
-  * @param absolutePath The absolute path of the file to create.
-  * The project at the beginning of the path must already exist,
-  * that is, this method cannot be used to create projects.
-  * @param createFolders The intermediate folder creation policy, one of
-  * {@link #CREATE CREATE} or {@link #DONT_CREATE DONT_CREATE}.
-  * <ul>
-  * <li><code>CREATE</code> -
-  * If any intermediate folders in the given <code>absolutePath</code>
-  * do not exist, they will be created.
-  * <li><code>DONT_CREATE</code> -
-  * If any intermediate folders in the given <code>absolutePath</code>
-  * do not exist, the method will throw a <code>CoreException</code>.
-  * </ul>
-  * @param overwriteFile The policy for existing files, one of
-  * {@link #OVERWRITE OVERWRITE} or {@link #DONT_OVERWRITE DONT_OVERWRITE}.
-  * <ul>
-  * <li><code>OVERWRITE</code> -
-  * If a resource of the same name as the given
-  * <code>absolutePath</code> already exists and is a file,
-  * it will be replaced.
-  * If the resource already exists and it is not a file,
-  * then no file will be created and
-  * a <code>CoreException</code> will be thrown.
-  * <li><code>DONT_OVERWRITE</code> -
-  * If any resource of the same name as the given
-  * <code>absolutePath</code> already exists,
-  * then no file will be created and
-  * a <code>CoreException</code> will be thrown.
-  * </ul>
-  * @param progressMonitor The progress monitor for the operation, or null.
-  * @return The {@link org.eclipse.core.resources.IFile IFile}
-  * handle of the file.
-  * @throws CoreException An exception containing an
-  * {@link org.eclipse.core.runtime.IStatus IStatus}
-  * with a severity of <code>IStatus.ERROR</code> and a
-  * locale-specific description of the cause.
-  */
-  public static IFile createFile (
-    IProject        project,
-    IPath           relativePath,
-    InputStream     inputStream,
-    IStatusHandler   statusMonitor )
- 
-    throws CoreException 
-  {
-    IPath absolutePath = project.getFullPath().append(relativePath);
-    return createFile(absolutePath, inputStream, statusMonitor);
-  }
-
-  /**
-  * Creates an output stream that can be used to write to the
-  * given <code>file</code>. Actual changes to the workspace
-  * may occur during creation of the stream, while writing to
-  * the stream, or when the stream is closed.
-  * A <code>CoreException</code> containing
-  * an <code>IStatus</code> will be thrown
-  * at some point in the lifecycle of the stream
-  * if the file resource cannot be created.
-  * @param file The {@link org.eclipse.core.resources.IFile IFile}
-  * handle of the file resource to create. The project implied by the
-  * pathname of the file must already exist,
-  * that is, this method cannot be used to create projects.
-  * @param progressMonitor The progress monitor for the operation, or null.
-  * @return An <code>OutputStream</code> tied to the file resource.
-  * Actual checks of or changes to the workspace may occur as early during
-  * stream creation, closure, or any time in between.
-  * @throws CoreException An exception containing an
-  * {@link org.eclipse.core.runtime.IStatus IStatus}
-  * with a severity of <code>IStatus.ERROR</code> and a
-  * locale-specific description of the cause.
-  * Reasons include:
-  * <ol>
-  * <li>The project of the given file's path does not exist.
-  * <li>A non-file resource of the same name of the given file
-  * already exists.
-  * <li>A file resource of the same name of the given file
-  * already exists, and <code>overwriteFile</code> is false.
-  * <li>One or more intermediate folders to the given file
-  * do not exist, and <code>createFolders</code> is false.
-  * </ol>
-  */
-
-  public static OutputStream newFileOutputStream (
-       IPath            file,
-       IStatusHandler    statusHandler )
- 
-  {
-    return new FileResourceOutputStream(file, statusHandler);
-  }
-
-  //----------------------------------------------------------------------
-  // Naughty bits...
-  //----------------------------------------------------------------------
-
-  //
-  // Creates a path of folders.
-  // Do not call with an absolutePath of less than one segment.
-  //
-  /**
-   * Creates a path of folders.
-   * Do not call with an absolutePath of less than one segment.
-   * @param resourceContext the resource context for making folders.
-   * @param absolutePath the path of folders that will be created.
-   * @param progressMonitor the progress monitor to be used.
-   * @param statusHandler the status handler.
-   * @return returns the IContainer of the created folder.
-   */
-  public static IContainer makeFolderPath (
-    IPath            absolutePath,
-    IStatusHandler    statusHandler )
-  
-    throws CoreException
-  {
-    if (absolutePath.segmentCount() <= 1)
-    {
-      return getWorkspaceRoot().getProject(absolutePath.segment(0));
-    }
-    else
-    {
-      IContainer parent = makeFolderPath(absolutePath.removeLastSegments(1), statusHandler );
-      String folderName = absolutePath.lastSegment();
-      
-      return makeFolder(parent,folderName, statusHandler );
-    }
-  }
-  //
-  // Creates a folder under a container.
-  // The container must already exist.
-  //
- private static IFolder makeFolder (
-    IContainer       parent,
-    String           folderName,
-    IStatusHandler    statusHandler )
-  
-  throws CoreException
-  {
-    IResource child  = parent.findMember(folderName);
-    
-    if( child == null )
-    {      
-      IFolder folder = parent.getFolder(new Path(folderName));
-      folder.create(true,true,null);
-      return folder;
-    }
-    else if( child.getType() == IResource.FOLDER )
-    {
-      return (IFolder)child;
-    }
-    else
-    {
-      throw new CoreException(
-        new Status( IStatus.ERROR, 
-                    "ResourceUtils",
-                    0, 
-					NLS.bind( Messages.MSG_ERROR_RESOURCE_NOT_FOLDER, parent.getFullPath().append(folderName).toString()),
-			null ) );
-    }
-  }
-
-  //
-  // Creates a file under a container.
-  // The container must already exist.
-  //
- private static IFile makeFile (
-    IContainer       parent,
-    String           fileName,
-    InputStream      inputStream,
-    IStatusHandler    statusHandler )
- 
-    throws CoreException
-  {
-    IResource child  = parent.findMember(fileName);
-    
-    if( child != null )
-    {
-      if( child.getType() == IResource.FILE )
-      {        
-        //We have permission to overwrite so check if file is read-only
-        if( child.getResourceAttributes().isReadOnly() )
-        {
-          IFile[] files = new IFile[1];
-          files[0] = (IFile)child;
-          
-          IStatus status = getWorkspace().validateEdit(files,null);
-          
-          try
-          {
-            statusHandler.report( status );
-          }
-          catch( StatusException exc )
-          {
-            return null;
-          }
-        }
-
-        //Change the contents of the existing file.
-        IFile file = parent.getFile( new Path(fileName) );
-        file.setContents( inputStream, true, true, null );
-        
-        return file;
-      
-      }
-      else
-      {
-        throw new CoreException( 
-          new Status( IStatus.ERROR,
-                      "ResourceUtils",
-                      0, 
-				      NLS.bind( Messages.MSG_ERROR_RESOURCE_NOT_FILE, parent.getFullPath().append(fileName)),
-					  null ) );
-      }
-    }
-    else
-    {
-      //Create a new file.
-      IFile file = parent.getFile( new Path(fileName) );
-      file.create( inputStream, true, null);
-      
-      return file;
-    }
-  }
-}
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/Messages.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/Messages.java
deleted file mode 100644
index 4c08ea1..0000000
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/Messages.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 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
- **************************************************************************************************/
-package org.eclipse.wst.common.internal.environment.eclipse;
-
-import org.eclipse.osgi.util.NLS;
-
-public class Messages extends NLS
-{
-  private static final String BUNDLE_NAME = "org.eclipse.wst.common.internal.environment.eclipse.environment";
-  
-  public static String MSG_NULL_ARG_SPECIFIED;
-  public static String MSG_SCHEME_NOT_FOUND;
-  public static String MSG_ABSOLUTE_PATH_WITHOUT_SCHEME;
-  public static String MSG_URI_NOT_RELATIVE; 
-  public static String MSG_ERROR_UNEXPECTED_ERROR; 
-  public static String MSG_INVALID_PLATFORM_URL; 
-  public static String MSG_INVALID_FILE_URL;
-  public static String MSG_ERROR_PATH_NOT_ABSOLUTE; 
-  public static String MSG_ERROR_PATH_EMPTY; 
-  public static String MSG_ERROR_PATH_NOT_FOLDER; 
-  public static String MSG_ERROR_RESOURCE_NOT_FOLDER; 
-  public static String MSG_ERROR_RESOURCE_NOT_FILE; 
-  public static String MSG_ERROR_FOLDER_HAS_CHILDREN; 
-  public static String MSG_ERROR_IO; 
-  public static String LABEL_YES; 
-  public static String LABEL_YES_TO_ALL; 
-  public static String LABEL_CANCEL; 
-  
-  static
-  {
-    NLS.initializeMessages( BUNDLE_NAME, Messages.class );
-  }
-}
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/environment.properties b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/environment.properties
deleted file mode 100644
index 6fb49d6..0000000
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/environment.properties
+++ /dev/null
@@ -1,40 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2004 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-#
-# Messages for SimpleURIFactory
-#
-MSG_NULL_ARG_SPECIFIED=Null specified as argument to {0}.
-MSG_SCHEME_NOT_FOUND=Scheme not found for URI {0}.
-MSG_ABSOLUTE_PATH_WITHOUT_SCHEME=Absolute path specified without a scheme for URI {0}.
-
-#
-# Common Messages
-#
-MSG_URI_NOT_RELATIVE=URL: {0} is not relative.
-MSG_ERROR_UNEXPECTED_ERROR=Unexpected exception occured.
-MSG_INVALID_PLATFORM_URL=Invalid URL: {0} for an Eclipse platform.
-MSG_INVALID_FILE_URL=Invalid URL: {0} for the file protocol
-
-#
-# Messages for ResouceUtils
-#
-MSG_ERROR_PATH_NOT_ABSOLUTE=Path {0} is not absolute for creating a file.
-MSG_ERROR_PATH_EMPTY=Path {0} is empty while creating a file.
-MSG_ERROR_PATH_NOT_FOLDER=Path {0} is not a folder for creating a file.
-MSG_ERROR_RESOURCE_NOT_FOLDER=Resource {0} is not a folder.
-MSG_ERROR_RESOURCE_NOT_FILE=The following path is not a resource: {0}.
-MSG_ERROR_FOLDER_HAS_CHILDREN=Can not create folder: {0} that already has children.
-MSG_ERROR_IO=An input/output error occurred while processing the resource "{0}".
-
-LABEL_YES=Yes
-LABEL_YES_TO_ALL=Yes All
-LABEL_CANCEL=Cancel
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/relative/RelativeScheme.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/relative/RelativeScheme.java
deleted file mode 100644
index b993a11..0000000
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/relative/RelativeScheme.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.environment.relative;
-
-import java.net.URL;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.wst.common.environment.uri.IURI;
-import org.eclipse.wst.common.environment.uri.IURIScheme;
-import org.eclipse.wst.common.environment.uri.URIException;
-
-
-public class RelativeScheme implements IURIScheme
-{
-
-  public String toString()
-  {
-    return "relative";  
-  }
-  
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URIScheme#isHierarchical()
-   */
-  public boolean isHierarchical()
-  {
-    return true;
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URIScheme#isValid(org.eclipse.env.uri.URI)
-   */
-  public boolean isValid(IURI uri)
-  {
-    return !uri.toString().startsWith( "/" );
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URIScheme#newURI(java.lang.String)
-   */
-  public IURI newURI(String uri) throws URIException
-  {
-    return new RelativeURI( uri );
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URIScheme#newURI(org.eclipse.env.uri.URI)
-   */
-  public IURI newURI(IURI uri) throws URIException
-  {
-    return new RelativeURI( uri.toString() );
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URIScheme#newURI(java.net.URL)
-   */
-  public IURI newURI(URL url) throws URIException
-  {
-    return new RelativeURI( url.toString() );
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URIScheme#validate(org.eclipse.env.uri.URI)
-   */
-  public IStatus validate(IURI uri)
-  {
-    IStatus result = null;
-    
-    if( isValid( uri ) )
-    {
-      result = Status.OK_STATUS;
-    }
-    else
-    {
-      result = new Status( IStatus.ERROR, "id", 0, "",null );      
-    }
-    
-    return result;
-  }
-}
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/relative/RelativeURI.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/relative/RelativeURI.java
deleted file mode 100644
index 1196111..0000000
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/relative/RelativeURI.java
+++ /dev/null
@@ -1,271 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.environment.relative;
-
-import java.io.File;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.URL;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.common.environment.uri.IURI;
-import org.eclipse.wst.common.environment.uri.IURIFilter;
-import org.eclipse.wst.common.environment.uri.IURIScheme;
-import org.eclipse.wst.common.environment.uri.IURIVisitor;
-import org.eclipse.wst.common.environment.uri.URIException;
-import org.eclipse.wst.common.internal.environment.eclipse.Messages;
-
-
-public class RelativeURI implements IURI
-{
-  protected String uri_;
-  
-  public RelativeURI( String uri )
-  {
-    uri_ = uri;   
-  }
-  
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#append(org.eclipse.env.uri.URI)
-   */
-  public IURI append(IURI relativeURI) throws URIException
-  {
-    if( !relativeURI.isRelative()) 
-     {      
-      throw new URIException( 
-          new Status( IStatus.ERROR, "id", 0,
-              NLS.bind( Messages.MSG_URI_NOT_RELATIVE, relativeURI.toString() ), null ) );
-      
-    }
-    
-    String newURI = uri_ + "/" + relativeURI.toString();
-    
-    return getURIScheme().newURI( newURI );
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#asFile()
-   */
-  public File asFile() 
-  {
-    return null;
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#asString()
-   */
-  public String asString()
-  {
-    return uri_;
-  }
-  
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#toString()
-   */
-  public String toString()
-  {
-    return uri_;
-  }
-  
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#asURL()
-   */
-  public URL asURL() throws URIException
-  {
-    return null;
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#erase()
-   */
-  public void erase() throws URIException
-  {
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#getInputStream()
-   */
-  public InputStream getInputStream() throws URIException
-  {
-    return null;
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#getOutputStream()
-   */
-  public OutputStream getOutputStream() throws URIException
-  {
-    return null;
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#getURIScheme()
-   */
-  public IURIScheme getURIScheme()
-  {
-    return new RelativeScheme();
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#isAvailableAsFile()
-   */
-  public boolean isAvailableAsFile()
-  {
-    return false;
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#isAvailableAsURL()
-   */
-  public boolean isAvailableAsURL()
-  {
-    return false;
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#isHierarchical()
-   */
-  public boolean isHierarchical()
-  {
-    return true;
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#isLeaf()
-   */
-  public boolean isLeaf()
-  {
-    return false;
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#isPresent()
-   */
-  public boolean isPresent()
-  {
-    return false;
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#isReadable()
-   */
-  public boolean isReadable()
-  {
-    return false;
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#isRelative()
-   */
-  public boolean isRelative()
-  {
-    return true;
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#isWritable()
-   */
-  public boolean isWritable()
-  {
-    return false;
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#list()
-   */
-  public IURI[] list() throws URIException
-  {
-    return new IURI[0];
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#list(org.eclipse.env.uri.URIFilter)
-   */
-  public IURI[] list(IURIFilter uriFilter) throws URIException
-  {
-    return new IURI[0];
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#parent()
-   */
-  public IURI parent() throws URIException
-  {
-    int lastSlash  = uri_.lastIndexOf( '/' );
-    int firstSlash = uri_.indexOf( '/' );
-    
-    // If there is a parent, then it must start with a slash
-    // and end with a slash.
-    if( lastSlash == -1 || firstSlash == -1 ) return null;
-        
-    return getURIScheme().newURI( uri_.substring(0, lastSlash ) );
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#rename(org.eclipse.env.uri.URI)
-   */
-  public void rename(IURI newURI) throws URIException
-  {
-    uri_ = newURI.toString();
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#touchFolder()
-   */
-  public void touchFolder() throws URIException
-  {
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#touchLeaf()
-   */
-  public void touchLeaf() throws URIException
-  {
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#visit(org.eclipse.env.uri.URIVisitor, org.eclipse.env.uri.URIFilter)
-   */
-  public void visit(IURIVisitor uriVisitor, IURIFilter uriFilter)
-    throws URIException
-  {
-    boolean continueVisit = true;
-    
-    // If the filter accepts this we will visit it.
-    if( uriFilter.accepts( this ) )
-    {
-      continueVisit = uriVisitor.visit( this );  
-    }
-       
-    IURI[] children  = list();
-    
-    for( int index = 0; index < children.length && continueVisit; index++ )
-    {
-      children[index].visit( uriVisitor, uriFilter );
-    }  
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#visit(org.eclipse.env.uri.URIVisitor)
-   */
-  public void visit(IURIVisitor uriVisitor) throws URIException
-  {
-    boolean continueVisit = uriVisitor.visit( this );  
-    
-    IURI[] children  = list();
-    
-    for( int index = 0; index < children.length && continueVisit; index++ )
-     {
-      children[index].visit( uriVisitor );
-    }  
-  }
-}
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/uri/file/FileScheme.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/uri/file/FileScheme.java
deleted file mode 100644
index 7655f52..0000000
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/uri/file/FileScheme.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.environment.uri.file;
-
-import java.net.URL;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.common.environment.uri.IURI;
-import org.eclipse.wst.common.environment.uri.IURIScheme;
-import org.eclipse.wst.common.environment.uri.URIException;
-import org.eclipse.wst.common.internal.environment.eclipse.Messages;
-import org.eclipse.wst.common.internal.environment.relative.RelativeScheme;
-import org.eclipse.wst.common.internal.environment.relative.RelativeURI;
-
-
-public class FileScheme extends RelativeScheme
-{
-  public String toString()
-  {
-    return "file";  
-  }
-  
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URIScheme#isValid(org.eclipse.env.uri.URI)
-   */
-  public boolean isValid(IURI uri)
-  { 
-    boolean result = false;
-    
-    if( uri == null ) return false;
-    
-    IURIScheme scheme = uri.getURIScheme();
-      
-    if( scheme.toString().equals( "relative") ) return scheme.isValid( uri );
-        
-    String uriString = uri.toString();
-      
-    if( uriString != null && uriString.startsWith( "file:" ) )
-    {
-      result = true;
-    }  
-    
-    return result;
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URIScheme#newURI(java.lang.String)
-   */
-  public IURI newURI(String uri) throws URIException
-  {
-    String newURI = null;
-    
-    if( uri != null && uri.startsWith( "file:") )
-    {
-      // The file protocol has been specified so keep it as is.
-      newURI = uri;
-    }
-    else if( uri == null || uri.indexOf( ":") != -1 )
-    {
-      // The file uri is not allowed to contain some other protocol. 
-      throw new URIException(
-          new Status( IStatus.ERROR, "id", 0,
-              NLS.bind( Messages.MSG_INVALID_FILE_URL,uri), null ) );
-              
-    }
-    else if( uri.startsWith( "/") )
-    {
-      // The file scheme has not been specified so we will add it.
-      newURI = "file:" + uri;
-    }
-    
-    if( newURI == null )
-    {
-      return new RelativeURI( uri );
-    }
-    else
-    {
-      return new FileURI( newURI );
-    }
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URIScheme#newURI(org.eclipse.env.uri.URI)
-   */
-  public IURI newURI(IURI uri) throws URIException
-  {
-    return newURI( uri == null ? null : uri.toString() );
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URIScheme#newURI(java.net.URL)
-   */
-  public IURI newURI(URL url) throws URIException
-  {
-    return newURI( url == null ? null : url.toString() );
-  }
-}
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/uri/file/FileURI.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/uri/file/FileURI.java
deleted file mode 100644
index 5d95b0b..0000000
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/uri/file/FileURI.java
+++ /dev/null
@@ -1,297 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.internal.environment.uri.file;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Vector;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.wst.common.environment.uri.IURI;
-import org.eclipse.wst.common.environment.uri.URIException;
-import org.eclipse.wst.common.environment.uri.IURIFilter;
-import org.eclipse.wst.common.environment.uri.IURIScheme;
-import org.eclipse.wst.common.internal.environment.relative.RelativeURI;
-
-
-public class FileURI extends RelativeURI 
-{
-  private File file_ = null;
-  
-  public FileURI( String uri )
-  {
-    super( uri );
-    
-    if( getURIScheme().isValid( this ) )
-    {
-      file_ = new File( uri.substring( 5, uri.length() ) );
-    }
-  }
-  
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#asFile()
-   */
-  public File asFile() 
-  {
-    return file_;
-  }
-  
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#erase()
-   */
-  public void erase() throws URIException
-  {
-    deleteFile( file_ );
-  }
-
-  private void deleteFile( File file )
-  {
-    if( file.isDirectory() )
-    {
-      File[] children = file.listFiles();
-      
-      for( int index = 0; index < children.length; index++ )
-      {
-        File child = children[index];
-        
-        if( child.isDirectory() )
-        {
-          deleteFile( child );
-        }
-        else
-        {
-          child.delete();
-        }
-      }
-    }
-    
-    file.delete();
-  }
-  
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#getInputStream()
-   */
-  public InputStream getInputStream() throws URIException
-  {
-    FileInputStream stream = null;
-    
-    try
-    {
-      File parent = file_.getParentFile();
-      parent.mkdirs();
-      
-      stream = new FileInputStream( file_ );  
-    }
-    catch( IOException exc )
-    {
-      throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this );
-    }
-    
-    return stream;
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#getOutputStream()
-   */
-  public OutputStream getOutputStream() throws URIException
-  {
-    FileOutputStream stream = null;
-    
-    try
-    {
-      File parent = file_.getParentFile();
-      parent.mkdirs();
-      
-      stream = new FileOutputStream( file_ );  
-    }
-    catch( IOException exc )
-    {
-      throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this );
-    }
-    
-    return stream;
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#getURIScheme()
-   */
-  public IURIScheme getURIScheme()
-  {
-    return new FileScheme();
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#isAvailableAsFile()
-   */
-  public boolean isAvailableAsFile()
-  {
-    return file_ != null;
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#isAvailableAsURL()
-   */
-  public boolean isAvailableAsURL()
-  {
-    return file_ != null;
-  }
-  
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#asURL()
-   */
-  public URL asURL() throws URIException
-  {
-    URL url = null;
-    
-    try
-    {
-      url = file_ == null ? null : file_.toURL();
-    }
-    catch( MalformedURLException exc )
-    {
-      throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this );      
-    }
-    
-    return url;
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#isLeaf()
-   */
-  public boolean isLeaf()
-  {
-    return file_.isFile();
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#isPresent()
-   */
-  public boolean isPresent()
-  {
-    return file_.exists();
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#isReadable()
-   */
-  public boolean isReadable()
-  {
-    return file_.canRead();
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#isWritable()
-   */
-  public boolean isWritable()
-  {
-    return file_.canWrite();
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#list()
-   */
-  public IURI[] list() throws URIException
-  {
-    File[] children = file_.listFiles();
-    IURI[]  URIs     = new IURI[0];
-    
-    if( children != null )
-    {
-      int   length   = children.length;
-      
-      URIs = new IURI[length];
-    
-      for( int index = 0; index < length; index++ )
-      {
-        URIs[index] = new FileURI( "file:" + children[index].getAbsolutePath() );
-      }
-    }
-    
-    return URIs;
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#list(org.eclipse.env.uri.URIFilter)
-   */
-  public IURI[] list(IURIFilter uriFilter) throws URIException
-  {
-    File[]   children = file_.listFiles();
-    int      length   = children == null ? 0 : children.length;
-    Vector   URIs     = new Vector();
-    
-    for( int index = 0; index < length; index++ )
-    {
-      IURI newURI = new FileURI( "file:" + children[index].getAbsolutePath() );
-      
-      if( uriFilter.accepts( newURI) )
-      {
-        URIs.add( newURI );
-      } 
-    }
-    
-    return (IURI[])URIs.toArray( new IURI[0] );
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#rename(org.eclipse.env.uri.URI)
-   */
-  public void rename(IURI newURI) throws URIException
-  {
-    try
-    {
-      uri_ = newURI.toString();
-      URL newURL = new URL( uri_ );
-      file_.renameTo( new File( newURL.getPath() ) );
-    }
-    catch( MalformedURLException exc )
-    {
-      throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this );      
-    }
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#touchFolder()
-   */
-  public void touchFolder() throws URIException
-  {
-    file_.mkdirs();
-  }
-
-  /* (non-Javadoc)
-   * @see org.eclipse.env.uri.URI#touchLeaf()
-   */
-  public void touchLeaf() throws URIException
-  {
-    try
-    {
-      // Ensure that the parent folders are created.
-      File parent = file_.getParentFile();
-      parent.mkdirs();
-      
-      file_.createNewFile();
-    }
-    catch( IOException exc )
-    {
-      throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this );      
-    }
-  }
-
-  public boolean isRelative()
-  {
-    return false;
-  }    
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/.classpath b/plugins/org.eclipse.wst.common.frameworks.ui/.classpath
deleted file mode 100644
index 014fb18..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="wtp_ui/"/>
-	<classpathentry kind="src" path="property_files"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/.cvsignore b/plugins/org.eclipse.wst.common.frameworks.ui/.cvsignore
deleted file mode 100644
index 65cee0b..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/.cvsignore
+++ /dev/null
@@ -1,6 +0,0 @@
-bin
-temp.folder
-build.xml
-wtp_ui.jar
-@dot
-src.zip
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/.project b/plugins/org.eclipse.wst.common.frameworks.ui/.project
deleted file mode 100644
index 47885fd..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.common.frameworks.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.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.common.frameworks.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index dd735e1..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,20 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: WTP UI Plug-in
-Bundle-Vendor: %providerName
-Bundle-SymbolicName: org.eclipse.wst.common.frameworks.ui; singleton:=true
-Bundle-Version: 1.0.1.qualifier
-Bundle-Activator: org.eclipse.wst.common.frameworks.internal.ui.WTPUIPlugin
-Bundle-Localization: plugin
-Export-Package: .,
- org.eclipse.wst.common.frameworks.internal.datamodel.ui,
- org.eclipse.wst.common.frameworks.internal.operation.extensionui,
- org.eclipse.wst.common.frameworks.internal.ui
-Require-Bundle: org.eclipse.ui.ide,
- org.eclipse.core.resources,
- org.eclipse.ui,
- org.eclipse.wst.common.frameworks;visibility:=reexport,
- org.eclipse.core.runtime,
- org.eclipse.jem.util,
- org.eclipse.wst.common.environment
-Eclipse-AutoStart: true
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/about.html b/plugins/org.eclipse.wst.common.frameworks.ui/about.html
deleted file mode 100644
index 6f6b96c..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.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>February 24, 2005</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/plugins/org.eclipse.wst.common.frameworks.ui/build.properties b/plugins/org.eclipse.wst.common.frameworks.ui/build.properties
deleted file mode 100644
index feb73fb..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/build.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-###############################################################################
-# Copyright (c) 2003, 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
-###############################################################################
-output.. = bin/
-bin.includes = plugin.xml,\
-               .,\
-               META-INF/,\
-               plugin.properties,\
-               about.html
-source.. = wtp_ui/,\
-                    property_files/
-src.includes = schema/,\
-               plugin.properties
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/plugin.properties b/plugins/org.eclipse.wst.common.frameworks.ui/plugin.properties
deleted file mode 100644
index 9f80220..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/plugin.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-###############################################################################
-# Copyright (c) 2003, 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
-###############################################################################
-Cut=Cut
-FLEXIBLE_PROJECT_PREFERENCE=J2EE Project Modules
-providerName=Eclipse.org
-WTP_UI_Action=WTP UI Action
-Extended_Viewers=Extended Viewers
-Extendable_Wizard=Extendable Wizard
-Extendable_Wizard_Page=Extendable Wizard Page
-DataModelWizard=DataModelWizard
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/plugin.xml b/plugins/org.eclipse.wst.common.frameworks.ui/plugin.xml
deleted file mode 100644
index e98a3bc..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/plugin.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-     <extension-point id="wtpuiAction" name="%WTP_UI_Action" schema="schema/wtpuiAction.exsd"/>
-   <extension-point id="extendedViewer" name="%Extended_Viewers" schema="schema/extendedViewer.exsd"/>
-   <extension-point id="extendableWizard" name="%Extendable_Wizard" schema="schema/extendableWizard.exsd"/>
-   <extension-point id="wizardPageGroup" name="%Extendable_Wizard_Page" schema="schema/extendableWizardPage.exsd"/>
-   <extension-point id="DataModelWizardExtension" name="%DataModelWizard" schema="schema/DataModelWizardExtension.exsd"/>
-
-   <extension
-         id="UITester"
-         point="org.eclipse.jem.util.uiTester">
-      <uiTester
-            className="org.eclipse.wst.common.frameworks.internal.ui.UITesterImpl">
-      </uiTester>
-   </extension>
-   <extension
-         id="context.Sensitive.Class.saveHandler"
-         name="Save Handler - Headless Context Class"
-         point="org.eclipse.jem.util.uiContextSensitiveClass">
-      <uiContextSensitiveClass
-            key="saveHandler"
-            context="UI"
-            className="org.eclipse.wst.common.frameworks.internal.ui.SaveHandlerUI">
-      </uiContextSensitiveClass>
-   </extension>
-   <extension
-         id="org.eclipse.wst.common.frameworks.internal.ui.EnablementDetermination"
-         name="UI Enablement Determination"
-         point="org.eclipse.jem.util.uiContextSensitiveClass">
-      <uiContextSensitiveClass
-            key="org.eclipse.wst.common.frameworks.internal.EnablementDetermination"
-            context="UI"
-            className="org.eclipse.wst.common.frameworks.internal.ui.UIEnablementManager">
-      </uiContextSensitiveClass>
-   </extension>
-   <extension
-         point="org.eclipse.wst.common.frameworks.WTPActivityBridgeHelper">
-      <WTPActivityBridgeHelper
-            class="org.eclipse.wst.common.frameworks.internal.ui.WTPActivityBridgeHelperImpl">
-      </WTPActivityBridgeHelper>
-   </extension>
-   <!--
-   <extension
-         point="org.eclipse.wst.common.frameworks.internals.OperationExtension">
-      <operationExtension
-            postOperationClass="org.eclipse.wst.common.frameworks.internal.operation.extension.ui.PostPasteActionOperation"
-            id="org.eclipse.wst.common.frameworks.internal.operation.extension.ui.PasteActionOperation"/>
-   </extension>
-   -->
-   
-</plugin>
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/prepareforpii.xml b/plugins/org.eclipse.wst.common.frameworks.ui/prepareforpii.xml
deleted file mode 100644
index d2dca48..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/prepareforpii.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<project name="PrepareForPII" default="main" basedir=".">
-		
-	<!-- Setup temp variables -->
-	<target name="init">
-		<property name="nlsDir" value="d:/NLS/Corona/0526"/>
-		<property name="plugin" value="com.ibm.wtp.common.ui"/>
-		<property name="plugindir" value="d:/workspaceCorona/${plugin}"/>
-		<property name="outputDir" value="${nlsDir}/${plugin}"/>
-		
-	
-	</target>
-
-	<!-- Create the destination dir -->
-	<target name="nlsDir" depends="init">
-		<mkdir dir="${nlsDir}"/>
-	</target>
-	
-	<!-- Create the destination dir -->
-	<target name="plugindir" depends="nlsDir">
-		<delete dir="${outputDir}"/>
-		<mkdir dir="${outputDir}"/>
-	</target>
-
-	<!-- Move the files to the correct locations in the workspace. -->
-	<target name="main" depends="plugindir">
-	
-		<messageIdGen folderPath = "${plugindir}" componentId = "E" />
-		
-		<copy todir = "${outputDir}/property_files" >
-			 <fileset dir="${plugindir}/property_files">
-           	  <include name="**/*.properties"/>
-  			 </fileset>
-  		</copy>
-  		
-  		<copy file="${plugindir}/plugin.properties" todir="${outputDir}"/>
-  		
-	</target>
-</project>
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/property_files/wtpcommonui.properties b/plugins/org.eclipse.wst.common.frameworks.ui/property_files/wtpcommonui.properties
deleted file mode 100644
index 26c45ec..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/property_files/wtpcommonui.properties
+++ /dev/null
@@ -1,36 +0,0 @@
-###############################################################################
-# Copyright (c) 2003, 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
-###############################################################################
-IActionWTPOperation_UI_0=No action available for execution.
-WTPActionDialog_UI_0=Select the optional dependent actions you would like to execute.
-WTPOptionalOperationDataModel_UI_0=Root tree can not be selected.
-WTPOptionalOperationDataModel_UI_1=No operations are selected.
-MasterDescriptor_ERROR_2=IWAE0005E WTPUIOperation elements require exactly one <selectionEnablement />.
-WTPOperationAction_UI_0=Operation Status
-WTPOperationAction_UI_1=Problem executing operation.
-TimerQueue_ERROR_0=IWAE0006E Can't start a TimerQueue that is already running
-ExtendedWizardPage_ERROR_0=IWAE0007E Cannot modify id after it has already been set.
-ExtendedWizardPage_ERROR_1=IWAE0008E The id cannot be null
-MasterDescriptor_UI_1=No \" {0} \" attribute defined
-Timer_UI_0=Invalid delay: {0}
-Timer_UI_1=Invalid initial delay: {0}
-WTPWizard_UI_0=Wizard Error: {0}
-WTPWizard_UI_1=An error has occurred when {0} finished.
-ExtendableWizard_UI_0=Wizard page failed to be created in {0} {1}
-WizardPageExtensionManager_UI_0=Element: {0} does not allow page insertion after.
-WizardPageExtensionManager_UI_1={0} will not be created
-WizardPageExtensionManager_UI_2=Circular dependancy, element: {0} check: {1}
-WizardPageExtensionManager_UI_3=Editor does not allow page insertions
-WizardPageExtensionManager_UI_4=Parent Class Not Found Error: {0} \r\n for attribute: {1} in plugin {2} \r\nPage not created
-Delete_UI_0=Delete
-Name_=Project Name:
-Browse_=Browse...
-Project_location_=Project Location:
-MULTIPLE_MODULE_PREF_TEXT=Allow Multiple modules per project
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/schema/DataModelWizardExtension.exsd b/plugins/org.eclipse.wst.common.frameworks.ui/schema/DataModelWizardExtension.exsd
deleted file mode 100644
index ca5341c..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/schema/DataModelWizardExtension.exsd
+++ /dev/null
@@ -1,113 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.common.frameworks.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.common.frameworks.ui" id="DataModelWizardExtension" name="Data Model Wizard Extension"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="DataModelWizard"/>
-         </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">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="DataModelWizard">
-      <complexType>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;This extension point is part of an interim API that is still under development and expected to change significantly before reaching stability. It is being made available at this early stage to solicit feedback from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken (repeatedly) as the API evolves.&lt;/b&gt;
-      </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) 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/schema/extendableWizard.exsd b/plugins/org.eclipse.wst.common.frameworks.ui/schema/extendableWizard.exsd
deleted file mode 100644
index 60b35aa..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/schema/extendableWizard.exsd
+++ /dev/null
@@ -1,103 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.common.frameworks.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.common.frameworks.ui" id="extendableWizard" name="Extendable Wizard"/>
-      </appInfo>
-      <documentation>
-         Edit model editors represent the multi page editors that can be used to edit a collection of EMF resources.  By declaring an edit model editor, the plugin provider allows the framework to generically obtain the edit model used by the editor.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="extendableWizard" minOccurs="1" maxOccurs="unbounded"/>
-         </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">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="extendableWizard">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.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 (c) 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/schema/extendableWizardPage.exsd b/plugins/org.eclipse.wst.common.frameworks.ui/schema/extendableWizardPage.exsd
deleted file mode 100644
index e94ffa1..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/schema/extendableWizardPage.exsd
+++ /dev/null
@@ -1,143 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.common.frameworks.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.common.frameworks.ui" id="wizardPageGroup" name="Extendable Wizard Page"/>
-      </appInfo>
-      <documentation>
-         Edit model editors represent the multi page editors that can be used to edit a collection of EMF resources.  By declaring an edit model editor, the plugin provider allows the framework to generically obtain the edit model used by the editor.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <choice>
-               <element ref="wizardPageGroup"/>
-            </choice>
-         </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">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="wizardPageGroup">
-      <complexType>
-         <sequence>
-            <choice>
-               <element ref="factory"/>
-            </choice>
-         </sequence>
-         <attribute name="wizardID" type="string" use="required">
-            <annotation>
-               <documentation>
-                  This must match the id defined in the extendableWizard element in the extendableWizard extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="allowsExtendedPagesAfter" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="pageGroupInsertionID" type="string">
-            <annotation>
-               <documentation>
-                  If this page is to immediately after another page, this must match the pageID of the page to insert after.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="pageGroupID" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="factory">
-      <complexType>
-         <attribute name="className" type="string" use="required">
-            <annotation>
-               <documentation>
-                  This class is an instancof com.ibm.wtp.common.ui.wizard.extensions.WizardExtensionFactory
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.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 (c) 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/schema/extendedViewer.exsd b/plugins/org.eclipse.wst.common.frameworks.ui/schema/extendedViewer.exsd
deleted file mode 100644
index eca8862..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/schema/extendedViewer.exsd
+++ /dev/null
@@ -1,138 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.common.frameworks.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.common.frameworks.ui" id="extendedViewer" name="Extended Viewers"/>
-      </appInfo>
-      <documentation>
-         The extendedViewer Extension point allows the contribution of new function
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="extendedViewer"/>
-         </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">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="extendedViewer">
-      <complexType>
-         <attribute name="viewerID" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="parentViewerID" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="factoryClass" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="label" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="functionGroupID" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;This extension point is part of an interim API that is still under development and expected to change significantly before reaching stability. It is being made available at this early stage to solicit feedback from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken (repeatedly) as the API evolves.&lt;/b&gt;
-      </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) 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/schema/wtpuiAction.exsd b/plugins/org.eclipse.wst.common.frameworks.ui/schema/wtpuiAction.exsd
deleted file mode 100644
index baf2a87..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/schema/wtpuiAction.exsd
+++ /dev/null
@@ -1,367 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.common.frameworks.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.common.frameworks.ui" id="wtpuiAction" name="WTP UI Action"/>
-      </appInfo>
-      <documentation>
-         This extension point is for WTP Operations which need to be tied to a generic UI action, such as CUT, COPY, PASTE, DELETE, and RENAME.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <choice>
-               <element ref="masterOperation"/>
-               <element ref="slaveOperation"/>
-            </choice>
-         </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">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="masterOperation">
-      <annotation>
-         <documentation>
-            A masterOperation enables an existing WTP Operation to be used in a UI action. Generic Ids aggregate a set of masterOperations for the same Abstract action (like a &quot;CUT&quot; operation). WTP Operations are themselves extendible, so for any masterOperation defined, there may be any number of pre|post operations. These pre|post operation can have slaveOperation elements defined which indicate the pre|post operation may be run independently.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="selectionEnablement"/>
-         </sequence>
-         <attribute name="extendedGenericId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The ID of the Generic Action you would like to contribute to. (e.g. The id for CUT, COPY, PASTE, DELETE, RENAME).
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="operationClass" type="string">
-            <annotation>
-               <documentation>
-                  The fully qualified class of your operation. Your operation must be a WTPOperation and must provide a no-arguments default constructor. If this attribute is not provided, the getDefaultOperation() returned by the dataModel will be used.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A name to display in the dialog for your action (if the operation is optional). You can use the standard &quot;%key&quot; for translatable text stored in plugin.properties.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  A description to display in the dialog for your action (if the operation is optional). You can use the standard &quot;%key&quot; for translatable text stored in plugin.properties.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="populatorClass" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The populatorClass knows how to provide a WTP Operation Data Model based on a given selection. The getDefaultOperation() method of the data model will be ignored if the operationClass is provided.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="alwaysExecute" type="boolean">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="overrideId" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="selectionEnablement">
-      <annotation>
-         <documentation>
-            The selectionEnablement element allows you to filter which kinds of selection your object is applicable to using Standard Eclipse Action Expresions.
-         </documentation>
-      </annotation>
-      <complexType>
-         <choice>
-            <element ref="objectClass"/>
-            <element ref="or"/>
-         </choice>
-      </complexType>
-   </element>
-
-   <element name="slaveOperation">
-      <annotation>
-         <documentation>
-            The slaveOperation element defines display information for operations which extend a declared master operation. If a pre|post operation of a master does not have a corresponding slaveOperation element, then the pre|post operation will be consider required, and not be displayed to the user.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="operationClass" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The fully qualified class of your operation. Your operation must be a WTPOperation and must provide a no-arguments default constructor. For slave operations, the data model of the master operation will be provided. Therefore, slaves cannot override the data model using a seperate populatorClass.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A name to display in the dialog for your action (if the operation is optional). You can use the standard &quot;%key&quot; for translatable text stored in plugin.properties.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  A description to display in the dialog for your action (if the operation is optional). You can use the standard &quot;%key&quot; for translatable text stored in plugin.properties.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="or">
-      <complexType>
-         <choice>
-            <element ref="objectClass"/>
-            <element ref="and"/>
-            <element ref="objectState"/>
-         </choice>
-      </complexType>
-   </element>
-
-   <element name="objectClass">
-      <complexType>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="adaptable" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="and">
-      <complexType>
-         <choice>
-            <element ref="objectClass"/>
-            <element ref="or"/>
-         </choice>
-      </complexType>
-   </element>
-
-   <element name="objectState">
-      <complexType>
-         <attribute name="value" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;!-- The examples in this section have been commented out because they reference only extension point IDs. These examples must be corrected before being included in the documentation. --&gt;
-&lt;!--
-The following example declares two Master Operations (&lt;code&gt;com.acme.ui.operation.MasterOperationA&lt;/code&gt; and &lt;code&gt;com.acme.ui.operation.MasterOperationB&lt;/code&gt;) which are attached to the Generic ID &lt;code&gt;com.acme.ui.WTPOptionalOperationTest&lt;/code&gt;. 
-The scenario has Master A which has as a pre-operation of Slave A and a post-operation of Slave C. Slave A is made optional by the &lt;code&gt;slaveOperation&lt;/code&gt; element, while Slave C will always be run (no &lt;code&gt;slaveOperation&lt;/code&gt; is given to run it seperately). Slave A further has an optional pre-operation (Slave B) that can be executed indepently of either Slave A or Master A.
---&gt;
-&lt;!--
-&lt;pre&gt;
-   &lt;extension
-         point=&quot;org.eclipse.wst.common.frameworks.ui.wtpuiAction&quot;&gt;
-      &lt;masterOperation
-            populatorClass=&quot;com.acme.ui.operation.AcmeOperationPopulator&quot;
-            name=&quot;%master_a_name&quot;
-            operationClass=&quot;com.acme.ui.operation.MasterOperationA&quot;
-            extendedGenericId=&quot;com.acme.ui.WTPOptionalOperationTest&quot;
-            description=&quot;%master_a_description&quot;&gt;
-      &lt;/masterOperation&gt; 
-   &lt;slaveOperation
-            name=&quot;Slave A&quot;
-            operationClass=&quot;com.acme.ui.operation.SlaveOperationA&quot;&gt;
-      &lt;/slaveOperation&gt; 
-      &lt;slaveOperation
-            name=&quot;Slave B&quot;
-            operationClass=&quot;com.acme.ui.operation.SlaveOperationB&quot;&gt;
-      &lt;/slaveOperation&gt;      
-      &lt;masterOperation
-            populatorClass=&quot;com.acme.ui.operation.AcmeOperationPopulator&quot;
-            name=&quot;EAR Project Action&quot;
-            operationClass=&quot;com.acme.ui.operation.MasterOperationB&quot;
-            extendedGenericId=&quot;com.acme.ui.WTPOptionalOperationTest&quot;&gt;
-            &lt;selectionEnablement&gt; 
-             &lt;objectState name=&quot;projectNature&quot; value=&quot;org.eclipse.jst.j2ee.EARNature&quot; /&gt;
-            &lt;/selectionEnablement&gt;
-      &lt;/masterOperation&gt;   
-   &lt;/extension&gt;
-&lt;/pre&gt;   
---&gt;
-&lt;!--
-For each of the slaveOperations referenced above, you must have a corresponding WTP Operation Extension declared similar to the following:
---&gt;
-&lt;!--
-&lt;pre&gt; 
-   &lt;extension
-         id=&quot;wtpuiAciton.Acme.Extensions&quot;
-         point=&quot;org.eclipse.wst.common.frameworks.ExtendableOperation&quot;&gt;
-      &lt;extendableOperation
-            class=&quot;com.acme.ui.operation.MasterOperationA&quot;
-            id=&quot;com.acme.ui.operation.MasterOperationA&quot;&gt;
-      &lt;/extendableOperation&gt;
-      &lt;extendableOperation
-            class=&quot;com.acme.ui.operation.SlaveOperationA&quot;
-            id=&quot;com.acme.ui.operation.SlaveOperationA&quot;&gt;
-      &lt;/extendableOperation&gt;
-   &lt;/extension&gt;
-   &lt;extension
-         point=&quot;org.eclipse.wst.common.frameworks.OperationExtension&quot;&gt;--&gt;
-      &lt;!-- Made optional by the above declaration --&gt;
-      &lt;!--&lt;operationExtension
-            preOperationClass=&quot;com.acme.ui.operation.SlaveOperationA&quot;
-            id=&quot;com.acme.ui.operation.MasterOperationA&quot;&gt;
-      &lt;/operationExtension&gt;--&gt;
-      &lt;!-- Made optional by the above declaration --&gt;
-      &lt;!--&lt;operationExtension
-            postOperationClass=&quot;com.acme.ui.operation.SlaveOperationB&quot;
-            id=&quot;com.acme.ui.operation.SlaveOperationA&quot;&gt;
-      &lt;/operationExtension&gt;--&gt;   
-      &lt;!-- Non-optional operation, will always run --&gt;
-      &lt;!--&lt;operationExtension
-            postOperationClass=&quot;com.acme.ui.operation.SlaveOperationC&quot;
-            id=&quot;com.acme.ui.operation.MasterOperationA&quot;&gt;
-      &lt;/operationExtension&gt;  
-   &lt;/extension&gt; 
-&lt;/pre&gt;
---&gt;
-&lt;!--
-In general, users extending existing actions only need to declare the following: 
---&gt;
-&lt;!--
-&lt;pre&gt;
- &lt;extension
-         point=&quot;org.eclipse.wst.common.frameworks.OperationExtension&quot;&gt;--&gt; 
- &lt;!-- The action referenced must be declared as extensible by the   org.eclipse.wst.common.frameworks.ExtendableOperation extension point --&gt;         
-      &lt;!--&lt;operationExtension
-            preOperationClass=&quot;...YOUR CLASS...&quot;            
-            id=&quot;...ID OF EXISTING OPERATION...&quot;&gt; 
-      &lt;/operationExtension&gt; 
- &lt;/extension&gt;      
-&lt;/pre&gt;      
---&gt;
-&lt;!--
-And if your operation is optional declare the slaveOperation:
---&gt;
-&lt;!--
-&lt;pre&gt; 
-   &lt;extension
-         point=&quot;org.eclipse.wst.common.frameworks.ui.wtpuiAction&quot;&gt; 
-   &lt;slaveOperation
-            name=&quot;..NAME OF YOUR OPERATION...&quot;
-            description=&quot;...DESCRIPTION OF YOUR ACTION...&quot;
-            operationClass=&quot;...YOUR CLASS...&quot;&gt;
-      &lt;/slaveOperation&gt; 
-   &lt;/extension&gt;      
-&lt;/pre&gt;
---&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) 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/AddablePageGroup.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/AddablePageGroup.java
deleted file mode 100644
index 53c3360..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/AddablePageGroup.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 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
- **************************************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.datamodel.ui;
-
-import org.eclipse.jface.wizard.IWizardPage;
-
-public interface AddablePageGroup extends  IDMPageGroup
-{
-  public void addPage( IWizardPage page );
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/DataModelSynchHelper.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/DataModelSynchHelper.java
deleted file mode 100644
index 06c30d7..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/DataModelSynchHelper.java
+++ /dev/null
@@ -1,562 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.datamodel.ui;
-
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.StructuredViewer;
-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.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.List;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelEvent;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelPropertyDescriptor;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelListener;
-import org.eclipse.wst.common.frameworks.internal.ui.TimedModifyListener;
-
-/**
- * This class is EXPERIMENTAL and is subject to substantial changes.
- */
-public class DataModelSynchHelper implements IDataModelListener {
-	protected static final boolean isLinux = System.getProperty("os.name").equals("Linux"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	protected IDataModel dataModel;
-	protected Map widgetToPropertyHash;
-	protected Map propertyToWidgetHash;
-	protected Map widgetToDepControls;
-
-	protected String currentProperty;
-	protected Widget currentWidget;
-	protected Widget currentWidgetFromEvent; // TODO M4 see if this should be set with for
-	// listeners
-	protected boolean ignoreModifyEvent = false;
-
-	private class ModifyTextListener implements ModifyListener {
-		public void modifyText(ModifyEvent e) {
-			if (ignoreModifyEvent)
-				return;
-			Text text = (Text) e.getSource();
-			if (currentWidget == text)
-				return;
-			String propertyName = (String) widgetToPropertyHash.get(text);
-			setProperty(propertyName, text.getText());
-		}
-	}
-
-	private ModifyTextListener modifyTextListener;
-	private TimedModifyListener timedModifyListener;
-
-	private class ComboListener implements SelectionListener, ModifyListener {
-
-		public void modifyText(ModifyEvent e) {
-			if (ignoreModifyEvent)
-				return;
-			Combo combo = (Combo) e.getSource();
-			if (currentWidget == combo)
-				return;
-
-			try {
-				currentWidgetFromEvent = combo;
-				String propertyName = (String) widgetToPropertyHash.get(combo);
-				DataModelPropertyDescriptor[] descriptors = dataModel.getValidPropertyDescriptors(propertyName);
-				String description = combo.getText();
-				// On a combo selection linux fires 2 events;
-				// the first clears the value which needs to be ignored when the type is not String
-				// the second sets the new value
-				if (isLinux && description.length() == 0 && descriptors.length != 0 && !(descriptors[0].getPropertyValue() instanceof String)) {
-					return;
-				}
-				for (int i = 0; i < descriptors.length; i++) {
-					if (description.equals(descriptors[i].getPropertyDescription())) {
-						setProperty(propertyName, descriptors[i].getPropertyValue());
-						return;
-					}
-				}
-				setProperty(propertyName, combo.getText());
-			} finally {
-				currentWidgetFromEvent = null;
-			}
-		}
-
-		public void widgetSelected(SelectionEvent e) {
-			Combo combo = (Combo) e.getSource();
-			if (currentWidget == combo)
-				return;
-			String propertyName = (String) widgetToPropertyHash.get(combo);
-			if (combo.getSelectionIndex() >= 0) {
-				DataModelPropertyDescriptor[] descriptors = dataModel.getValidPropertyDescriptors(propertyName);
-				String description = combo.getItem(combo.getSelectionIndex());
-				for (int i = 0; i < descriptors.length; i++) {
-					if (description.equals(descriptors[i].getPropertyDescription())) {
-						setProperty(propertyName, descriptors[i].getPropertyValue());
-						return;
-					}
-				}
-				setProperty(propertyName, combo.getItem(combo.getSelectionIndex()));
-			}
-		}
-
-		public void widgetDefaultSelected(SelectionEvent e) {
-		}
-	}
-
-	private ComboListener comboListener;
-
-	private class CheckboxSelectionListener implements SelectionListener {
-		public void widgetSelected(SelectionEvent e) {
-			Button button = (Button) e.getSource();
-			if (currentWidget == button)
-				return;
-			String propertyName = (String) widgetToPropertyHash.get(button);
-			setProperty(propertyName, new Boolean(button.getSelection()));
-		}
-
-		public void widgetDefaultSelected(SelectionEvent e) {
-		}
-	}
-
-	private CheckboxSelectionListener checkboxSelectionListener;
-
-	public DataModelSynchHelper(IDataModel model) {
-		this.dataModel = model;
-		dataModel.addListener(this);
-	}
-
-	private CheckBoxViewerListener checkBoxViewerStateListener;
-
-	private class CheckBoxViewerListener implements ICheckStateListener {
-		public void checkStateChanged(CheckStateChangedEvent event) {
-			StructuredViewer viewer = (StructuredViewer) event.getSource();
-			CheckboxTableViewer checkBoxTableViewer;
-			CheckboxTreeViewer checkBoxTreeViewer;
-			Object[] items = null;
-			if (viewer instanceof CheckboxTableViewer) {
-				checkBoxTableViewer = (CheckboxTableViewer) viewer;
-				items = checkBoxTableViewer.getCheckedElements();
-			} else if (viewer instanceof CheckboxTreeViewer) {
-				checkBoxTreeViewer = (CheckboxTreeViewer) viewer;
-				items = checkBoxTreeViewer.getCheckedElements();
-			}
-			String propertyName = (String) widgetToPropertyHash.get(viewer.getControl());
-			setPropertyItems(propertyName, items);
-		}
-	}
-
-	public void propertyChanged(DataModelEvent event) {
-		String propertyName = event.getPropertyName();
-		int flag = event.getFlag();
-		if (flag == DataModelEvent.ENABLE_CHG)
-			setEnablement(propertyName, event.isPropertyEnabled());
-		else
-			synchUIWithModel(propertyName, flag);
-	}
-
-	protected void setProperty(String propertyName, Object value) {
-		currentProperty = propertyName;
-		try {
-			dataModel.setProperty(propertyName, value);
-		} finally {
-			currentProperty = null;
-		}
-	}
-
-	protected void setPropertyItems(String propertyName, Object[] items) {
-		currentProperty = propertyName;
-		try {
-			dataModel.setProperty(propertyName, items);
-		} finally {
-			currentProperty = null;
-		}
-	}
-
-	/**
-	 * Sets the UI to have the property value defined in the model
-	 * 
-	 * @param propertyName
-	 * @link IDataModelListener for the flag values.
-	 */
-	public void synchUIWithModel(final String propertyName, final int flag) {
-		if (null != propertyToWidgetHash && propertyToWidgetHash.containsKey(propertyName)) {
-			Display.getDefault().syncExec(new Runnable() {
-				public void run() {
-					try {
-						currentWidget = (Widget) propertyToWidgetHash.get(propertyName);
-						if (currentWidget != null && currentWidget != currentWidgetFromEvent) {
-							try {
-								if (currentWidget instanceof Text)
-									setWidgetValue(propertyName, flag, (Text) currentWidget);
-								else if (currentWidget instanceof Combo) {
-									setWidgetValue(propertyName, flag, (Combo) currentWidget);
-								} else if (currentWidget instanceof Button)
-									setWidgetValue(propertyName, flag, (Button) currentWidget);
-								else if (currentWidget instanceof Label)
-									setWidgetValue(propertyName, flag, (Label) currentWidget);
-								else if (currentWidget instanceof List)
-									setWidgetValue(propertyName, flag, (List) currentWidget);
-								else if (currentWidget instanceof Table)
-									setWidgetValue(propertyName, flag, (Table) currentWidget);
-								else if (currentWidget instanceof Tree)
-									setWidgetValue(propertyName, flag, (Tree) currentWidget);
-							} finally {
-								ignoreModifyEvent = false;
-							}
-							setEnablement((Control) currentWidget, dataModel.isPropertyEnabled(propertyName));
-						}
-					} finally {
-						currentWidget = null;
-					}
-				}
-			});
-		}
-	}
-
-	/**
-	 * @param control
-	 * @param enabled
-	 */
-	protected void setEnablement(Control control, boolean enabled) {
-		if (control.isEnabled() != enabled)
-			control.setEnabled(enabled);
-		setDependentControlEnablement(control, enabled);
-	}
-
-	private void setEnablement(final String propertyName, final boolean enabled) {
-		if (propertyToWidgetHash != null) {
-			Display.getDefault().syncExec(new Runnable() {
-				public void run() {
-					Control control = (Control) propertyToWidgetHash.get(propertyName);
-					if (control != null) {
-						setEnablement(control, enabled);
-					}
-				}
-			});
-		}
-	}
-
-	/**
-	 * @param control
-	 * @param enabled
-	 */
-	private void setDependentControlEnablement(Control control, boolean enabled) {
-		if (widgetToDepControls != null) {
-			Control[] dependents = (Control[]) widgetToDepControls.get(control);
-			if (dependents != null) {
-				Control dep = null;
-				for (int i = 0; i < dependents.length; i++) {
-					dep = dependents[i];
-					if (dep.isEnabled() != enabled)
-						dep.setEnabled(enabled);
-				}
-			}
-		}
-	}
-
-	protected void setWidgetValue(String propertyName, int flag, Button button) {
-		if ((button.getStyle() & SWT.CHECK) == SWT.CHECK || (button.getStyle() & SWT.RADIO) == SWT.RADIO) {
-			boolean checked = dataModel.getBooleanProperty(propertyName);
-			if (button.getSelection() != checked) {
-				button.setSelection(checked);
-			}
-		}
-	}
-
-	protected void setWidgetValue(String propertyName, int flag, Combo combo) {
-		if (flag == DataModelEvent.VALID_VALUES_CHG || combo.getItemCount() == 0) {
-			// Display properties should only fire if the contents change.
-			DataModelPropertyDescriptor[] descriptors = dataModel.getValidPropertyDescriptors(propertyName);
-			String[] items = new String[descriptors.length];
-			for (int i = 0; i < descriptors.length; i++) {
-				items[i] = descriptors[i].getPropertyDescription();
-			}
-			combo.setItems(items);
-		}
-		String newText = dataModel.getPropertyDescriptor(propertyName).getPropertyDescription();
-		int selIndex = combo.getSelectionIndex();
-		if (selIndex < 0 || !newText.equals(combo.getItem(selIndex))) {
-			String[] items = combo.getItems();
-			for (int i = 0; i < items.length; i++) {
-				if (items[i].equals(newText)) {
-					combo.select(i);
-					return;
-				}
-			}
-		}
-		combo.setText(newText);
-	}
-
-	protected void setWidgetValue(String propertyName, int flag, Text text) {
-		String newText = dataModel.getStringProperty(propertyName);
-		if (!newText.equals(text.getText())) {
-			text.setText(newText);
-		}
-	}
-
-	protected void setWidgetValue(String propertyName, int flag, Table table) {
-		Object[] elements = (Object[]) dataModel.getProperty(propertyName);
-		if (elements == null || elements.length == 0) {
-			setTableItemsChecked(table.getItems(), false);
-			return;
-		}
-		java.util.List elementList = Arrays.asList(elements);
-		TableItem[] tableItems = table.getItems();
-		for (int i = 0; i < tableItems.length; i++) {
-			TableItem item = tableItems[i];
-			if (elementList.contains(item.getData()))
-				item.setChecked(true);
-			else
-				item.setChecked(false);
-		}
-	}
-
-	protected void setTableItemsChecked(TableItem[] tableItems, boolean b) {
-		for (int i = 0; i < tableItems.length; i++)
-			tableItems[i].setChecked(b);
-	}
-
-	protected void setWidgetValue(String propertyName, int flag, Tree tree) {
-		Object[] elements = (Object[]) dataModel.getProperty(propertyName);
-		if (elements == null)
-			return;
-		java.util.List elementList = Arrays.asList(elements);
-		TreeItem[] treeItems = tree.getItems();
-		if (elementList.size() == 0) {
-			setTreeItemsGrey(treeItems, false);
-			return;
-		}
-		if (treeItems.length > 0)
-			setTreeItemChecked(treeItems, elementList);
-	}
-
-	public void setTreeItemsGrey(TreeItem[] treeItems, boolean b) {
-		for (int i = 0; i < treeItems.length; i++) {
-			TreeItem item = treeItems[i];
-			item.setGrayed(b);
-			setTreeItemsGrey(treeItems[i].getItems(), b);
-		}
-	}
-
-	protected void setTreeItemChecked(TreeItem[] treeItems, java.util.List items) {
-		for (int i = 0; i < treeItems.length; i++) {
-			if (items.contains(treeItems[i].getData()))
-				treeItems[i].setChecked(true);
-			else
-				treeItems[i].setGrayed(true);
-			TreeItem[] childernItems = treeItems[i].getItems();
-			if (childernItems.length > 0) {
-				treeItems[i].setExpanded(true);
-				setTreeItemChecked(childernItems, items);
-			}
-		}
-	}
-
-	protected void setWidgetValue(String propertyName, int flag, Label label) {
-		String newText = dataModel.getStringProperty(propertyName);
-		if (!newText.equals(label.getText())) {
-			label.setText(newText);
-		}
-	}
-
-	protected void setWidgetValue(String propertyName, int flag, List list) {
-		Object newContents = dataModel.getProperty(propertyName);
-		if (newContents == null) {
-			list.setItems(new String[0]);
-			return;
-		}
-		if (newContents instanceof java.util.List) {
-			java.util.List modelContents = (java.util.List) newContents;
-			String[] items = new String[modelContents.size()];
-			for (int i = 0; i < modelContents.size(); i++) {
-				items[i] = modelContents.get(i).toString();
-			}
-			list.setItems(items);
-		} else if (newContents instanceof String[]) {
-			list.setItems((String[]) newContents);
-		}
-	}
-
-	public void synchAllUIWithModel() {
-		if (null != propertyToWidgetHash) {
-			Collection keys = propertyToWidgetHash.keySet();
-			if (!keys.isEmpty()) {
-				Iterator propertyNames = keys.iterator();
-				String propertyName = null;
-				while (propertyNames.hasNext()) {
-					propertyName = (String) propertyNames.next();
-					synchUIWithModel(propertyName, DataModelEvent.VALUE_CHG);
-				}
-			}
-		}
-	}
-
-	protected void synchComposite(Widget widget, String propertyName, Control[] depControls) {
-		if (null == widgetToPropertyHash)
-			widgetToPropertyHash = new HashMap();
-		if (propertyToWidgetHash == null)
-			propertyToWidgetHash = new HashMap();
-		widgetToPropertyHash.put(widget, propertyName);
-		propertyToWidgetHash.put(propertyName, widget);
-		if (depControls != null) {
-			if (widgetToDepControls == null)
-				widgetToDepControls = new HashMap();
-			widgetToDepControls.put(widget, depControls);
-		}
-		synchUIWithModel(propertyName, DataModelEvent.VALUE_CHG);
-	}
-
-	public void synchText(Text text, String propertyName, Control[] dependentControls) {
-		synchText(text, propertyName, false, dependentControls);
-	}
-
-	public void synchText(Text text, String propertyName, boolean isTimeModified, Control[] dependentControls) {
-		synchComposite(text, propertyName, dependentControls);
-		if (isTimeModified)
-			text.addModifyListener(getTimedListener());
-		else
-			text.addModifyListener(getModifyTextListener());
-	}
-
-	public void synchLabel(Label label, String propertyName, Control[] dependentControls) {
-		synchComposite(label, propertyName, dependentControls);
-	}
-
-	/**
-	 * Use this to synch the contents of the <code>list</code> to the List elements returned from
-	 * the <code>propertyName</code>.
-	 */
-	public void synchList(List list, String propertyName, Control[] dependentControls) {
-		synchComposite(list, propertyName, dependentControls);
-	}
-
-	/**
-	 * Use this to synch the value of the specified Combo with the specified propertyName. The
-	 * possible values displayed to the user are determined by return of
-	 * IDataModel.getValidPropertyDescriptors(String).
-	 * 
-	 * @param combo
-	 * @param propertyName
-	 * @param dependentControls
-	 */
-	public void synchCombo(Combo combo, String propertyName, Control[] dependentControls) {
-		synchComposite(combo, propertyName, dependentControls);
-		if (null == comboListener) {
-			comboListener = new ComboListener();
-		}
-		combo.addSelectionListener(comboListener);
-		combo.addModifyListener(comboListener);
-	}
-
-	/**
-	 * Use this to sync the state of the specified checkbox with the value of the specified
-	 * propertyName. The specified propertyName must contain a java.lang.Boolean typed Object.
-	 * 
-	 * @param checkbox
-	 * @param propertyName
-	 * @param dependentControls
-	 */
-	public void synchCheckbox(Button checkbox, String propertyName, Control[] dependentControls) {
-		synchComposite(checkbox, propertyName, dependentControls);
-		if (null == checkboxSelectionListener) {
-			checkboxSelectionListener = new CheckboxSelectionListener();
-		}
-		checkbox.addSelectionListener(checkboxSelectionListener);
-	}
-
-	public void synchCheckBoxTableViewer(CheckboxTableViewer tableViewer, String propertyName, Control[] dependentControls) {
-		synchComposite(tableViewer.getControl(), propertyName, dependentControls);
-		if (null == checkBoxViewerStateListener) {
-			checkBoxViewerStateListener = new CheckBoxViewerListener();
-		}
-		tableViewer.addCheckStateListener(checkBoxViewerStateListener);
-	}
-
-	public void synchCheckBoxTreeViewer(CheckboxTreeViewer treeViewer, String propertyName, Control[] dependentControls) {
-		treeViewer.expandAll();
-		synchComposite(treeViewer.getControl(), propertyName, dependentControls);
-		if (null == checkBoxViewerStateListener) {
-			checkBoxViewerStateListener = new CheckBoxViewerListener();
-		}
-		treeViewer.addCheckStateListener(checkBoxViewerStateListener);
-	}
-
-	public void synchRadio(Button radio, String propertyName, Control[] dependentControls) {
-		// Uses checkbox syncher
-		synchCheckbox(radio, propertyName, dependentControls);
-	}
-
-	private TimedModifyListener getTimedListener() {
-		if (timedModifyListener == null)
-			timedModifyListener = new TimedModifyListener(new ActionListener() {
-				public void actionPerformed(ActionEvent e) {
-					Widget w = (Widget) e.getSource();
-					if (currentWidget == w || w.isDisposed())
-						return;
-					String propertyName = (String) widgetToPropertyHash.get(w);
-					setTextProperty(propertyName, (Text) w);
-				}
-			}) {
-				public void modifyText(ModifyEvent e) {
-					if (ignoreModifyEvent)
-						return;
-					super.modifyText(e);
-				}
-			};
-		return timedModifyListener;
-	}
-
-	protected void setTextProperty(String propertyName, Text text) {
-		setProperty(propertyName, text.getText());
-	}
-
-	private ModifyTextListener getModifyTextListener() {
-		if (null == modifyTextListener)
-			modifyTextListener = new ModifyTextListener();
-		return modifyTextListener;
-	}
-
-	public IDataModel getDataModel() {
-		return dataModel;
-	}
-
-	public void dispose() {
-		dataModel.removeListener(this);
-		checkboxSelectionListener = null;
-		currentWidget = null;
-		modifyTextListener = null;
-		propertyToWidgetHash = null;
-		timedModifyListener = null;
-		widgetToDepControls = null;
-		widgetToPropertyHash = null;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/DataModelWizard.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/DataModelWizard.java
deleted file mode 100644
index c131eec..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/DataModelWizard.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.datamodel.ui;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.wst.common.environment.IEnvironment;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
-import org.eclipse.wst.common.frameworks.internal.DataModelManager;
-import org.eclipse.wst.common.frameworks.internal.OperationManager;
-import org.eclipse.wst.common.frameworks.internal.eclipse.ui.EclipseEnvironment;
-import org.eclipse.wst.common.frameworks.internal.ui.ErrorDialog;
-import org.eclipse.wst.common.frameworks.internal.ui.PageGroupManager;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPCommonUIResourceHandler;
-
-
-/**
- * This class is EXPERIMENTAL and is subject to substantial changes.
- */
-public abstract class DataModelWizard extends Wizard implements IDMPageHandler {
-	private DataModelManager dataModelManager;
-	private OperationManager operationManager;
-	private PageGroupManager pageGroupManager;
-	private IDataModel dataModel;
-	private AddablePageGroup rootPageGroup;
-	private IDataModelOperation rootOperation;
-
-	// private IWizardPage firstpage;
-
-	public DataModelWizard(IDataModel dataModel) {
-		this.dataModel = dataModel;
-	}
-
-	public DataModelWizard() {
-	}
-
-	protected abstract IDataModelProvider getDefaultProvider();
-
-	/**
-	 * @return the wizard ID that clients should extend to add to this wizard
-	 */
-	public final String getWizardID() {
-		return getDataModel().getID();
-	}
-
-	/**
-	 * 
-	 * @return returns the root operation for this wizard.
-	 */
-	protected IDataModelOperation getRootOperation() {
-		return getDataModel().getDefaultOperation();
-	}
-
-	/**
-	 * This is finalized to handle the adding of extended pages. Clients should override
-	 * doAddPages() to add their pages.
-	 */
-	public final void addPages() {
-		init();
-		doAddPages();
-	}
-
-	/**
-	 * Subclasses should override this method to add pages.
-	 */
-	protected void doAddPages() {
-	}
-
-	// TODO make this final
-	public IWizardPage getStartingPage() {
-		pageGroupManager.reset();
-		return getNextPage(null);
-	}
-
-	/**
-	 * Subclasses wishing to control the page ordering should do so by overriding
-	 * getNextPage(String, String) and getPreviousPage(String, String)
-	 * 
-	 * @link #getNextPage(String, String)
-	 * @link #getPreviousPage(String, String)
-	 */
-	// TODO make this final
-	public IWizardPage getNextPage(IWizardPage page) {
-
-		IWizardPage currentPage = pageGroupManager.getCurrentPage();
-
-		pageGroupManager.moveForwardOnePage();
-
-		IWizardPage nextPage = pageGroupManager.getCurrentPage();
-
-		// If an error occured then the current page and the next page will be the same.
-		if (currentPage != nextPage && nextPage != null) {
-			nextPage.setWizard(this);
-			nextPage.setPreviousPage(currentPage);
-		}
-
-		return currentPage == nextPage ? null : nextPage;
-	}
-
-	public String getNextPage(String currentPageName, String expectedNextPageName) {
-		return expectedNextPageName;
-	}
-
-	/**
-	 * Subclasses wishing to control the page ordering should do so by overriding
-	 * getNextPage(String, String) and getPreviousPage(String, String)
-	 * 
-	 * @link #getNextPage(String, String)
-	 * @link #getPreviousPage(String, String)
-	 */
-	// TODO make this final
-	public IWizardPage getPreviousPage(IWizardPage page) {
-		return page != null ? page.getPreviousPage() : null;
-	}
-
-	public String getPreviousPage(String currentPageName, String expectedPreviousPageName) {
-		return expectedPreviousPageName;
-	}
-
-	public boolean canFinish() {
-		if (!super.canFinish() || !getDataModel().isValid()) {
-			return false;
-		}
-
-		return true;
-	}
-
-	public PageGroupManager getPageGroupManager() {
-		return pageGroupManager;
-	}
-
-	// TODO need to implement this. Perhaps in the PageGroupManager
-	//
-	protected void resetAfterFinishError() {
-		// IWizardPage[] pages = getPages();
-		// for (int i = 0; i < pages.length; i++) {
-		// DataModelWizardPage wtpPage = (DataModelWizardPage) pages[i];
-		// wtpPage.validatePage(true);
-		// }
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.IWizard#performFinish()
-	 */
-	public final boolean performFinish() {
-		boolean wasSuccessful = false;
-
-		try {
-			if (prePerformFinish()) {
-				storeDefaultSettings();
-
-				//wasSuccessful = pageGroupManager.runAllRemainingOperations();
-				wasSuccessful = runOperations().getSeverity() != IStatus.ERROR;
-				
-				postPerformFinish();
-			}
-		} catch (Throwable exc) {
-			wasSuccessful = false;
-			// TODO log error
-		}
-
-		return wasSuccessful;
-	}
-	
-	private IStatus runOperations() {
-		final IStatus[] status = new IStatus[1];
-		IRunnableWithProgress runnable = new IRunnableWithProgress() {
-			public void run(IProgressMonitor monitor) {
-				try {
-					status[0] =rootOperation.execute(monitor, null);
-				} catch (ExecutionException e) {
-					// TODO Auto-generated catch block
-					e.printStackTrace();
-				}
-			}
-		};
-		try {
-			getContainer().run(runForked(), isCancelable(), runnable);
-		} catch (Throwable exc) {
-			Logger.getLogger().logError(exc);
-			ErrorDialog.openError(getShell(), WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WTPWizard_UI_0, new Object[]{getWindowTitle()}), WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WTPWizard_UI_1, new Object[]{getWindowTitle()}), exc, 0, false); //$NON-NLS-1$ //$NON-NLS-2$
-			status[0] = new Status(IStatus.ERROR, "id", 0, exc.getMessage(), exc); //$NON-NLS-1$
-		}
-
-		return status[0];
-	}
-
-	public boolean performCancel() {
-		pageGroupManager.undoAllCurrentOperations();
-
-		return true;
-	}
-
-	/**
-	 * Subclass can override to perform any tasks prior to running the operation. Return true to
-	 * have the operation run and false to stop the execution of the operation.
-	 * 
-	 * @return
-	 */
-	protected boolean prePerformFinish() {
-		return true;
-	}
-
-	/**
-	 * Subclasses should override to perform any actions necessary after performing Finish.
-	 */
-	protected void postPerformFinish() throws InvocationTargetException {
-	}
-
-	protected void storeDefaultSettings() {
-		IWizardPage[] pages = getPages();
-		for (int i = 0; i < pages.length; i++)
-			storeDefaultSettings(pages[i], i);
-	}
-
-	/**
-	 * Subclasses may override if they need to do something special when storing the default
-	 * settings for a particular page.
-	 * 
-	 * @param page
-	 * @param pageIndex
-	 */
-	protected void storeDefaultSettings(IWizardPage page, int pageIndex) {
-		if (page instanceof DataModelWizardPage)
-			((DataModelWizardPage) page).storeDefaultSettings();
-	}
-
-	/**
-	 * Subclasses should override if the running operation is allowed to be cancelled. The default
-	 * is false.
-	 * 
-	 * @return
-	 */
-	protected boolean isCancelable() {
-		return false;
-	}
-
-	/**
-	 * Subclasses should override to return false if the running operation cannot be run forked.
-	 * 
-	 * @return
-	 */
-	protected boolean runForked() {
-		return false;
-	}
-
-	public void setDataModel(IDataModel model) {
-		this.dataModel = model;
-	}
-
-	/**
-	 * @return Returns the model.
-	 */
-	public IDataModel getDataModel() {
-		if (null == dataModel) {
-			dataModel = DataModelFactory.createDataModel(getDefaultProvider());
-		}
-
-		return dataModel;
-	}
-
-	public void dispose() {
-		super.dispose();
-		if (null != dataModel) {
-			dataModel.dispose();
-		}
-	}
-
-	/**
-	 * The default is to return a SimplePageGroup. Subclasses may want to overrided this method to
-	 * return a different root page group for the wizard.
-	 * 
-	 * @return
-	 */
-	protected AddablePageGroup createRootPageGroup() {
-		String id = getWizardID();
-		// For the root page group the wizard id and the group id are the same.
-		SimplePageGroup pageGroup = new SimplePageGroup(id, id);
-		pageGroup.setPageHandler(this);
-		return pageGroup;
-	}
-
-	/**
-	 * Creates the default environment for this wizard.
-	 * 
-	 * @return
-	 */
-	protected IEnvironment createEnvironment() {
-		return new EclipseEnvironment();
-	}
-
-	public void addPage(IWizardPage page) {
-		rootPageGroup.addPage(page);
-	}
-
-	private void init() {
-		dataModelManager = new DataModelManager(getDataModel());
-		rootOperation = getRootOperation(); 
-		operationManager = new WizardOperationManager(dataModelManager, rootOperation);
-		rootPageGroup = createRootPageGroup();
-		pageGroupManager = new PageGroupManager(operationManager, dataModelManager, rootPageGroup);
-	}
-
-	private class WizardOperationManager extends OperationManager {
-		public WizardOperationManager(DataModelManager dataModelManager, IDataModelOperation rootOperation) {
-			super(dataModelManager, rootOperation, createEnvironment());
-		}
-
-		public IStatus runOperations() {
-			final IStatus[] status = new IStatus[1];
-			IRunnableWithProgress runnable = new IRunnableWithProgress() {
-				public void run(IProgressMonitor monitor) {
-					setProgressMonitor(monitor);
-					status[0] = WizardOperationManager.super.runOperations();
-				}
-			};
-			try {
-				getContainer().run(runForked(), isCancelable(), runnable);
-			} catch (Throwable exc) {
-				Logger.getLogger().logError(exc);
-				ErrorDialog.openError(getShell(), WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WTPWizard_UI_0, new Object[]{getWindowTitle()}), WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WTPWizard_UI_1, new Object[]{getWindowTitle()}), exc, 0, false); //$NON-NLS-1$ //$NON-NLS-2$
-				status[0] = new Status(IStatus.ERROR, "id", 0, exc.getMessage(), exc); //$NON-NLS-1$
-			}
-
-			return status[0];
-		}
-
-		public void undoLastRun() {
-			IRunnableWithProgress runnable = new IRunnableWithProgress() {
-				public void run(IProgressMonitor monitor) {
-					setProgressMonitor(monitor);
-					WizardOperationManager.super.undoLastRun();
-				}
-			};
-			try {
-				getContainer().run(runForked(), isCancelable(), runnable);
-			} catch (Throwable exc) {
-				Logger.getLogger().logError(exc);
-				ErrorDialog.openError(getShell(), WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WTPWizard_UI_0, new Object[]{getWindowTitle()}), WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WTPWizard_UI_1, new Object[]{getWindowTitle()}), exc, 0, false); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-	}
-
-	public boolean needsPreviousAndNextButtons() {
-		return super.needsPreviousAndNextButtons() || getPageGroupManager().hasMultiplePages();
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/DataModelWizardFactory.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/DataModelWizardFactory.java
deleted file mode 100644
index eec76f6..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/DataModelWizardFactory.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.datamodel.ui;
-
-import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.internal.operation.extensionui.DataModelWizardExtensionReader;
-
-public class DataModelWizardFactory {
-
-	private static DataModelWizardExtensionReader reader;
-
-	/**
-	 * Looks up the appropriate DataModelWizard by the specified id and
-	 * constructs a new DataModelWizard using a new instance of the IDataModel
-	 * looked up with the same id. If the DataModelWizard is not found then a
-	 * RuntimeException is thrown.
-	 * 
-	 * @param id
-	 *            the id of the DataModelWizard
-	 * @return a new DataModelWizard
-	 */
-	public static DataModelWizard createWizard(String id) {
-		return createWizard(DataModelFactory.createDataModel(id));
-	}
-
-	/**
-	 * Looks up the appropriate DataModelWizard using the id retured from
-	 * <code>dataModel.getID()</code>.
-	 * 
-	 * @param dataModel
-	 * @return a new DataModelWizard
-	 */
-	public static DataModelWizard createWizard(IDataModel dataModel) {
-		return loadWizard(dataModel);
-	}
-
-	private static DataModelWizard loadWizard(IDataModel dataModel) {
-		if (null == reader) {
-			reader = new DataModelWizardExtensionReader();
-		}
-		return reader.getWizard(dataModel);
-	}
-
-	/**
-	 * Looks up the appropriate DataModelWizard using the name of the specified
-	 * class as the id. This method is equavalent to
-	 * <code>createWizard(classID.getName())</code>.
-	 * 
-	 * @param classID
-	 *            the class whose name is the id of the DataModelWizard
-	 * @return a new DataModelWizard
-	 */
-	public static DataModelWizard createWizard(Class dataModelProviderID) {
-		return createWizard(dataModelProviderID.getName());
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/DataModelWizardPage.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/DataModelWizardPage.java
deleted file mode 100644
index 87b3943..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/DataModelWizardPage.java
+++ /dev/null
@@ -1,430 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-
-package org.eclipse.wst.common.frameworks.internal.datamodel.ui;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.wizard.IWizard;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelEvent;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelListener;
-import org.eclipse.wst.common.frameworks.internal.ui.ValidationStatus;
-
-/**
- * This class is EXPERIMENTAL and is subject to substantial changes.
- */
-public abstract class DataModelWizardPage extends WizardPage implements Listener, IDataModelListener {
-	protected static final int NEXT = 1;
-	protected static final int PREVIOUS = 2;
-	protected static final int COMPOSITE_BORDER = SWT.NULL;
-	private ValidationStatus status = new ValidationStatus();
-	private boolean isValidating = false;
-	protected boolean isFirstTimeToPage = true;
-	protected IDataModel model;
-	private Map validationMap;
-	private String[] validationPropertyNames;
-	protected DataModelSynchHelper synchHelper;
-	private String infopopID;
-	private DataModelWizard wizard;
-	private IWizardPage previousPage;
-
-	/**
-	 * J2EEWizardPage constructor comment.
-	 * 
-	 * @param pageName
-	 *            java.lang.String
-	 */
-	protected DataModelWizardPage(IDataModel model, String pageName) {
-		super(pageName);
-		this.model = model;
-		model.addListener(this);
-		synchHelper = initializeSynchHelper(model);
-	}
-	
-	/**
-	 * @return
-	 */
-	public DataModelSynchHelper initializeSynchHelper(IDataModel dm) {
-		return new DataModelSynchHelper(dm);
-	}
-
-	/**
-	 * J2EEWizardPage constructor comment.
-	 * 
-	 * @param pageName
-	 *            java.lang.String
-	 * @param title
-	 *            java.lang.String
-	 * @param titleImage
-	 *            org.eclipse.jface.resource.ImageDescriptor
-	 */
-	protected DataModelWizardPage(IDataModel model, String pageName, String title, org.eclipse.jface.resource.ImageDescriptor titleImage) {
-		super(pageName, title, titleImage);
-		this.model = model;
-		model.addListener(this);
-		synchHelper = initializeSynchHelper(model);
-	}
-
-	/**
-	 * Creates the top level control for this dialog page under the given parent composite. This
-	 * method has been abstract and it uses the template pattern to get the correct items setup in
-	 * the correct order. See the set of methods below that are called in this method.
-	 * <p>
-	 * Implementors are responsible for ensuring that the created control can be accessed via
-	 * <code>getControl</code>
-	 * </p>
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 */
-	public final void createControl(org.eclipse.swt.widgets.Composite parent) {
-		Composite top = createTopLevelComposite(parent);
-		setControl(top);
-		setupInfopop(top);
-		setDefaults();
-		addListeners();
-		initializeValidationProperties();
-	}
-
-	private void initializeValidationProperties() {
-		validationPropertyNames = getValidationPropertyNames();
-		if (validationPropertyNames == null || validationPropertyNames.length == 0)
-			validationMap = Collections.EMPTY_MAP;
-		else {
-			validationMap = new HashMap(validationPropertyNames.length);
-			for (int i = 0; i < validationPropertyNames.length; i++)
-				validationMap.put(validationPropertyNames[i], new Integer(i));
-		}
-	}
-
-	public boolean canFlipToNextPage() {
-		//TODO why is that last getNextPage() call here???
-		return isPageComplete() && ((null != wizard && wizard.getPageGroupManager().hasNextPage() || null != getNextPage()));
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IWizardPage.
-	 */
-	public void setWizard(IWizard newWizard) {
-		super.setWizard(newWizard);
-		if(newWizard instanceof DataModelWizard){
-			wizard = (DataModelWizard) newWizard;
-		}
-	}
-
-	public IWizardPage getPreviousPage() {
-		return previousPage;
-	}
-
-	public void setPreviousPage(IWizardPage page) {
-		super.setPreviousPage(page);
-		previousPage = page;
-	}
-
-	/**
-	 * Subclass should return the model property names that need to be validated on this page in the
-	 * order that they should present their messages.
-	 * 
-	 * @return
-	 */
-	protected abstract String[] getValidationPropertyNames();
-
-	/**
-	 * Return the top level Composite for this page.
-	 */
-	protected abstract Composite createTopLevelComposite(Composite parent);
-
-	/**
-	 * Set up info pop hooks if set.
-	 */
-	protected void setupInfopop(Control parent) {
-		if (getInfopopID() != null)
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, getInfopopID());
-	}
-
-	/**
-	 * Setup the default values for this page. Subclasses should override to provide appropriate
-	 * defaults.
-	 */
-	protected void setDefaults() {
-		restoreDefaultSettings();
-	}
-
-	/**
-	 * Subclasses should implement this method if they have default settings that have been stored
-	 * and need to be restored.
-	 * 
-	 * @see storeDefaultSettings()
-	 */
-	protected void restoreDefaultSettings() {
-	}
-
-	/**
-	 * Add Listeners to controls at this point to avoid unnecessary events. Subclasses should
-	 * override to add listeners to its controls.
-	 */
-	protected void addListeners() {
-	}
-
-	/**
-	 * The page is being made current and visible. Subclasses may extend.
-	 */
-	protected void enter() {
-		try {
-			// Check to see if we are moving back one page.
-			if (null != wizard && wizard.getPreviousPage(wizard.getPageGroupManager().getCurrentPage()) == this) {
-				wizard.getPageGroupManager().moveBackOnePage();
-			}
-
-			validatePage(showValidationErrorsOnEnter());
-		} finally {
-			isFirstTimeToPage = false;
-		}
-	}
-
-	/**
-	 * The default behavior is to return true unless it is the first time entering this page in
-	 * which case we check to see if there is a previous page and return true if there is not.
-	 * Subclasses should override if they do not want this default behavior.
-	 */
-	protected boolean showValidationErrorsOnEnter() {
-		return !isFirstTimeToPage();
-	}
-
-	/**
-	 * The default behavior is to return true unless it is the first time entering this page in
-	 * which case we check to see if there is a previous page and return true if there is not.
-	 * Subclasses should override if they do not want this default behavior.
-	 * 
-	 * @deprecated - use showValidatoinErrorsOnEnter instead
-	 */
-	protected boolean shouldValidateOnEnter() {
-		return showValidationErrorsOnEnter();
-	}
-
-	/**
-	 * Exiting the page. Subclasses may extend.
-	 */
-	protected void exit() {
-	}
-
-	protected boolean getStatus(Integer key) {
-		return status.hasError(key);
-	}
-
-	/**
-	 * Sent when an event that the receiver has registered for occurs. If a subclass overrides this
-	 * method, it must call super.
-	 * 
-	 * @param event
-	 *            the event which occurred
-	 */
-	public void handleEvent(org.eclipse.swt.widgets.Event event) {
-	}
-
-	/**
-	 * Set the error message for this page based on the last error in the ValidationStatus.
-	 */
-	protected void setErrorMessage() {
-		String error = status.getLastErrMsg();
-		if (error == null) {
-			if (getErrorMessage() != null)
-				setErrorMessage((String) null);
-			String warning = status.getLastWarningMsg();
-			if (warning == null) {
-				if (getMessage() != null && getMessageType() == IMessageProvider.WARNING)
-					setMessage(null, IMessageProvider.WARNING);
-			} else if (!warning.equals(getMessage()))
-				setMessage(warning, IMessageProvider.WARNING);
-		} else if (!error.equals(getErrorMessage()))
-			setErrorMessage(error);
-	}
-
-	protected void setErrorStatus(Integer key, String errorMessage) {
-		status.setErrorStatus(key, errorMessage);
-	}
-
-	protected void setWarningStatus(Integer key, String warningMessage) {
-		status.setWarningStatus(key, warningMessage);
-	}
-
-	protected void setOKStatus(Integer key) {
-		status.setOKStatus(key);
-	}
-
-	/**
-	 * The <code>DialogPage</code> implementation of this <code>IDialogPage</code> method sets
-	 * the control to the given visibility state. Subclasses may extend.
-	 */
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-		if (visible) {
-			enter();
-		} else
-			exit();
-	}
-
-	/**
-	 * This should be called by the Wizard just prior to running the performFinish operation.
-	 * Subclasses should override to store their default settings.
-	 */
-	public void storeDefaultSettings() {
-	}
-
-	/**
-	 * The page is now being validated. At this time, each control is validated and then the
-	 * controls are updated based on the results in the ValidationStatus which was updated during
-	 * <code>validateControls()</code>. Finally, it will display the last error message and it
-	 * will set the page complete. Subclasses will not typically override this method.
-	 */
-	protected void validatePage() {
-		validatePage(true);
-	}
-
-	protected void validatePage(boolean showMessage) {
-		if (!isValidating) {
-			isValidating = true;
-			try {
-				validateControlsBase();
-				updateControls();
-				if (showMessage)
-					setErrorMessage();
-				setPageComplete(status.getLastErrMsg() == null);
-			} finally {
-				isValidating = false;
-			}
-		}
-	}
-
-	/**
-	 * Validate individual controls. Use validation keys to keep track of errors.
-	 * 
-	 * @see setOKStatus(Integer) and setErrorMessage(Integer, String)
-	 */
-	protected final String validateControlsBase() {
-		if (!validationMap.isEmpty()) {
-			String propName;
-			for (int i = 0; i < validationPropertyNames.length; i++) {
-				propName = validationPropertyNames[i];
-				Integer valKey = (Integer) validationMap.get(propName);
-				if (valKey != null)
-					validateProperty(propName, valKey);
-				if (!getStatus(valKey))
-					return propName;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param propertyName
-	 * @param validationkey
-	 */
-	private void validateProperty(String propertyName, Integer validationKey) {
-		setOKStatus(validationKey);
-		IStatus status1 = model.validateProperty(propertyName);
-		if (!status1.isOK()) {
-			String message = status1.isMultiStatus() ? status1.getChildren()[0].getMessage() : status1.getMessage();
-			switch (status1.getSeverity()) {
-				case IStatus.ERROR :
-					setErrorStatus(validationKey, message);
-					break;
-				case IStatus.WARNING :
-					setWarningStatus(validationKey, message);
-					break;
-			}
-		}
-	}
-
-	/**
-	 * Update the enablement of controls after validation. Sublcasses should check the status of
-	 * validation keys to determine enablement.
-	 */
-	protected void updateControls() {
-	}
-
-	/**
-	 * Gets the isFirstTimeToPage.
-	 * 
-	 * @return Returns a boolean
-	 */
-	protected boolean isFirstTimeToPage() {
-		return isFirstTimeToPage;
-	}
-
-	// protected void setJavaStatusMessage(IStatus javaStatus, Integer statusKey, String message) {
-	// if (javaStatus.getSeverity() == IStatus.WARNING)
-	// setWarningStatus(statusKey, message);
-	// else
-	// setErrorStatus(statusKey, message);
-	// }
-
-	/**
-	 * @param b
-	 */
-	public void setFirstTimeToPage(boolean b) {
-		isFirstTimeToPage = b;
-	}
-
-	/*
-	 * If a property changes that we want to validate, force validation on this page.
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperationDataModelListener#propertyChanged(java.lang.String,
-	 *      java.lang.Object, java.lang.Object)
-	 */
-	public void propertyChanged(DataModelEvent event) {
-		String propertyName = event.getPropertyName();
-		if (validationPropertyNames != null && (event.getFlag() == DataModelEvent.VALUE_CHG || (!isPageComplete() && event.getFlag() == DataModelEvent.VALID_VALUES_CHG))) {
-			for (int i = 0; i < validationPropertyNames.length; i++) {
-				if (validationPropertyNames[i].equals(propertyName)) {
-					validatePage();
-					break;
-				}
-			}
-		}
-	}
-
-	/**
-	 * @return Returns the model.
-	 */
-	protected IDataModel getDataModel() {
-		return model;
-	}
-
-	public void dispose() {
-		super.dispose();
-		if (synchHelper != null) {
-			synchHelper.dispose();
-			synchHelper = null;
-		}
-	}
-
-	protected String getInfopopID() {
-		return infopopID;
-	}
-
-	public void setInfopopID(String infopopID) {
-		this.infopopID = infopopID;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/IDMPageGroup.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/IDMPageGroup.java
deleted file mode 100644
index d69edce..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/IDMPageGroup.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 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
- **************************************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.datamodel.ui;
-
-import java.util.List;
-import java.util.Set;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-
-public interface IDMPageGroup 
-{
-  public String getWizardID();
-  
-  public String getPageGroupID();
-  
-  public String getPageGroupInsertionID();
-  
-  public boolean getAllowsExtendedPages();
-  
-  public String getRequiredDataOperationToRun();
-  
-  public Set getDataModelIDs();
-  
-  public List getPages(IDataModel dataModel);
-  
-  public IDMPageHandler getPageHandler( IDataModel dataModel );
-  
-  public IDMPageGroupHandler getPageGroupHandler( IDataModel dataModel );
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/IDMPageGroupHandler.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/IDMPageGroupHandler.java
deleted file mode 100644
index c170e5c..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/IDMPageGroupHandler.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-
-package org.eclipse.wst.common.frameworks.internal.datamodel.ui;
-
-/**
- * 
- * The wizard framework allows page groups to be inserted after other page group.
- * If more than one page group inserts itself after a particular page group it may
- * not be deterministic which page group should follow each other.  This class
- * allows a particular page group to determine the order in which subsequent page
- * groups should be ordered.
- * 
- * For example: A page group T has three page groups X, Y, and Z that have registered
- *              via the wizardPageGroup extension point to follow it.
- *              The wizard framework will call getNextGroup with:
- *              
- *                 T.getNextGroup( null, { "X", "Y", "Z" } )
- *                 
- *              This method should return either "X", "Y", "Z", or null if no page group
- *              should follow.  If "Y" was returned then a subequent call
- *              will be made by the framework with:
- *              
- *                 T.getNextGroup( "Y", { "X", "Y", "Z" } )
- *                 
- *              Again this method should return either "X", "Y", "Z", or null if no page
- *              group should follow this page group "Y".
- *              
- * Note: any page group can have a page group handler associated with it so this method
- *       call is recursive in nature.  For example: the page group Y might have page
- *       groups Y1, Y2, and Y3 following it.  This would result in the following calls:
- *       
- *                 T.getNextGroup( null, { "X", "Y", "Z" } )  // "Y" is selected using Ts handler.
- *                 Y.getNextGroup( null, { "Y1", "Y2", "Y3" } ) // "Y1" is selected using Ys handler.
- *                 
- *                 For this example Y1 has no page groups following it.
- *                 
- *                 T.getNextGroup( "Y", { "X", "Y", "Z" } )  // null is selected using Ts handler.
- *                 
- *                 For this example, the T handler decided that no page group followed Y not even X or Z.
- *
- */
-public interface IDMPageGroupHandler 
-{
-  /**
-   * 
-   * @param currentPageGroupID the current page group ID.  This value will be null the first time 
-   *                           this method is called.
-   * @param pageGroupIDs a list of page group IDs that follow the page group for this handler.
-   * @return returns the page group id that should follow currentPageGroupID, or it
-   * should return null if no page group follows currentPageGroupID.
-   * 
-   */
-  public String getNextPageGroup( String currentPageGroupID, String[] pageGroupIDs );
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/IDMPageHandler.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/IDMPageHandler.java
deleted file mode 100644
index a4419a3..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/IDMPageHandler.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.datamodel.ui;
-
-/**
- * This interface is EXPERIMENTAL and is subject to substantial changes.
- */
-public interface IDMPageHandler {
-
-	/**
-	 * return this as the page name if the expectedNextPageName or expectedPreviousPageName should
-	 * be skipped
-	 */
-	public static final String SKIP_PAGE = "IDMExtendedPageHandler.SKIP_PAGE"; //$NON-NLS-1$
-
-	/**
-	 * prefix this string with the name of the page which occurs before the page that should be
-	 * returned. E.G. suppose your page contributions know about pages A, B and C, and you want the
-	 * to skip pages B and C, when going to the next page from A. To do this, return PAGE_AFTER+C.
-	 * The framework will then ask the wizard for the page that normally comes after page C.
-	 * PAGE_BEFORE works similarly.
-	 */
-	public static final String PAGE_AFTER = "IDMExtendedPageHandler.PAGE_AFTER"; //$NON-NLS-1$
-
-	/**
-	 * same as PAGE_AFTER, except for returing the page before.
-	 */
-	public static final String PAGE_BEFORE = "IDMExtendedPageHandler.PAGE_BEFORE"; //$NON-NLS-1$
-
-	/**
-	 * Return the name of the page that should be next
-	 * 
-	 * @param currentPageName
-	 *            the page the wizard is currently on
-	 * @param expectedNextPageName
-	 *            the page that would normally be next
-	 * @return
-	 */
-	public String getNextPage(String currentPageName, String expectedNextPageName);
-
-	/**
-	 * Return the name of the page that should be previous
-	 * 
-	 * @param currentPageName
-	 *            the page the wizard is currently on
-	 * @param expectedNextPageName
-	 *            the page that would normally be previous
-	 * @return
-	 */
-	public String getPreviousPage(String currentPageName, String expectedPreviousPageName);
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/SimplePageGroup.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/SimplePageGroup.java
deleted file mode 100644
index 0e936ef..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/SimplePageGroup.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 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
- **************************************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.datamodel.ui;
-
-import java.util.List;
-import java.util.Set;
-import java.util.Vector;
-
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-
-public class SimplePageGroup implements AddablePageGroup {
-	private String groupID;
-	private String wizardID;
-	private boolean allowExtendedPages;
-	private String requiredDataOperation;
-	private Set    dataModelIDs;
-
-	private IDMPageHandler pageHandler;
-	private IDMPageGroupHandler pageGroupHandler;
-	private Vector pages;
-
-	public SimplePageGroup(String groupID, String wizardID, boolean allowExtendedPages, String requireDataOperation) {
-		this.groupID = groupID;
-		this.wizardID = wizardID;
-		this.allowExtendedPages = allowExtendedPages;
-		this.requiredDataOperation = requireDataOperation;
-		pages = new Vector();
-	}
-
-	public SimplePageGroup(String groupID, String wizardID) {
-		this(groupID, wizardID, true, null);
-	}
-
-	public void addPage(IWizardPage page) {
-		pages.add(page);
-	}
-
-	public void addPages(IWizardPage[] newPages) {
-		for (int index = 0; index < newPages.length; index++) {
-			pages.add(newPages[index]);
-		}
-	}
-
-	public boolean getAllowsExtendedPages() {
-		return allowExtendedPages;
-	}
-
-	public void setPageGroupHandler(IDMPageGroupHandler handler) {
-		pageGroupHandler = handler;
-	}
-
-	public IDMPageGroupHandler getPageGroupHandler(IDataModel dataModel) {
-		return pageGroupHandler;
-	}
-
-	public void setPageHandler(IDMPageHandler handler) {
-		pageHandler = handler;
-	}
-
-	public IDMPageHandler getPageHandler(IDataModel dataModel) {
-		return pageHandler;
-	}
-
-	public List getPages(IDataModel dataModel) {
-		return pages;
-	}
-	
-	public IWizardPage[] getExtendedPages(IDataModel dataModel) {
-		return (IWizardPage[]) pages.toArray(new IWizardPage[0]);
-	}
-
-	public String getPageGroupID() {
-		return groupID;
-	}
-
-	public String getPageGroupInsertionID() {
-		return null;
-	}
-
-	public String getRequiredDataOperationToRun() {
-		return requiredDataOperation;
-	}
-
-	public String getWizardID() {
-		return wizardID;
-	}
-
-	public Set getDataModelIDs() {
-		return dataModelIDs;
-	}
-
-	public void setDataModelIDs(Set dataModelIDs) {
-		this.dataModelIDs = dataModelIDs;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/ErrorDialog.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/ErrorDialog.java
deleted file mode 100644
index 620d136..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/ErrorDialog.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.dialog.ui;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-
-
-/**
- * A dialog to display one or more errors to the user, as contained in an
- * <code>Status</code> object. If an error contains additional detailed
- * information then a Details button is automatically supplied, which shows or
- * hides an error details viewer when pressed by the user.
- *  
- */
-public class ErrorDialog extends MessageDialog
-{
-
-  /**
-   * Creates an error dialog. Note that the dialog will have no visual
-   * representation (no widgets) until it is told to open.
-   * <p>
-   * Normally one should use <code>openError</code> to create and open one of
-   * these. This constructor is useful only if the error object being displayed
-   * contains child items <it>and</it> you need to specify a mask which will
-   * be used to filter the displaying of these children.
-   * </p>
-   * 
-   * @param parentShell
-   *            the shell under which to create this dialog
-   * @param dialogTitle
-   *            the title to use for this dialog, or <code>null</code> to
-   *            indicate that the default title should be used
-   * @param message
-   *            the message to show in this dialog, or <code>null</code> to
-   *            indicate that the error's message should be shown as the
-   *            primary message
-   * @param status
-   *            the error to show to the user
-   * @param displayMask
-   *            the mask to use to filter the displaying of child items, as per
-   *            <code>Status.matches</code>
-   */
-  public ErrorDialog(
-    Shell parentShell,
-    String dialogTitle,
-    String message,
-    IStatus status,
-    int displayMask)
-  {
-    super(parentShell, dialogTitle, message, status, displayMask);
-  }
-
-  /*
-   * (non-Javadoc) This should also be overwritten Method declared on Dialog.
-   */
-  protected void createButtonsForButtonBar(Composite parent)
-  {
-    // create OK and Details buttons
-    createButton(
-      parent,
-      StatusDialogConstants.OK_ID,
-      IDialogConstants.OK_LABEL,
-      true);
-    if (status.isMultiStatus() || status.getException() != null )
-    {
-      detailsButton =
-        createButton(
-          parent,
-          StatusDialogConstants.DETAILS_ID,
-          IDialogConstants.SHOW_DETAILS_LABEL,
-          false);
-    }
-  }
-
-  /*
-   * This is one of the few methods that needs to be overwritten by the
-   * subclasses. The image names can be found in the Dialog class
-   */
-  protected Image getDialogImage()
-  {
-    // create image
-    return PlatformUI.getWorkbench().getDisplay().getSystemImage(SWT.ICON_ERROR);
-  }
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/InfoDialog.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/InfoDialog.java
deleted file mode 100644
index cfc565a..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/InfoDialog.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.dialog.ui;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-
-
-/**
- * A dialog to display one or more errors to the user, as contained in an
- * <code>Status</code> object. If an error contains additional detailed
- * information then a Details button is automatically supplied, which shows or
- * hides an error details viewer when pressed by the user.
- *  
- */
-public class InfoDialog extends MessageDialog
-{
-  /**
-   * Creates an error dialog. Note that the dialog will have no visual
-   * representation (no widgets) until it is told to open.
-   * <p>
-   * Normally one should use <code>openError</code> to create and open one of
-   * these. This constructor is useful only if the error object being displayed
-   * contains child items <it>and</it> you need to specify a mask which will
-   * be used to filter the displaying of these children.
-   * </p>
-   * 
-   * @param parentShell
-   *            the shell under which to create this dialog
-   * @param dialogTitle
-   *            the title to use for this dialog, or <code>null</code> to
-   *            indicate that the default title should be used
-   * @param message
-   *            the message to show in this dialog, or <code>null</code> to
-   *            indicate that the error's message should be shown as the
-   *            primary message
-   * @param status
-   *            the error to show to the user
-   * @param displayMask
-   *            the mask to use to filter the displaying of child items, as per
-   *            <code>Status.matches</code>
-   */
-  public InfoDialog(
-    Shell parentShell,
-    String dialogTitle,
-    String message,
-    IStatus status,
-    int displayMask)
-  {
-    super(parentShell, dialogTitle, message, status, displayMask);
-  }
-
-  /*
-   * (non-Javadoc) This should also be overwritten Method declared on Dialog.
-   */
-  protected void createButtonsForButtonBar(Composite parent)
-  {
-    // create OK and Details buttons
-    createButton(
-      parent,
-      StatusDialogConstants.OK_ID,
-      IDialogConstants.OK_LABEL,
-      true);
-    if (status.isMultiStatus() )
-    {
-      detailsButton =
-        createButton(
-          parent,
-          StatusDialogConstants.DETAILS_ID,
-          IDialogConstants.SHOW_DETAILS_LABEL,
-          false);
-    }
-  }
-
-  /*
-   * This is one of the few methods that needs to be overwritten by the
-   * subclasses. The image names can be found in the Dialog class
-   */
-  protected Image getDialogImage()
-  {
-    // create image
-    return PlatformUI.getWorkbench().getDisplay().getSystemImage(SWT.ICON_INFORMATION);
-  }
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/MessageDialog.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/MessageDialog.java
deleted file mode 100644
index 5dc282a..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/MessageDialog.java
+++ /dev/null
@@ -1,636 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.dialog.ui;
-
-import java.io.BufferedReader;
-import java.io.PrintWriter;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.Vector;
-import org.eclipse.core.runtime.IStatus;
-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.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.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.List;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.common.environment.Choice;
-
-
-/**
- * A dialog to display one or more errors to the user, as contained in an
- * <code>Status</code> object. If an error contains additional detailed
- * information then a Details button is automatically supplied, which shows or
- * hides an error details viewer when pressed by the user.
- *  
- */
-public class MessageDialog extends Dialog
-{
-  protected Composite parent;
-
-  /**
-   * Reserve room for this many list items.
-   */
-  protected static final int LIST_ITEM_COUNT = 7;
-
-  /**
-   * The Details button.
-   */
-  protected Button detailsButton;
-
-  /**
-   * The title of the dialog.
-   */
-  protected String title;
-
-  /**
-   * The message to display.
-   */
-  protected String message;
-
-  /**
-   * The SWT list control that displays the error details.
-   */
-  protected List list;
-  protected Text details;
-
-  /**
-   * Indicates whether the error details viewer is currently created.
-   */
-  protected boolean listCreated = false;
-  protected boolean detailsCreated = false;
-
-  /**
-   * Filter mask for determining which status items to display.
-   */
-  protected int displayMask = 0xFFFF;
-
-  /**
-   * The main status object.
-   */
-  protected IStatus status;
-  
-  private Point savedSize = null;
-
-  /**
-   * List of the main error object's detailed errors (element type: <code>Status</code>).
-   */
-  protected java.util.List statusList;
-  /**
-   * Creates an error dialog. Note that the dialog will have no visual
-   * representation (no widgets) until it is told to open.
-   * <p>
-   * Normally one should use <code>openError</code> to create and open one of
-   * these. This constructor is useful only if the error object being displayed
-   * contains child items <it>and</it> you need to specify a mask which will
-   * be used to filter the displaying of these children.
-   * </p>
-   * 
-   * @param parentShell
-   *            the shell under which to create this dialog
-   * @param dialogTitle
-   *            the title to use for this dialog, or <code>null</code> to
-   *            indicate that the default title should be used
-   * @param message
-   *            the message to show in this dialog, or <code>null</code> to
-   *            indicate that the error's message should be shown as the
-   *            primary message
-   * @param status
-   *            the error to show to the user
-   * @param displayMask
-   *            the mask to use to filter the displaying of child items, as per
-   *            <code>Status.matches</code>
-   */
-  public MessageDialog(
-    Shell parentShell,
-    String dialogTitle,
-    String message,
-    IStatus status,
-    int displayMask)
-  {
-    super(parentShell);
-      this.title = dialogTitle == null ? JFaceResources.getString("Problem_Occurred") : //$NON-NLS-1$
-  dialogTitle;
-    this.message = message == null ? status.getMessage() : JFaceResources.format("Reason", new Object[] { message, status.getMessage()}); //$NON-NLS-1$
-    this.status = status;
-    statusList = Arrays.asList(status.getChildren());
-    this.displayMask = displayMask;
-    setShellStyle(SWT.DIALOG_TRIM | SWT.RESIZE | SWT.APPLICATION_MODAL);
-  }
-  /*
-   * (non-Javadoc) Method declared on Dialog. Handles the pressing of the Ok or
-   * Details button in this dialog. If the Ok button was pressed then close
-   * this dialog. If the Details button was pressed then toggle the displaying
-   * of the error details area. Note that the Details button will only be
-   * visible if the error being displayed specifies child details.
-   */
-  protected void buttonPressed(int id)
-  {
-    if (id == StatusDialogConstants.DETAILS_ID)
-    { // was the details button pressed?
-      toggleDetailsArea();
-    }
-    else
-    {
-      super.buttonPressed(id);
-    }
-  }
-  /*
-   * (non-Javadoc) Method declared in Window.
-   */
-  protected void configureShell(Shell shell)
-  {
-    super.configureShell(shell);
-    shell.setText(title);
-  }
-  /*
-   * (non-Javadoc) This should also be overwritten Method declared on Dialog.
-   */
-  protected void createButtonsForButtonBar(Composite parent)
-  {
-    // create OK and Details buttons
-    createButton(
-      parent,
-      StatusDialogConstants.OK_ID,
-      IDialogConstants.OK_LABEL,
-      true);
-    if (status.isMultiStatus() || status.getException() != null )
-    {
-      detailsButton =
-        createButton(
-          parent,
-          StatusDialogConstants.DETAILS_ID,
-          IDialogConstants.SHOW_DETAILS_LABEL,
-          false);
-    }
-    
-    parent.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ));
-  }
-
-  /*
-   * This is one of the few methods that needs to be overwritten by the
-   * subclasses. The image names can be found in the Dialog class
-   */
-  protected Image getDialogImage()
-  {
-    // create image
-    return PlatformUI.getWorkbench().getDisplay().getSystemImage(SWT.ICON_INFORMATION);
-  }
-
-  /*
-   * (non-Javadoc) Method declared on Dialog. Creates and returns the contents
-   * of the upper part of the dialog (above the button bar).
-   */
-  protected Control createDialogArea(Composite parent)
-  {
-    this.parent = parent;
-
-    // create composite
-    Composite composite = (Composite) super.createDialogArea(parent);
-    Composite imageAndLabel = new Composite(composite, SWT.NONE);
-    GridLayout gl = new GridLayout();
-    gl.numColumns = 2;
-    imageAndLabel.setLayout(gl);
-    composite.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ));
-    
-    // create image
-    Image image = getDialogImage();
-    if (image != null)
-    {
-      Label label = new Label(imageAndLabel, 0);
-      image.setBackground(label.getBackground());
-      label.setImage(image);
-      label.setLayoutData(
-        new GridData(
-          GridData.HORIZONTAL_ALIGN_CENTER
-            | GridData.VERTICAL_ALIGN_BEGINNING));
-    }
-
-    // create message
-    if (message != null)
-    {
-      Text text = new Text(imageAndLabel, SWT.READ_ONLY|SWT.WRAP);
-      text.setText(message);
-      GridData data =
-        new GridData(
-          GridData.GRAB_HORIZONTAL
-            | GridData.GRAB_VERTICAL
-            | GridData.HORIZONTAL_ALIGN_FILL
-            | GridData.VERTICAL_ALIGN_CENTER);
-      data.widthHint =
-        convertHorizontalDLUsToPixels(
-          IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH);
-     
-      text.setLayoutData(data);
-      text.setFont(parent.getFont());
-    }
-
-    return composite;
-  }
-
-  protected List createDropDownList(Composite parent)
-  {
-    // create the list
-    list = new List(parent, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
-
-    // fill the list
-    populateList(list);
-
-    GridData data =
-      new GridData(
-        GridData.HORIZONTAL_ALIGN_FILL
-          | GridData.GRAB_HORIZONTAL
-          | GridData.VERTICAL_ALIGN_FILL
-          | GridData.GRAB_VERTICAL);
-    data.heightHint = list.getItemHeight() * LIST_ITEM_COUNT;
-    list.setLayoutData(data);
-    listCreated = true;
-    return list;
-  }
-  protected Text createDropDownDetails(Composite parent)
-  {
-    details = new Text(parent, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.READ_ONLY);
-    //details.setEditable(false);
-    Color color = new Color(parent.getShell().getDisplay(), 255, 255, 255);
-    details.setBackground(color);
-    populateDetails(details, status, 0);
-    GridData data =
-      new GridData(
-        GridData.HORIZONTAL_ALIGN_FILL
-          | GridData.GRAB_HORIZONTAL
-          | GridData.VERTICAL_ALIGN_FILL
-          | GridData.GRAB_VERTICAL);
-    details.setLayoutData(data);
-    details.setSelection(0);
-    detailsCreated = true;
-    return details;
-  }
-  /*
-   * (non-Javadoc) Method declared on Window.
-   */
-  /**
-   * Extends <code>Window.open()</code>. Opens an error dialog to display
-   * the error. If you specified a mask to filter the displaying of these
-   * children, the error dialog will only be displayed if there is at least one
-   * child status matching the mask.
-   */
-  public int open()
-  {
-    if (shouldDisplay(status, displayMask))
-    {
-      return super.open();
-    }
-    return 0;
-  }
-  /**
-   * This essentially does the work of a factory Opens an error dialog to
-   * display the given error. Use this method if the error object being
-   * displayed does not contain child items, or if you wish to display all such
-   * items without filtering.
-   * 
-   * @param parent
-   *            the parent shell of the dialog, or <code>null</code> if none
-   * @param dialogTitle
-   *            the title to use for this dialog, or <code>null</code> to
-   *            indicate that the default title should be used
-   * @param message
-   *            the message to show in this dialog, or <code>null</code> to
-   *            indicate that the error's message should be shown as the
-   *            primary message
-   * @param status
-   *            the error to show to the user
-   * @return the code of the button that was pressed that resulted in this
-   *         dialog closing. This will be <code>Dialog.OK</code> if the OK
-   *         button was pressed, or <code>Dialog.CANCEL</code> if this
-   *         dialog's close window decoration or the ESC key was used.
-   */
-  public static int openMessage(
-    Shell parent,
-    String dialogTitle,
-    String message,
-    IStatus status)
-  {
-
-    switch (status.getSeverity())
-    {
-      case IStatus.INFO :
-        return openInfo(
-          parent,
-          dialogTitle,
-          message,
-          status,
-          IStatus.OK | IStatus.INFO | IStatus.WARNING | IStatus.ERROR);
-      case IStatus.WARNING :
-        return openWarning(
-          parent,
-          dialogTitle,
-          message,
-          status,
-          IStatus.OK | IStatus.INFO | IStatus.WARNING | IStatus.ERROR);
-      default :
-        return openError(
-          parent,
-          dialogTitle,
-          message,
-          status,
-          IStatus.OK | IStatus.INFO | IStatus.WARNING | IStatus.ERROR);
-    }
-
-  }
-
-  public static int openMessage(
-    Shell parent,
-    String dialogTitle,
-    String message,
-    IStatus status,
-    Choice[] options)
-  {
-
-    return openOptions(
-      parent,
-      dialogTitle,
-      message,
-      status,
-      IStatus.OK | IStatus.INFO | IStatus.WARNING | IStatus.ERROR,
-      options);
-  }
-
-  /**
-   * Opens an error dialog to display the given error. Use this method if the
-   * error object being displayed contains child items <it>and</it> you wish
-   * to specify a mask which will be used to filter the displaying of these
-   * children. The error dialog will only be displayed if there is at least one
-   * child status matching the mask.
-   * 
-   * @param parentShell
-   *            the parent shell of the dialog, or <code>null</code> if none
-   * @param dialogTitle
-   *            the title to use for this dialog, or <code>null</code> to
-   *            indicate that the default title should be used
-   * @param message
-   *            the message to show in this dialog, or <code>null</code> to
-   *            indicate that the error's message should be shown as the
-   *            primary message
-   * @param status
-   *            the error to show to the user
-   * @param displayMask
-   *            the mask to use to filter the displaying of child items, as per
-   *            <code>Status.matches</code>
-   * @return the code of the button that was pressed that resulted in this
-   *         dialog closing. This will be <code>Dialog.OK</code> if the OK
-   *         button was pressed, or <code>Dialog.CANCEL</code> if this
-   *         dialog's close window decoration or the ESC key was used.
-   */
-  public static int openError(
-    Shell parentShell,
-    String title,
-    String message,
-    IStatus status,
-    int displayMask)
-  {
-    ErrorDialog dialog =
-      new ErrorDialog(parentShell, title, message, status, displayMask);
-    return dialog.open();
-  }
-
-  public static int openInfo(
-    Shell parentShell,
-    String title,
-    String message,
-    IStatus status,
-    int displayMask)
-  {
-    InfoDialog dialog =
-      new InfoDialog(parentShell, title, message, status, displayMask);
-    return dialog.open();
-  }
-
-  public static int openWarning(
-    Shell parentShell,
-    String title,
-    String message,
-    IStatus status,
-    int displayMask)
-  {
-    WarningDialog dialog =
-      new WarningDialog(parentShell, title, message, status, displayMask);
-    return dialog.open();
-  }
-
-  public static int openOptions(
-    Shell parentShell,
-    String title,
-    String message,
-    IStatus status,
-    int displayMask,
-    Choice[] options)
-  {
-    OptionsDialog dialog =
-      new OptionsDialog(
-        parentShell,
-        title,
-        message,
-        status,
-        displayMask,
-        options);
-    dialog.open();
-    return dialog.getReturnCode();
-  }
-
-  /**
-   * Populates the list using this error dialog's status object. This walks the
-   * child stati of the status object and displays them in a list. The format
-   * for each entry is status_path : status_message If the status's path was
-   * null then it (and the colon) are omitted.
-   */
-  private void populateList(List list)
-  {
-    Iterator enumeration = statusList.iterator();
-    while (enumeration.hasNext())
-    {
-      IStatus childStatus = (IStatus) enumeration.next();
-      populateList(list, childStatus, 0);
-    }
-  }
-  private void populateList(List list, IStatus status, int nesting)
-  {
-    if (!status.matches(displayMask))
-    {
-      return;
-    }
-    StringBuffer sb = new StringBuffer();
-    for (int i = 0; i < nesting; i++)
-    {
-      sb.append("  ");
-    }
-    sb.append(status.getMessage());
-    list.add(sb.toString());
-    IStatus[] children = status.getChildren();
-    for (int i = 0; i < children.length; i++)
-    {
-      populateList(list, children[i], nesting + 1);
-    }
-  }
-  private void populateDetails(Text text, IStatus status, int nesting)
-  {
-    if (!status.matches(displayMask))
-    {
-      return;
-    }
-        
-    String    tabChars    = repeat( ' ', nesting * 2 );
-    String    messageLine = tabChars + status.getMessage() + System.getProperty("line.separator");
-    Throwable except      = status.getException();
-    
-    text.append( messageLine );
-    
-    if( except != null )
-    {
-      String[] trace = getStackTrace( except );
-      
-      for( int index = 0; index < trace.length; index++ )
-      {
-        text.append( tabChars + "    " + trace[index] + System.getProperty("line.separator") );
-      }
-    }
-    
-    IStatus[] children = status.getChildren();
-    for (int i = 0; i < children.length; i++)
-    {
-      populateDetails(text, children[i], nesting + 1);
-    }
-  }
-  /**
-   * Returns whether the given status object should be displayed.
-   * 
-   * @param status
-   *            a status object
-   * @param mask
-   *            a mask as per <code>Status.matches</code>
-   * @return <code>true</code> if the given status should be displayed, and
-   *         <code>false</code> otherwise
-   */
-  protected static boolean shouldDisplay(IStatus status, int mask)
-  {
-    IStatus[] children = status.getChildren();
-    if (children == null || children.length == 0)
-    {
-      return status.matches(mask);
-    }
-    for (int i = 0; i < children.length; i++)
-    {
-      if (children[i].matches(mask))
-        return true;
-    }
-    return false;
-  }
-  /**
-   * Toggles the unfolding of the details area. This is triggered by the user
-   * pressing the details button.
-   */
-  private void toggleDetailsArea()
-  {
-    Point windowSize = getShell().getSize();
-    int   newHeight  = -1;
-    
-    if (detailsCreated)
-    {
-      details.dispose();
-      detailsCreated = false;
-      detailsButton.setText(IDialogConstants.SHOW_DETAILS_LABEL);
-      
-      // Without the following computeSize call the setSize call below throws an array out of bounds exception.
-      // Very weird.
-      getContents().computeSize(SWT.DEFAULT, SWT.DEFAULT);
-      
-      newHeight = savedSize.y;
-    }
-    else
-    {
-      if( savedSize == null ) savedSize = windowSize;
-        
-      details = createDropDownDetails((Composite) getContents());
-      detailsButton.setText(IDialogConstants.HIDE_DETAILS_LABEL);
-      newHeight = getContents().computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
-    }
-
-
-    newHeight = newHeight > 400 ? 400 : newHeight;
-    
-    getShell().setSize( new Point(windowSize.x, newHeight) );
-  }
-  
-  private String[] getStackTrace( Throwable exc )
-  {
-    Vector       lines        = new Vector();
-    StringWriter stringWriter = new StringWriter();
-    PrintWriter  printWriter  = new PrintWriter( stringWriter );
-    
-    exc.printStackTrace( printWriter );
-    
-    try
-    {
-      printWriter.close();
-      stringWriter.close();
-    }
-    catch( Exception nestedExc )
-    {
-      return new String[0];
-    }
-    
-    StringReader stringReader = new StringReader( stringWriter.toString() );
-    BufferedReader reader     = new BufferedReader( stringReader );
-    String         line       = null;
-    
-    try
-    {
-      line = reader.readLine();
-    
-      while( line != null )
-      {
-        lines.add( line.trim() );
-        line = reader.readLine();
-      }
-    }
-    catch( Exception nestedExc )
-    {
-      return new String[0];
-    }
-    
-    return (String[])lines.toArray( new String[0] );
-  }
-  
-  private String repeat( char the_char, int count )
-  {
-    StringBuffer buf = new StringBuffer( count );
-
-    for( int index = 0; index < count; index++ )
-    {
-      buf.append( the_char );
-    }
-
-    return buf.toString();
-  }
-  
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/OptionsDialog.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/OptionsDialog.java
deleted file mode 100644
index 21869b2..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/OptionsDialog.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.dialog.ui;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.common.environment.Choice;
-
-
-/**
- * A dialog to display one or more errors to the user, as contained in an
- * <code>Status</code> object. If an error contains additional detailed
- * information then a Details button is automatically supplied, which shows or
- * hides an error details viewer when pressed by the user.
- *  
- */
-public class OptionsDialog extends MessageDialog
-{
-  private Choice[] choices;
-  private int returnCode_;
-
-  public OptionsDialog(
-    Shell parentShell,
-    String dialogTitle,
-    String message,
-    IStatus status,
-    int displayMask,
-    Choice[] choices)
-  {
-    super(parentShell, dialogTitle, message, status, displayMask);
-    this.choices = choices;
-  }
-
-  /*
-   * (non-Javadoc) This should also be overwritten Method declared on Dialog.
-   */
-  protected void createButtonsForButtonBar(Composite parent)
-  {
-    // create a button for each options
-    for (int i = 0; i < choices.length; i++)
-    {
-      createButton(parent, choices[i].getShortcut(), choices[i].getLabel(), true);
-    }
-    if (status.isMultiStatus() )
-    {
-      detailsButton =
-        createButton(
-          parent,
-          StatusDialogConstants.DETAILS_ID,
-          IDialogConstants.SHOW_DETAILS_LABEL,
-          false);
-    }
-  }
-
-  protected void buttonPressed(int id)
-  {
-    if (id == StatusDialogConstants.DETAILS_ID)
-      // was the Details button pressed?
-      super.buttonPressed(id);
-    else
-    {
-      setReturnCode(id);
-      close();
-    }
-  }
-
-  protected void setReturnCode(int id)
-  {
-    returnCode_ = id;
-  }
-
-  public int getReturnCode()
-  {
-    return returnCode_;
-  }
-  /*
-   * This is one of the few methods that needs to be overwritten by the
-   * subclasses. The image names can be found in the Dialog class
-   */
-  protected Image getDialogImage()
-  {
-    // create image
-    switch (status.getSeverity())
-    {
-      case IStatus.INFO :
-        return PlatformUI.getWorkbench().getDisplay().getSystemImage(SWT.ICON_INFORMATION);
-      case IStatus.WARNING :
-        return PlatformUI.getWorkbench().getDisplay().getSystemImage(SWT.ICON_WARNING);
-      default :
-        return PlatformUI.getWorkbench().getDisplay().getSystemImage(SWT.ICON_ERROR);
-    }
-  }
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/StatusDialogConstants.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/StatusDialogConstants.java
deleted file mode 100644
index e3ca36b..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/StatusDialogConstants.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.dialog.ui;
-
-/**
-* Constants for status dialogs
-*/
-public interface StatusDialogConstants {
-
-  /*
-  * Button ID for the "Yes" button
-  */
-  public static final int YES_ID = 2;
-  /*
-  * Button ID for the "Yes to all" button
-  */
-  public static final int YES_TO_ALL_ID = 4;
-  /*
-  * Button ID for the "Cancel" button
-  */
-  public static final int CANCEL_ID = 1;
-  /*
-  * Button ID for the "OK" button
-  */
-  public static final int OK_ID = 0;
-  /*
-  * Button ID for the "Details" button
-  */
-  public static final int DETAILS_ID = 13;
-
-  /*
-  * Button label for the "Yes" button
-  */
- // public static final String YES_LABEL = EnvironmentPlugin.getInstance().getMessage("%STATUS_DIALOG_YES_LABEL");
-  /*
-  * Button label for the "Yes to all" button
-  */
- // public static final String YES_TO_ALL_LABEL = EnvironmentPlugin.getInstance().getMessage("%STATUS_DIALOG_YES_TO_ALL_LABEL");
-  /*
-  * Button label for the "Cancel" button
-  */
- // public static final String CANCEL_LABEL = EnvironmentPlugin.getInstance().getMessage("%STATUS_DIALOG_CANCEL_LABEL");
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/WarningDialog.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/WarningDialog.java
deleted file mode 100644
index 6c66d82..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/WarningDialog.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.dialog.ui;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-
-
-/**
- * A dialog to display one or more errors to the user, as contained in an
- * <code>Status</code> object. If an error contains additional detailed
- * information then a Details button is automatically supplied, which shows or
- * hides an error details viewer when pressed by the user.
- *  
- */
-public class WarningDialog extends MessageDialog
-{
-  /**
-   * Creates an error dialog. Note that the dialog will have no visual
-   * representation (no widgets) until it is told to open.
-   * <p>
-   * Normally one should use <code>openError</code> to create and open one of
-   * these. This constructor is useful only if the error object being displayed
-   * contains child items <it>and</it> you need to specify a mask which will
-   * be used to filter the displaying of these children.
-   * </p>
-   * 
-   * @param parentShell
-   *            the shell under which to create this dialog
-   * @param dialogTitle
-   *            the title to use for this dialog, or <code>null</code> to
-   *            indicate that the default title should be used
-   * @param message
-   *            the message to show in this dialog, or <code>null</code> to
-   *            indicate that the error's message should be shown as the
-   *            primary message
-   * @param status
-   *            the error to show to the user
-   * @param displayMask
-   *            the mask to use to filter the displaying of child items, as per
-   *            <code>Status.matches</code>
-   */
-  public WarningDialog(
-    Shell parentShell,
-    String dialogTitle,
-    String message,
-    IStatus status,
-    int displayMask)
-  {
-    super(parentShell, dialogTitle, message, status, displayMask);
-  }
-
-  /*
-   * (non-Javadoc) This should also be overwritten Method declared on Dialog.
-   */
-  protected void createButtonsForButtonBar(Composite parent)
-  {
-    // create OK, Cancel and Details buttons
-    createButton(
-      parent,
-      StatusDialogConstants.OK_ID,
-      IDialogConstants.OK_LABEL,
-      true);
-    createButton(
-      parent,
-      StatusDialogConstants.CANCEL_ID,
-      IDialogConstants.CANCEL_LABEL,
-      false);
-    if (status.isMultiStatus())
-    {
-      detailsButton =
-        createButton(
-          parent,
-          StatusDialogConstants.DETAILS_ID,
-          IDialogConstants.SHOW_DETAILS_LABEL,
-          false);
-    }
-  }
-
-  /*
-   * This is one of the few methods that needs to be overwritten by the
-   * subclasses. The image names can be found in the Dialog class
-   */
-  protected Image getDialogImage()
-  {
-    // create image
-    return PlatformUI.getWorkbench().getDisplay().getSystemImage(SWT.ICON_WARNING);
-  }
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/eclipse/ui/EclipseEnvironment.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/eclipse/ui/EclipseEnvironment.java
deleted file mode 100644
index 42f20ec..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/eclipse/ui/EclipseEnvironment.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.eclipse.ui;
-
-import org.eclipse.wst.common.environment.EnvironmentService;
-import org.eclipse.wst.common.environment.IEnvironment;
-import org.eclipse.wst.common.environment.ILog;
-import org.eclipse.wst.common.environment.IStatusHandler;
-import org.eclipse.wst.common.environment.uri.IURIFactory;
-import org.eclipse.wst.common.environment.uri.IURIScheme;
-import org.eclipse.wst.common.environment.uri.SimpleURIFactory;
-
-
-/**
- * This class implements an IEnvironment class for the Eclipse IEnvironment.
- * This IEnvironment currently supports the "platform" protocol and the "file"
- * protocol.
- *
- */
-public class EclipseEnvironment implements IEnvironment
-{
-  private SimpleURIFactory uriFactory_      = null;
-  private IStatusHandler    statusHandler_   = null;
-  private ILog              logger_          = null;
-  
-  public EclipseEnvironment()
-  {
-    this( new EclipseStatusHandler() );  
-  }
-  
-  public EclipseEnvironment( IStatusHandler   statusHandler )
-  {
-    IURIScheme eclipseScheme = EnvironmentService.getEclipseScheme();
-    IURIScheme fileScheme    = EnvironmentService.getFileScheme();
-    
-    uriFactory_      = new SimpleURIFactory();
-    statusHandler_   = statusHandler;
-    
-    uriFactory_.registerScheme( "platform", eclipseScheme );
-    uriFactory_.registerScheme( "file", fileScheme );
-  }
-  
-  /**
-   * @see org.eclipse.wst.common.environment.IEnvironment#getLog()
-   */
-  public ILog getLog()
-  {
-	  if( logger_ == null )
-    {  
-      logger_ = EnvironmentService.getEclipseLog(); 
-    };
-	
-    return logger_;
-  }
-   
-  /**
-   * @see org.eclipse.wst.common.environment.IEnvironment#getStatusHandler()
-   */
-  public IStatusHandler getStatusHandler()
-  {
-    return statusHandler_;
-  }
-
-  /** (non-Javadoc)
-   * @see org.eclipse.wst.common.environment.IEnvironment#getURIFactory()
-   */
-  public IURIFactory getURIFactory()
-  {
-    return uriFactory_;
-  }
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/eclipse/ui/EclipseStatusHandler.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/eclipse/ui/EclipseStatusHandler.java
deleted file mode 100644
index a8dc82e..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/eclipse/ui/EclipseStatusHandler.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.eclipse.ui;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.wst.common.environment.Choice;
-import org.eclipse.wst.common.environment.StatusException;
-import org.eclipse.wst.common.environment.IStatusHandler;
-import org.eclipse.wst.common.frameworks.internal.dialog.ui.MessageDialog;
-import org.eclipse.wst.common.frameworks.internal.dialog.ui.StatusDialogConstants;
-
-
-/**
- * This is the Eclipse UI version of the IStatusHandler
- */
-public class EclipseStatusHandler implements IStatusHandler
-{
-  private Shell        shell_;
-  
-  public EclipseStatusHandler()
-  {
-    this( new Shell() );
-  }
-
-  public EclipseStatusHandler(Shell shell)
-  {
-    shell_ = shell;
-  }
-  
-  /**
-   * @see org.eclipse.env.common.IStatusHandler#report(org.eclipse.env.common.Status, org.eclipse.env.common.Choice[])
-   */
-  public Choice report(IStatus status, Choice[] choices) 
-  {
-    int result =
-    MessageDialog.openMessage(
-        shell_,
-        Messages.TITLE_WARNING,
-				null,
-				status,
-				choices);
-    for (int i = 0; i < choices.length; i++)
-     {
-      if (choices[i].getShortcut() == result)
-        return choices[i];
-    }
-    
-    return null;
-  }
-
-  /**
-   * @see org.eclipse.env.common.IStatusHandler#report(org.eclipse.env.common.Status)
-   */
-  public void report(IStatus status) throws StatusException
-  {
-    boolean userOk = false;
-    
-    switch (status.getSeverity())
-    {
-      // an error has been reported and we need to stop executing the comming
-      // commands
-      case Status.ERROR :
-      {
-        userOk = reportErrorStatus(status);
-        break;
-      }
-      case Status.WARNING :
-      {
-        userOk = reportWarning(status);
-        break;
-      }     
-      case Status.INFO :
-      {
-        userOk = true;
-        reportInfo(status);
-        break;
-      }
-    }
-    
-    if( !userOk ) throw new StatusException( status );
-  }
-  
-  private boolean reportWarning(IStatus status)
-  {
-    int userResponse =
-      MessageDialog.openMessage(
-        shell_,
-        Messages.TITLE_WARNING,
-        null,
-        status);
-    return (userResponse == StatusDialogConstants.OK_ID);
-  }
-
-  private boolean reportErrorStatus(IStatus status)
-  {
-    MessageDialog.openMessage(
-      shell_,
-      Messages.TITLE_ERROR,
-      null,
-      status);
-    return false;
-  }
-  
-  /**
-   * @see org.eclipse.wst.common.environment.IStatusHandler#reportError(org.eclipse.core.runtime.IStatus)
-   */
-  public void reportError(IStatus status)
-  {
-    reportErrorStatus( status );
-  }
-  
-  /**
-   * @see org.eclipse.wst.common.environment.IStatusHandler#reportInfo(org.eclipse.core.runtime.IStatus)
-   */
-  public void reportInfo(IStatus status)
-  {
-    MessageDialog.openMessage(
-        shell_,
-        Messages.TITLE_INFO,
-        null,
-        status);
-  }
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/eclipse/ui/Messages.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/eclipse/ui/Messages.java
deleted file mode 100644
index 09b2188..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/eclipse/ui/Messages.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 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
- **************************************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.eclipse.ui;
-
-import org.eclipse.osgi.util.NLS;
-
-public class Messages extends NLS
-{
-  private static final String BUNDLE_NAME = "org.eclipse.wst.common.frameworks.internal.eclipse.ui.environment";
-  
-  public static String TITLE_WARNING;
-  public static String TITLE_ERROR;
-  public static String TITLE_INFO;
-  
-  static
-  {
-    NLS.initializeMessages( BUNDLE_NAME, Messages.class );
-  }
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/eclipse/ui/environment.properties b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/eclipse/ui/environment.properties
deleted file mode 100644
index eefde94..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/eclipse/ui/environment.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 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
-###############################################################################
-
-TITLE_WARNING=Warning:
-TITLE_ERROR=Error:
-TITLE_INFO=Info:
-
-
-
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/CommonUIPluginConstants.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/CommonUIPluginConstants.java
deleted file mode 100644
index 60b55eb..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/CommonUIPluginConstants.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Jan 16, 2004
- *
- * To change the template for this generated file go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal.operation.extensionui;
-
-/**
- * @author blancett
- * 
- * To change the template for this generated type comment go to Window - Preferences - Java - Code
- * Generation - Code and Comments
- */
-public interface CommonUIPluginConstants {
-	public static final String PLUGIN_ID = "org.eclipse.wst.common.frameworks.ui"; //$NON-NLS-1$
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardExtensionFactory.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardExtensionFactory.java
deleted file mode 100644
index b9f0cff..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardExtensionFactory.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.operation.extensionui;
-
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.IDMPageGroupHandler;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.IDMPageHandler;
-
-/**
- * This interface is EXPERIMENTAL and is subject to substantial changes.
- */
-public abstract class DMWizardExtensionFactory {
-
-	public DMWizardExtensionFactory() {
-		super();
-	}
-
-	public abstract DataModelWizardPage[] createPageGroup(IDataModel dataModel, String pageGroupID);
-
-	/*
-	 * this is optional
-	 */
-	public IDMPageHandler createPageHandler(IDataModel dataModel, String pageGroupID) 
-	{
-	  return null;
-	}
-		
-	/**
-	 * This page group handler can be optionally overriden.
-	 */
-	public IDMPageGroupHandler createPageGroupHandler( IDataModel dataModel, String pageGroupID )
-	{
-	  return null;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageElement.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageElement.java
deleted file mode 100644
index ca112b2..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageElement.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.operation.extensionui;
-
-import java.util.HashSet;
-import java.util.Set;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.internal.AbstractRegistryDescriptor;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.IDMPageGroupHandler;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.IDMPageHandler;
-import org.eclipse.wst.common.frameworks.internal.enablement.IdentifiableComparator;
-
-public class DMWizardPageElement extends AbstractRegistryDescriptor implements Comparable {
-	static final String ELEMENT_PAGE_GROUP = "wizardPageGroup"; //$NON-NLS-1$
-	static final String ATT_PAGE_ID = "pageGroupID"; //$NON-NLS-1$
-	static final String ATT_WIZARD_ID = "wizardID"; //$NON-NLS-1$
-	static final String ATT_REQUIRES_DATA_OPERATION_ID = "requiresDataOperationId"; //$NON-NLS-1$
-	static final String ATT_DATA_MODEL_IDS = "dataModelIds"; //$NON-NLS-1$
-	static final String ATT_ALLOWS_EXTENDED_PAGES_AFTER = "allowsExtendedPagesAfter"; //$NON-NLS-1$
-	static final String ATT_PAGE_INSERTION_ID = "pageGroupInsertionID"; //$NON-NLS-1$
-	static final String ELEMENT_FACTORY = "factory"; //$NON-NLS-1$
-
-	protected DMWizardPageFactoryElement wizardPageFactoryElement;
-	protected String pluginID;
-	protected String wizardID;
-	public String pageGroupID;
-	protected String wizardFactoryElement;
-	protected boolean allowsExtendedPagesAfter;
-	protected String requiresDataOperationId;
-	protected Set dataModelIDs;
-	protected String pageInsertionID;
-	private int loadOrder;
-	private static int loadOrderCounter;
-
-
-	private int type;
-
-	public DMWizardPageElement(IConfigurationElement element1) {
-		super(element1);
-		pluginID = element1.getDeclaringExtension().getNamespace();
-		wizardID = element1.getAttribute(ATT_WIZARD_ID);
-		pageGroupID = element1.getAttribute(ATT_PAGE_ID);
-		requiresDataOperationId = element1.getAttribute(ATT_REQUIRES_DATA_OPERATION_ID);
-		dataModelIDs = getDataModelIds( element1 );
-		readAllowsExtendedPageAfter(element1);
-		pageInsertionID = element1.getAttribute(ATT_PAGE_INSERTION_ID);
-		readFactory(element1);
-		validateSettings();
-		loadOrder = loadOrderCounter++;
-	}
-
-  private Set getDataModelIds(IConfigurationElement element )
-  {
-    HashSet ids    = new HashSet();
-    String  idList = element.getAttribute(ATT_DATA_MODEL_IDS);
-    
-    if( idList != null )
-    {
-      String[] dataModelIDs = idList.split( " *");
-    
-      for( int index = 0; index < dataModelIDs.length; index++ )
-      {
-        ids.add( dataModelIDs[index] );  
-      }
-    }
-    
-    return ids;
-  }
-  
-	private void validateSettings() {
-		if (wizardID == null || wizardPageFactoryElement == null) {
-			Logger.getLogger().logError("Incomplete page extension specification."); //$NON-NLS-1$
-		}
-	}
-
-
-	private void readAllowsExtendedPageAfter(IConfigurationElement element1) {
-		String allowsPageAfterValue = element1.getAttribute(ATT_ALLOWS_EXTENDED_PAGES_AFTER);
-		allowsExtendedPagesAfter = allowsPageAfterValue == null ? false : Boolean.valueOf(allowsPageAfterValue).booleanValue();
-	}
-
-	private void readFactory(IConfigurationElement element1) {
-		IConfigurationElement[] factories = element1.getChildren(ELEMENT_FACTORY);
-		if (factories != null && factories.length > 0) {
-			wizardPageFactoryElement = new DMWizardPageFactoryElement(factories[0], pageGroupID);
-		}
-	}
-
-	public IDMPageHandler createPageHandler(IDataModel dataModel) {
-		if (wizardPageFactoryElement != null)
-			return wizardPageFactoryElement.createPageHandler(dataModel);
-		return null;
-	}
-
-	public DataModelWizardPage[] createPageGroup(IDataModel dataModel) {
-		if (wizardPageFactoryElement != null)
-			return wizardPageFactoryElement.createPageGroup(dataModel);
-		return null;
-	}
-
-	public IDMPageGroupHandler createPageGroupHandler(IDataModel dataModel) {
-		return wizardPageFactoryElement == null ? null : wizardPageFactoryElement.createPageGroupHandler(dataModel);
-	}
-
-	public int compareTo(Object o) {
-		return IdentifiableComparator.getInstance().compare(this, o);
-		/*
-		 * if (o == null) return GREATER_THAN; WizardPageElement element = (WizardPageElement) o; if
-		 * (getID() == null && element.getID() == null) return compareLoadOrder(element); if
-		 * (getID() == null) return GREATER_THAN; else if (element.getID() == null) return
-		 * LESS_THAN;
-		 * 
-		 * int priority = getPriority(); int elementPriority =element.getPriority();
-		 * 
-		 * if (priority == elementPriority) return compareLoadOrder(element); if (priority <
-		 * elementPriority) return GREATER_THAN; if (priority > elementPriority) return LESS_THAN;
-		 * return EQUAL;
-		 */
-	}
-
-	/**
-	 * @return
-	 */
-	public boolean allowsExtendedPagesAfter() {
-		return allowsExtendedPagesAfter;
-	}
-
-	/**
-	 * @return
-	 */
-	public String getPluginID() {
-		return pluginID;
-	}
-
-	/**
-	 * @return
-	 */
-	public String getPageID() {
-		return pageGroupID;
-	}
-
-	/**
-	 * @return
-	 */
-	public String getPageInsertionID() {
-		return pageInsertionID;
-	}
-
-	/**
-	 * @return
-	 */
-	public int getType() {
-		return type;
-	}
-
-	/**
-	 * @return
-	 */
-	public int getLoadOrder() {
-		return loadOrder;
-	}
-
-
-	/**
-	 * @return Returns the allowsExtendedPagesAfter.
-	 */
-	public boolean isAllowsExtendedPagesAfter() {
-		return allowsExtendedPagesAfter;
-	}
-
-	/**
-	 * @param allowsExtendedPagesAfter
-	 *            The allowsExtendedPagesAfter to set.
-	 */
-	public void setAllowsExtendedPagesAfter(boolean allowsExtendedPagesAfter) {
-		this.allowsExtendedPagesAfter = allowsExtendedPagesAfter;
-	}
-
-	public String getRequiresDataOperationId() {
-		return requiresDataOperationId;
-	}
-
-
-	public void setRequiresDataOperationId(String dataOperationId) {
-		requiresDataOperationId = dataOperationId;
-	}
-
-	public Set getDataModelIDs() {
-		return dataModelIDs;
-	}
-
-	public void setDataModelID(Set newDataModelIDs) {
-		dataModelIDs = newDataModelIDs;
-	}
-
-	/**
-	 * @return Returns the wizardFactoryElement.
-	 */
-	public String getWizardFactoryElement() {
-		return wizardFactoryElement;
-	}
-
-	/**
-	 * @param wizardFactoryElement
-	 *            The wizardFactoryElement to set.
-	 */
-	public void setWizardFactoryElement(String wizardFactoryElement) {
-		this.wizardFactoryElement = wizardFactoryElement;
-	}
-
-	/**
-	 * @return Returns the wizardID.
-	 */
-	public String getWizardID() {
-		return wizardID;
-	}
-
-	/**
-	 * @param wizardID
-	 *            The wizardID to set.
-	 */
-	public void setWizardID(String wizardID) {
-		this.wizardID = wizardID;
-	}
-
-	/**
-	 * @return Returns the wizardPageFactoryElement.
-	 */
-	public DMWizardPageFactoryElement getWizardPageFactoryElement() {
-		return wizardPageFactoryElement;
-	}
-
-	/**
-	 * @param wizardPageFactoryElement
-	 *            The wizardPageFactoryElement to set.
-	 */
-	public void setWizardPageFactoryElement(DMWizardPageFactoryElement wizardPageFactoryElement) {
-		this.wizardPageFactoryElement = wizardPageFactoryElement;
-	}
-
-
-	/**
-	 * @param pageID
-	 *            The pageID to set.
-	 */
-	public void setPageID(String pageID) {
-		this.pageGroupID = pageID;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.AbstractRegistryDescriptor#getID()
-	 */
-	public String getID() {
-		return getPageID();
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageExtensionManager.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageExtensionManager.java
deleted file mode 100644
index e8908af..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageExtensionManager.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.operation.extensionui;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.TreeSet;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jem.util.RegistryReader;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.frameworks.internal.enablement.EnablementManager;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPCommonUIResourceHandler;
-
-public class DMWizardPageExtensionManager {
-
-	public static final String ORG_ECLIPSE_UI = "org.eclipse.ui"; //$NON-NLS-1$
-
-	protected static DMWizardPageExtensionManager instance = null;
-
-	HashMap wizardPluginIDMap = null;
-
-	TreeMap wizardPageElements = null;
-
-	// private TreeSet wizardExtPageElements = null;
-	List nonSyncedPageElementList = null;
-
-	private WizardPageExtensionReader reader = null;
-
-	private DMWizardPageExtensionManager() {
-		setupWizardPluginIDMap();
-		readFromRegistry();
-		postReadFromRegistry();
-	}
-
-	private void setupWizardPluginIDMap() {
-		wizardPluginIDMap = new HashMap();
-		// get editor plugin and save it to a hash map
-		// Note: editors extension id is different from editor id
-
-		IExtensionPoint[] point = new IExtensionPoint[]{Platform.getExtensionRegistry().getExtensionPoint(ORG_ECLIPSE_UI, "exportWizards"), //$NON-NLS-1$
-					Platform.getExtensionRegistry().getExtensionPoint(ORG_ECLIPSE_UI, "importWizards"), //$NON-NLS-1$
-					Platform.getExtensionRegistry().getExtensionPoint(ORG_ECLIPSE_UI, "newWizards"), //$NON-NLS-1$
-					Platform.getExtensionRegistry().getExtensionPoint("org.eclipse.wst.common.frameworks.ui", "extendableWizard")}; //$NON-NLS-1$ //$NON-NLS-2$
-
-		for (int x = 0; x < point.length; x++) {
-			IConfigurationElement[] elements = point[x].getConfigurationElements();
-			for (int i = 0; i < elements.length; i++) {
-				String wizardID = elements[i].getAttribute("id"); //$NON-NLS-1$
-				String pluginID = elements[i].getDeclaringExtension().getNamespace();
-				wizardPluginIDMap.put(wizardID, pluginID);
-			}
-		}
-	}
-
-	private void readFromRegistry() {
-		wizardPageElements = new TreeMap();
-		// wizardExtPageElements = new TreeSet();
-		nonSyncedPageElementList = new ArrayList();
-		// Read all page extensions into editorPageElements
-		reader = new WizardPageExtensionReader();
-		reader.readRegistry();
-
-	}
-
-	protected class WizardPageExtensionReader extends RegistryReader {
-
-		public WizardPageExtensionReader() {
-			super(CommonUIPluginConstants.PLUGIN_ID, DMWizardPageElement.ELEMENT_PAGE_GROUP);
-		}
-
-		public boolean readElement(IConfigurationElement element) {
-			if (!DMWizardPageElement.ELEMENT_PAGE_GROUP.equals(element.getName()))
-				return false;
-			DMWizardPageElement newElement = new DMWizardPageElement(element);
-
-			// put the element into a hashmap, wizardID as key,
-			// list of page elements as object
-			String wizardID = newElement.getWizardID();
-			if (!wizardPageElements.containsKey(wizardID)) {
-				wizardPageElements.put(wizardID, createPageMapEntry(newElement));
-			} else {
-				TreeMap pageMap = (TreeMap) wizardPageElements.get(wizardID);
-				insertPageElement(pageMap, newElement);
-			}
-
-			return true;
-		}
-
-		public void insertPageElement(TreeMap pageMap, DMWizardPageElement newElement) {
-			if (newElement.pageInsertionID == null) {
-				pageMap.put(newElement, new TreeSet());
-			} else {
-				String elementName = newElement.pageInsertionID;
-				DMWizardPageElement parentElement = getPageElement(elementName, pageMap);
-				insertExtPageElement(pageMap, parentElement, newElement);
-			}
-
-			newElement.getPageInsertionID();
-
-		}
-
-		private void insertExtPageElement(TreeMap pageMap, DMWizardPageElement parentElement, DMWizardPageElement newElement) {
-			if (parentElement == null) {
-				nonSyncedPageElementList.add(newElement);
-				return;
-			}
-			if (!parentElement.allowsExtendedPagesAfter()) {
-				Logger.getLogger().logError(WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WizardPageExtensionManager_UI_0, new Object[]{parentElement.getPageID()})); //$NON-NLS-1$
-				Logger.getLogger().logError(WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WizardPageExtensionManager_UI_1, new Object[]{newElement.getPageID()})); //$NON-NLS-1$
-				return;
-			}
-			TreeSet set = (TreeSet) pageMap.get(parentElement);
-			set.add(newElement);
-
-			if (newElement.allowsExtendedPagesAfter)
-				pageMap.put(newElement, new TreeSet());
-
-			if (nonSyncedPageElementList.contains(newElement))
-				nonSyncedPageElementList.remove(newElement);
-		}
-
-		private DMWizardPageElement getPageElement(String elementName, TreeMap map) {
-			Set keySet = map.keySet();
-			for (Iterator iter = keySet.iterator(); iter.hasNext();) {
-				DMWizardPageElement element = (DMWizardPageElement) iter.next();
-				if (element.getPageID().equals(elementName))
-					return element;
-			}
-			return null;
-
-		}
-
-		private TreeMap createPageMapEntry(DMWizardPageElement newElement) {
-			TreeMap pageMap = new TreeMap();
-			TreeSet pageExtensionSet = new TreeSet();
-			pageMap.put(newElement, pageExtensionSet);
-			return pageMap;
-
-		}
-
-	}
-
-	public boolean hasExtensionElements(String wizardID) {
-		TreeMap treeMap = (TreeMap) wizardPageElements.get(wizardID);
-		return treeMap.isEmpty();
-	}
-
-	public DMWizardPageElement[] getPageElements(String wizardID) {
-		TreeMap elementMap = (TreeMap) wizardPageElements.get(wizardID);
-		if (elementMap == null || elementMap.isEmpty()) {
-			return new DMWizardPageElement[0];
-		}
-		ArrayList alreadyVistedList = new ArrayList(elementMap.size());
-		Set allPageElementsList = elementMap.keySet();
-		ArrayList orderedPageList = new ArrayList(elementMap.size());
-
-		for (Iterator iter = allPageElementsList.iterator(); iter.hasNext();) {
-			DMWizardPageElement element = (DMWizardPageElement) iter.next();
-			if (alreadyVistedList.contains(element))
-				continue;
-			if (EnablementManager.INSTANCE.getIdentifier(element.getID(), null).isEnabled()) {
-				orderedPageList.add(element);
-				TreeSet treeSet = (TreeSet) elementMap.get(element);
-				if (treeSet != null && !treeSet.isEmpty())
-					flatenTreeSet(treeSet, allPageElementsList, alreadyVistedList, orderedPageList, elementMap);
-			}
-		}
-		return getPageArray(orderedPageList);
-
-	}
-
-	private DMWizardPageElement[] getPageArray(ArrayList orderedPageList) {
-		DMWizardPageElement[] pageElements = new DMWizardPageElement[orderedPageList.size()];
-		for (int i = 0; i < orderedPageList.size(); i++) {
-			pageElements[i] = (DMWizardPageElement) orderedPageList.get(i);
-		}
-		return pageElements;
-	}
-
-	private void flatenTreeSet(TreeSet treeSet, Set allPageElementsList, ArrayList alreadyVistedList, ArrayList orderedPageList, TreeMap elementMap) {
-		for (Iterator iter = treeSet.iterator(); iter.hasNext();) {
-			DMWizardPageElement element = (DMWizardPageElement) iter.next();
-			if (alreadyVistedList.contains(element)) {
-				Logger.getLogger().logError(WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WizardPageExtensionManager_UI_2, new Object[]{element.getPageID(), DMWizardPageElement.ATT_PAGE_INSERTION_ID})); //$NON-NLS-1$
-				return;
-			}
-			if (allPageElementsList.contains(element)) {
-				TreeSet set = (TreeSet) elementMap.get(element);
-				orderedPageList.add(element);
-				alreadyVistedList.add(element);
-				flatenTreeSet(set, allPageElementsList, alreadyVistedList, orderedPageList, elementMap);
-			} else {
-				orderedPageList.add(element);
-				alreadyVistedList.add(element);
-			}
-
-		}
-
-	}
-
-	// if child elements are read in before parent element. Do post read.
-	protected ArrayList listRemoveObjects;
-
-	private void postReadFromRegistry() {
-		listRemoveObjects = new ArrayList(nonSyncedPageElementList.size());
-		for (int i = 0; i < nonSyncedPageElementList.size(); i++) {
-			DMWizardPageElement element = (DMWizardPageElement) nonSyncedPageElementList.get(i);
-			TreeMap pageMap = (TreeMap) wizardPageElements.get(element.wizardID);
-			if (element.pageInsertionID == null) {
-				addToFirstAvialiable(pageMap, element);
-			} else if (reader != null && pageMap != null)
-				reader.insertPageElement(pageMap, element);
-		}
-		nonSyncedPageElementList.removeAll(listRemoveObjects);
-		if (!nonSyncedPageElementList.isEmpty())
-			logMissingClassError();
-		nonSyncedPageElementList.clear();
-
-	}
-
-	/**
-	 * @param pageMap
-	 * @param element
-	 */
-	private void addToFirstAvialiable(TreeMap pageMap, DMWizardPageElement newElement) {
-		boolean insertNotFound = true;
-		for (Iterator iter = pageMap.keySet().iterator(); iter.hasNext();) {
-			DMWizardPageElement element = (DMWizardPageElement) iter.next();
-			if (element.allowsExtendedPagesAfter) {
-				TreeSet set = (TreeSet) pageMap.get(element);
-				set.add(newElement);
-				listRemoveObjects.add(newElement);
-				return;
-			}
-		}
-		if (insertNotFound) {
-			Logger logger = Logger.getLogger();
-			logger.logError(WTPCommonUIResourceHandler.WizardPageExtensionManager_UI_3); //$NON-NLS-1$
-		}
-
-	}
-
-	private void logMissingClassError() {
-		Logger logger = Logger.getLogger();
-		for (int i = 0; i < nonSyncedPageElementList.size(); i++) {
-			DMWizardPageElement element = (DMWizardPageElement) nonSyncedPageElementList.get(i);
-			logger.logError(WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WizardPageExtensionManager_UI_4, new Object[]{element.pageInsertionID, element.getPageID(), element.pluginID})); //$NON-NLS-1$
-		}
-		nonSyncedPageElementList.clear();
-
-	}
-
-	/**
-	 * Gets the instance.
-	 * 
-	 * @return Returns a EjbPageExtensionRegistry
-	 */
-	public static DMWizardPageExtensionManager getInstance() {
-		if (instance == null) {
-			instance = new DMWizardPageExtensionManager();
-		}
-		return instance;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageFactoryElement.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageFactoryElement.java
deleted file mode 100644
index 17a766c..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageFactoryElement.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Oct 20, 2003
- *
- * To change the template for this generated file go to
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal.operation.extensionui;
-
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.internal.ConfigurationElementWrapper;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.IDMPageGroupHandler;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.IDMPageHandler;
-
-/**
- * @author schacher
- * 
- * To change the template for this generated type comment go to Window>Preferences>Java>Code
- * Generation>Code and Comments
- */
-public class DMWizardPageFactoryElement extends ConfigurationElementWrapper {
-
-	static final String ATT_CLASS_NAME = "className"; //$NON-NLS-1$
-
-	protected String className;
-	protected DMWizardExtensionFactory wizardPageFactory;
-	protected boolean isPageFactoryInitialized;
-	protected String pageGroupID;
-
-	/**
-	 * @param element
-	 */
-	public DMWizardPageFactoryElement(IConfigurationElement element, String pageGroupID) {
-		super(element);
-		className = element.getAttribute(ATT_CLASS_NAME);
-		this.pageGroupID = pageGroupID;
-	}
-
-	public IDMPageHandler createPageHandler(IDataModel dataModel) {
-		if (!isPageFactoryInitialized)
-			initPageFactory();
-		if (wizardPageFactory == null)
-			return null;
-
-		IDMPageHandler handler = wizardPageFactory.createPageHandler(dataModel, pageGroupID);
-		return handler;
-	}
-
-	public DataModelWizardPage[] createPageGroup(IDataModel dataModel) {
-		if (!isPageFactoryInitialized)
-			initPageFactory();
-
-		if (wizardPageFactory == null)
-			return null;
-
-		DataModelWizardPage[] pages = wizardPageFactory.createPageGroup(dataModel, pageGroupID);
-		
-		return pages;
-	}
-
-	public IDMPageGroupHandler createPageGroupHandler( IDataModel dataModel )
-	{
-	  if (!isPageFactoryInitialized) initPageFactory();
-		
-	  if( wizardPageFactory == null ) return null;
-	  
-	  return wizardPageFactory.createPageGroupHandler( dataModel, pageGroupID );
-	}
-		
-	private void initPageFactory() {
-		try {
-			wizardPageFactory = (DMWizardExtensionFactory) element.createExecutableExtension(ATT_CLASS_NAME);
-		} catch (CoreException e) {
-			Logger.getLogger().logError("Error getting page factory: " + className); //$NON-NLS-1$ 
-			Logger.getLogger().logError(e);
-		} finally {
-			isPageFactoryInitialized = true;
-		}
-	}
-
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DataModelWizardExtensionReader.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DataModelWizardExtensionReader.java
deleted file mode 100644
index 5ce7b73..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DataModelWizardExtensionReader.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.operation.extensionui;
-
-import java.util.HashMap;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jem.util.RegistryReader;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizard;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPUIPlugin;
-
-public class DataModelWizardExtensionReader extends RegistryReader {
-
-	private static final String EXTENSION = "DataModelWizardExtension"; //$NON-NLS-1$
-	private static final String ELEMENT = "DataModelWizard"; //$NON-NLS-1$
-	private static final String ATTRIBUTE_ID = "id"; //$NON-NLS-1$
-	private static final String ATTRIBUTE_CLASS = "class"; //$NON-NLS-1$
-
-	private HashMap extensions;
-
-	public DataModelWizardExtensionReader() {
-		super(WTPUIPlugin.PLUGIN_ID, EXTENSION);
-	}
-
-	public boolean readElement(IConfigurationElement element) {
-		if (!element.getName().equals(ELEMENT))
-			return false;
-		String id = element.getAttribute(ATTRIBUTE_ID);
-		if (null == id || id.trim().length() == 0) {
-			Logger.getLogger().logError(new RuntimeException("Extension:" + EXTENSION + " Element:" + ELEMENT + " is missing " + ATTRIBUTE_ID)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		}
-		String className = element.getAttribute(ATTRIBUTE_CLASS);
-		if (null == className || className.trim().length() == 0) {
-			Logger.getLogger().logError(new RuntimeException("Extension:" + EXTENSION + " Element:" + ELEMENT + " is missing " + ATTRIBUTE_CLASS)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		}
-		addExtension(id, element);
-		return true;
-	}
-
-	private void addExtension(String id, IConfigurationElement element) {
-		if (extensions.containsKey(id)) {
-			Logger.getLogger().logError(new RuntimeException("Duplicate " + ELEMENT + " " + ATTRIBUTE_ID + " " + id)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		}
-		extensions.put(id, element);
-	}
-
-	protected IConfigurationElement getExtension(String id) {
-		if (extensions == null) {
-			extensions = new HashMap();
-			readRegistry();
-		}
-		IConfigurationElement element = (IConfigurationElement) extensions.get(id);
-		if (null == element) {
-			throw new RuntimeException("Extension:" + EXTENSION + " Element:" + ELEMENT + " not found for " + ATTRIBUTE_ID + ": " + id); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-		}
-		return element;
-	}
-
-	public DataModelWizard getWizard(IDataModel dataModel) {
-		DataModelWizard wizard = null;
-		IConfigurationElement element = getExtension(dataModel.getID());
-
-		try {
-			wizard = (DataModelWizard) element.createExecutableExtension(ATTRIBUTE_CLASS);
-			wizard.setDataModel(dataModel);
-		} catch (CoreException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-
-		return wizard;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/ExtensibleViewRegistry.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/ExtensibleViewRegistry.java
deleted file mode 100644
index c6aee2c..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/ExtensibleViewRegistry.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.operation.extensionui;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jem.util.RegistryReader;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPUIPlugin;
-
-
-/**
- * @author mdelder
- */
-public class ExtensibleViewRegistry extends RegistryReader {
-
-	private static ExtensibleViewRegistry INSTANCE = null;
-	private Map extendedViewerMap = null;
-	private Map descriptorMap = null;
-
-	protected interface Elements {
-		public static final String EXTENDED_VIEWER = "extendedViewer"; //$NON-NLS-1$
-		public static final String VIEWER_ID = "viewerID"; //$NON-NLS-1$
-		public static final String PARENT_VIEWER_ID = "parentViewerID"; //$NON-NLS-1$
-		public static final String FACTORY_CLASS = "factoryClass"; //$NON-NLS-1$
-		public static final String ICON = "icon"; //$NON-NLS-1$
-		public static final String LABEL = "label"; //$NON-NLS-1$
-		public static final String FUNCTION_GROUP_ID = "functionGroupID"; //$NON-NLS-1$
-	}
-
-	/**
-	 *  
-	 */
-	private ExtensibleViewRegistry() {
-		super(WTPUIPlugin.PLUGIN_ID, WTPUIPlugin.EXTENDED_VIEWER_REGISTRY_EXTENSION_POINT);
-	}
-
-	public static ExtensibleViewRegistry getInstance() {
-		if (INSTANCE == null) {
-			INSTANCE = new ExtensibleViewRegistry();
-			INSTANCE.readRegistry();
-		}
-		return INSTANCE;
-	}
-
-	public Descriptor getDescriptor(String viewerID) {
-		return (Descriptor) getDescriptorMap().get(viewerID);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.registry.RegistryReader#readElement(org.eclipse.core.runtime.IConfigurationElement)
-	 */
-	public boolean readElement(IConfigurationElement element) {
-		if (element.getName().equals(Elements.EXTENDED_VIEWER)) {
-			Descriptor descriptor = new Descriptor(element);
-			getDescriptorMap().put(descriptor.getViewerID(), descriptor);
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @return Returns the extendedViewerMap.
-	 */
-	protected Map getExtendedViewerMap() {
-		if (extendedViewerMap == null)
-			extendedViewerMap = new HashMap();
-		return extendedViewerMap;
-	}
-
-	/**
-	 * @return Returns the descriptorMap.
-	 */
-	protected Map getDescriptorMap() {
-		if (descriptorMap == null)
-			descriptorMap = new HashMap();
-		return descriptorMap;
-	}
-
-	public class Descriptor {
-
-		private String viewerID = null;
-		private String parentViewerID = null;
-		private String factoryClass = null;
-		private String icon = null;
-		private String label = null;
-		private String functionGroupID = null;
-
-		private String toStringCache = null;
-		private IConfigurationElement element = null;
-
-		/**
-		 *  
-		 */
-		public Descriptor(IConfigurationElement element) {
-			this.element = element;
-
-			this.viewerID = this.element.getAttribute(ExtensibleViewRegistry.Elements.VIEWER_ID);
-			this.parentViewerID = this.element.getAttribute(ExtensibleViewRegistry.Elements.PARENT_VIEWER_ID);
-			this.factoryClass = this.element.getAttribute(ExtensibleViewRegistry.Elements.FACTORY_CLASS);
-			this.icon = this.element.getAttribute(ExtensibleViewRegistry.Elements.ICON);
-			this.label = this.element.getAttribute(ExtensibleViewRegistry.Elements.LABEL);
-			this.functionGroupID = this.element.getAttribute(ExtensibleViewRegistry.Elements.FUNCTION_GROUP_ID);
-		}
-
-		public IExtensibleViewFactory createFactoryInstance() {
-			IExtensibleViewFactory factoryInstance = null;
-			try {
-				factoryInstance = (IExtensibleViewFactory) this.element.createExecutableExtension(getFactoryClass());
-			} catch (CoreException e) {
-				WTPUIPlugin.getLogger().logError(e);
-			}
-			return factoryInstance;
-		}
-
-		/**
-		 * @return Returns the factoryClass.
-		 */
-		public String getFactoryClass() {
-			return factoryClass;
-		}
-
-		/**
-		 * @return Returns the functionGroupID.
-		 */
-		public String getFunctionGroupID() {
-			return functionGroupID;
-		}
-
-		/**
-		 * @return Returns the icon.
-		 */
-		public String getIcon() {
-			return icon;
-		}
-
-		/**
-		 * @return Returns the label.
-		 */
-		public String getLabel() {
-			return label;
-		}
-
-		/**
-		 * @return Returns the parentViewerID.
-		 */
-		public String getParentViewerID() {
-			return parentViewerID;
-		}
-
-		/**
-		 * @return Returns the viewerID.
-		 */
-		public String getViewerID() {
-			return viewerID;
-		}
-
-		public String toString() {
-			if (toStringCache == null)
-				toStringCache = "ExtensibleViewRegistry.Info [viewerID=\"" + getViewerID() + "\",parentViewerID=\"" + getParentViewerID() + "\",factoryClass=" + getFactoryClass() + "\",functionGroupID=\"" + getFunctionGroupID() + "\"]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-			return toStringCache;
-		}
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/IExtensibleViewFactory.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/IExtensibleViewFactory.java
deleted file mode 100644
index 261938b..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/IExtensibleViewFactory.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-
-package org.eclipse.wst.common.frameworks.internal.operation.extensionui;
-
-/**
- * @author mdelder
- */
-public interface IExtensibleViewFactory {
-
-
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/IOperationNode.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/IOperationNode.java
deleted file mode 100644
index 747b5ca..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/IOperationNode.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on May 5, 2004
- * 
- * TODO To change the template for this generated file go to Window -
- * Preferences - Java - Code Generation - Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal.operation.extensionui;
-
-/**
- * @author mdelder
- * 
- * TODO To change the template for this generated type comment go to Window - Preferences - Java -
- * Code Generation - Code and Comments
- */
-public interface IOperationNode {
-
-	public IOperationNode[] getChildren();
-
-	public boolean isChecked();
-
-	/**
-	 * Same as calling setChecked(checked, true)
-	 * 
-	 * @param checked
-	 */
-	public void setChecked(boolean checked);
-
-	public String getName();
-
-	public String getDescription();
-
-	public IOperationNode getParent();
-
-	/**
-	 * @return
-	 */
-	public boolean isAlwaysExecute();
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/AbstractWTPUIPlugin.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/AbstractWTPUIPlugin.java
deleted file mode 100644
index 583f298..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/AbstractWTPUIPlugin.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Dec 10, 2003
- * 
- * To change the template for this generated file go to Window - Preferences - Java - Code
- * Generation - Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-import java.util.ResourceBundle;
-
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jem.util.logger.proxyrender.DefaultPluginTraceRenderer;
-import org.eclipse.jem.util.logger.proxyrender.IMsgLogger;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-public abstract class AbstractWTPUIPlugin extends AbstractUIPlugin implements IMsgLogger {
-	protected static Logger logger = null;
-	public ResourceBundle resourceBundle;
-	protected static AbstractWTPUIPlugin instance = null; 
-
-	/**
-	 * @param descriptor
-	 */
-	public AbstractWTPUIPlugin() {
-		super();
-		instance = this;
-	}
-
-	public Logger getMsgLogger() {
-		if (logger == null) {
-			logger = Logger.getLogger(getPluginID());
-			setRenderer(logger);
-		}
-		return logger;
-	}
-
-	public abstract String getPluginID();
-
-	/**
-	 * @param aLogger
-	 */
-	protected void setRenderer(Logger aLogger) {
-		new DefaultPluginTraceRenderer(aLogger);
-	}
-	
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.Plugin#startup()
-	 */
-	public void start(BundleContext context) throws Exception  {
-		super.start(context);
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/ClosableWizardDialog.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/ClosableWizardDialog.java
deleted file mode 100644
index 7316c8b..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/ClosableWizardDialog.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Mar 24, 2004
- *
- * To change the template for this generated file go to
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-import org.eclipse.jface.wizard.IWizard;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @author DABERG
- * 
- * To change the template for this generated type comment go to Window>Preferences>Java>Code
- * Generation>Code and Comments
- */
-public class ClosableWizardDialog extends WizardDialog {
-	/**
-	 * @param parentShell
-	 * @param newWizard
-	 */
-	public ClosableWizardDialog(Shell parentShell, IWizard newWizard) {
-		super(parentShell, newWizard);
-	}
-
-	public void finishAndClose() {
-		super.finishPressed();
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/DMPageGroupElementImpl.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/DMPageGroupElementImpl.java
deleted file mode 100644
index 22caa6d..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/DMPageGroupElementImpl.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.IDMPageGroup;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.IDMPageGroupHandler;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.IDMPageHandler;
-import org.eclipse.wst.common.frameworks.internal.operation.extensionui.DMWizardPageElement;
-
-public class DMPageGroupElementImpl implements IDMPageGroup {
-	private DMWizardPageElement pageElement;
-
-	public DMPageGroupElementImpl(IConfigurationElement element) {
-		pageElement = new DMWizardPageElement(element);
-	}
-
-	public boolean getAllowsExtendedPages() {
-		return pageElement.allowsExtendedPagesAfter();
-	}
-
-	public String getRequiredDataOperationToRun() {
-		return pageElement.getRequiresDataOperationId();
-	}
-
-	public Set getDataModelIDs() {
-		return pageElement.getDataModelIDs();
-	}
-
-	public IDMPageGroupHandler getPageGroupHandler(IDataModel dataModel) {
-		return pageElement.createPageGroupHandler(dataModel);
-	}
-
-	public List getPages(IDataModel dataModel){
-		return Arrays.asList(pageElement.createPageGroup(dataModel));
-	}
-	
-	public IDMPageHandler getPageHandler(IDataModel dataModel) {
-		return pageElement.createPageHandler(dataModel);
-	}
-
-	public String getPageGroupID() {
-		return pageElement.getPageID();
-	}
-
-	public String getPageGroupInsertionID() {
-		return pageElement.getPageInsertionID();
-	}
-
-	public String getWizardID() {
-		return pageElement.getWizardID();
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/DisplayUtility.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/DisplayUtility.java
deleted file mode 100644
index 647f58e..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/DisplayUtility.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Apr 19, 2004
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mdelder
- */
-public class DisplayUtility {
-
-	public static void asyncExec(Runnable runnable) {
-
-		Display d = Display.getCurrent();
-		if (d == null)
-			Display.getDefault().asyncExec(runnable);
-		else
-			runnable.run();
-
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/ErrorDialog.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/ErrorDialog.java
deleted file mode 100644
index 6c24426..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/ErrorDialog.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.PrintStream;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.SWTError;
-import org.eclipse.swt.SWTException;
-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.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;
-
-/**
- * Added a Details button to the MessageDialog to show the exception stack trace.
- * 
- * Borrowed from an eclipse InternalErrorDialog
- */
-public class ErrorDialog extends MessageDialog {
-	protected static final String[] LABELS_OK = {IDialogConstants.OK_LABEL};
-	protected static final String[] LABELS_OK_CANCEL = {IDialogConstants.OK_LABEL, IDialogConstants.CANCEL_LABEL};
-	protected static final String[] LABELS_OK_DETAILS = {IDialogConstants.OK_LABEL, IDialogConstants.SHOW_DETAILS_LABEL};
-	protected static final String[] LABELS_OK_CANCEL_DETAILS = {IDialogConstants.OK_LABEL, IDialogConstants.CANCEL_LABEL, IDialogConstants.SHOW_DETAILS_LABEL};
-	private Throwable detail;
-	private int detailButtonID = -1;
-	private Text text;
-	private String message;
-	//Workaround. SWT does not seem to set the default button if
-	//there is not control with focus. Bug: 14668
-	private int defaultButtonIndex = 0;
-	/**
-	 * Size of the text in lines.
-	 */
-	private static final int TEXT_LINE_COUNT = 15;
-
-	public ErrorDialog(Shell parentShell, String dialogTitle, Image dialogTitleImage, String dialogMessage, Throwable detail, int dialogImageType, String[] dialogButtonLabels, int defaultIndex) {
-		super(parentShell, dialogTitle, dialogTitleImage, dialogMessage, dialogImageType, dialogButtonLabels, defaultIndex);
-		defaultButtonIndex = defaultIndex;
-		this.detail = detail;
-		message = dialogMessage;
-		setShellStyle(getShellStyle() | SWT.APPLICATION_MODAL | SWT.RESIZE);
-	}
-
-	//Workaround. SWT does not seem to set rigth the default button if
-	//there is not control with focus. Bug: 14668
-	public int open() {
-		create();
-		Button b = getButton(defaultButtonIndex);
-		b.setFocus();
-		b.getShell().setDefaultButton(b);
-		return super.open();
-	}
-
-	/**
-	 * Set the detail button;
-	 */
-	public void setDetailButton(int index) {
-		detailButtonID = index;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Dialog.
-	 */
-	protected void buttonPressed(int buttonId) {
-		if (buttonId == detailButtonID) {
-			toggleDetailsArea();
-		} else {
-			setReturnCode(buttonId);
-			close();
-		}
-	}
-
-	/**
-	 * Toggles the unfolding of the details area. This is triggered by the user pressing the details
-	 * button.
-	 */
-	private void toggleDetailsArea() {
-		Point windowSize = getShell().getSize();
-		Point oldSize = getContents().computeSize(SWT.DEFAULT, SWT.DEFAULT);
-		if (text != null) {
-			text.dispose();
-			text = null;
-			getButton(detailButtonID).setText(IDialogConstants.SHOW_DETAILS_LABEL);
-		} else {
-			createDropDownText((Composite) getContents());
-			getButton(detailButtonID).setText(IDialogConstants.HIDE_DETAILS_LABEL);
-		}
-		Point newSize = getContents().computeSize(SWT.DEFAULT, SWT.DEFAULT);
-		getShell().setSize(new Point(windowSize.x, windowSize.y + (newSize.y - oldSize.y)));
-	}
-
-	/**
-	 * Create this dialog's drop-down list component.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @return the drop-down list component
-	 */
-	protected void createDropDownText(Composite parent) {
-		// create the list
-		text = new Text(parent, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
-		// print the stacktrace in the text field
-		try {
-			ByteArrayOutputStream baos = new ByteArrayOutputStream();
-			PrintStream ps = new PrintStream(baos);
-			detail.printStackTrace(ps);
-			if ((detail instanceof SWTError) && (((SWTError) detail).throwable != null)) {
-				ps.println("\n*** Stack trace of contained exception ***"); //$NON-NLS-1$
-				((SWTError) detail).throwable.printStackTrace(ps);
-			} else if ((detail instanceof SWTException) && (((SWTException) detail).throwable != null)) {
-				ps.println("\n*** Stack trace of contained exception ***"); //$NON-NLS-1$
-				((SWTException) detail).throwable.printStackTrace(ps);
-			}
-			ps.flush();
-			baos.flush();
-			text.setText(baos.toString());
-		} catch (IOException e) {
-		}
-		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_VERTICAL);
-		data.heightHint = text.getLineHeight() * TEXT_LINE_COUNT;
-		text.setLayoutData(data);
-	}
-
-	public static boolean openError(Shell parent, String title, String message, Throwable detail, int defaultIndex, boolean showCancel) {
-		String[] labels;
-		if (detail == null)
-			labels = showCancel ? LABELS_OK_CANCEL : LABELS_OK;
-		else
-			labels = showCancel ? LABELS_OK_CANCEL_DETAILS : LABELS_OK_DETAILS;
-		ErrorDialog dialog = new ErrorDialog(parent, title, null, // accept
-					// the
-					// default
-					// window
-					// icon
-					message, detail, ERROR, labels, defaultIndex);
-		if (detail != null)
-			dialog.setDetailButton(labels.length - 1);
-		return dialog.open() == 0;
-	}
-
-	protected Control createDialogArea(Composite parent) {
-		// create a composite with standard margins and spacing
-		Composite composite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
-		layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
-		layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
-		layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
-		composite.setLayout(layout);
-		composite.setLayoutData(new GridData(GridData.FILL_BOTH));
-		composite.setFont(parent.getFont());
-		((GridLayout) composite.getLayout()).numColumns = 2;
-		// create image
-		Image image = composite.getDisplay().getSystemImage(SWT.ICON_ERROR);
-		if (image != null) {
-			Label label = new Label(composite, 0);
-			image.setBackground(label.getBackground());
-			label.setImage(image);
-			label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER | GridData.VERTICAL_ALIGN_BEGINNING));
-		}
-		// create message
-		if (message != null) {
-			Label label = new Label(composite, SWT.WRAP);
-			label.setText(message);
-			GridData data = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_CENTER);
-			data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH);
-			label.setLayoutData(data);
-			label.setFont(parent.getFont());
-		}
-		return composite;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/ExecutionListener.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/ExecutionListener.java
deleted file mode 100644
index 2cc778a..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/ExecutionListener.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 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
- **************************************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-import org.eclipse.core.runtime.IStatus;
-
-public interface ExecutionListener
-{
-  public IStatus execute();
-  
-  public void undoExecute();
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/GenericWizardNode.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/GenericWizardNode.java
deleted file mode 100644
index 60769c2..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/GenericWizardNode.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 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
- *******************************************************************************/
-
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-import org.eclipse.jface.wizard.IWizard;
-import org.eclipse.jface.wizard.IWizardNode;
-import org.eclipse.swt.graphics.Point;
-
-/**
- * @version 1.0
- * @author
- */
-public abstract class GenericWizardNode implements IWizardNode {
-
-	protected IWizard wizard;
-
-	/**
-	 * Constructor for GenericWizardNode.
-	 */
-	public GenericWizardNode() {
-		super();
-	}
-
-	/*
-	 * @see IWizardNode#dispose()
-	 */
-	public void dispose() {
-		if (wizard != null)
-			wizard.dispose();
-	}
-
-	/*
-	 * @see IWizardNode#getContents()
-	 */
-	public Point getContents() {
-		return null;
-	}
-
-	public final IWizard getWizard() {
-		if (wizard == null)
-			wizard = createWizard();
-		return wizard;
-	}
-
-	/**
-	 * Subclasses must override to create the wizard
-	 */
-	protected abstract IWizard createWizard();
-
-	/*
-	 * @see IWizardNode#isContentCreated()
-	 */
-	public boolean isContentCreated() {
-		return wizard != null;
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.IWizardNode#getExtent()
-	 */
-	public Point getExtent() {
-		return null;
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/ListMessageDialog.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/ListMessageDialog.java
deleted file mode 100644
index aed38af..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/ListMessageDialog.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Aug 5, 2004
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-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.List;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @author dfholt
- * 
- * TODO To change the template for this generated type comment go to Window - Preferences - Java -
- * Code Generation - Code and Comments
- */
-public class ListMessageDialog extends MessageDialog {
-	protected String[] listItems;
-	protected List list;
-
-	/**
-	 * EJBSelectiveImportDialog constructor comment.
-	 * 
-	 * @param parentShell
-	 *            org.eclipse.swt.widgets.Shell
-	 * @param dialogTitle
-	 *            java.lang.String
-	 * @param dialogTitleImage
-	 *            org.eclipse.swt.graphics.Image
-	 * @param dialogMessage
-	 *            java.lang.String
-	 * @param dialogImageType
-	 *            int
-	 * @param dialogButtonLabels
-	 *            java.lang.String[]
-	 * @param defaultIndex
-	 *            int
-	 */
-	public ListMessageDialog(org.eclipse.swt.widgets.Shell parentShell, String dialogTitle, org.eclipse.swt.graphics.Image dialogTitleImage, String dialogMessage, int dialogImageType, java.lang.String[] dialogButtonLabels, int defaultIndex) {
-		super(parentShell, dialogTitle, dialogTitleImage, dialogMessage, dialogImageType, dialogButtonLabels, defaultIndex);
-	}
-
-	/**
-	 * ListMessageDialog constructor comment.
-	 * 
-	 * @param parentShell
-	 *            org.eclipse.swt.widgets.Shell
-	 * @param dialogTitle
-	 *            java.lang.String
-	 * @param dialogTitleImage
-	 *            org.eclipse.swt.graphics.Image
-	 * @param dialogMessage
-	 *            java.lang.String
-	 * @param dialogImageType
-	 *            int
-	 * @param dialogButtonLabels
-	 *            java.lang.String[]
-	 * @param defaultIndex
-	 *            int
-	 */
-	public ListMessageDialog(org.eclipse.swt.widgets.Shell parentShell, String dialogTitle, org.eclipse.swt.graphics.Image dialogTitleImage, String dialogMessage, int dialogImageType, java.lang.String[] dialogButtonLabels, int defaultIndex, String[] names) {
-		super(parentShell, dialogTitle, dialogTitleImage, dialogMessage, dialogImageType, dialogButtonLabels, defaultIndex);
-		listItems = names;
-	}
-
-	/**
-	 * Creates and returns the contents of an area of the dialog which appears below the message and
-	 * above the button bar.
-	 * <p>
-	 * The default implementation of this framework method returns <code>null</code>. Subclasses
-	 * may override.
-	 * </p>
-	 * 
-	 * @param the
-	 *            parent composite to contain the custom area
-	 * @return the custom area control, or <code>null</code>
-	 */
-	protected Control createCustomArea(Composite parent) {
-
-		Composite composite = new Composite(parent, 0);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 1;
-		layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
-		layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
-		layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
-		composite.setLayout(layout);
-		composite.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		if (listItems != null) {
-			list = new List(composite, SWT.BORDER);
-			GridData data = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_CENTER);
-			list.setLayoutData(data);
-			list.setItems(listItems);
-		}
-
-		return composite;
-
-	}
-
-	/**
-	 * Convenience method to open a simple confirm (OK/Cancel) dialog.
-	 * 
-	 * @param parent
-	 *            the parent shell of the dialog, or <code>null</code> if none
-	 * @param title
-	 *            the dialog's title, or <code>null</code> if none
-	 * @param message
-	 *            the message
-	 * @return <code>true</code> if the user presses the OK button, <code>false</code> otherwise
-	 */
-	public static boolean openConfirm(Shell parent, String title, String message, String[] items) {
-		ListMessageDialog dialog = new ListMessageDialog(parent, title, null, // accept the default
-					// window icon
-					message, QUESTION, new String[]{IDialogConstants.OK_LABEL, IDialogConstants.CANCEL_LABEL}, 0, items); // OK
-		// is
-		// the
-		// default
-		return dialog.open() == 0;
-	}
-
-	/**
-	 * Convenience method to open a standard error dialog.
-	 * 
-	 * @param parent
-	 *            the parent shell of the dialog, or <code>null</code> if none
-	 * @param title
-	 *            the dialog's title, or <code>null</code> if none
-	 * @param message
-	 *            the message
-	 */
-	public static void openError(Shell parent, String title, String message, String[] items) {
-		ListMessageDialog dialog = new ListMessageDialog(parent, title, null, // accept the default
-					// window icon
-					message, ERROR, new String[]{IDialogConstants.OK_LABEL}, 0, items); // ok is the
-		// default
-		dialog.open();
-		return;
-	}
-
-	/**
-	 * Convenience method to open a standard information dialog.
-	 * 
-	 * @param parent
-	 *            the parent shell of the dialog, or <code>null</code> if none
-	 * @param title
-	 *            the dialog's title, or <code>null</code> if none
-	 * @param message
-	 *            the message
-	 */
-	public static void openInformation(Shell parent, String title, String message, String[] items) {
-		ListMessageDialog dialog = new ListMessageDialog(parent, title, null, // accept the default
-					// window icon
-					message, INFORMATION, new String[]{IDialogConstants.OK_LABEL}, 0, items);
-		// ok is the default
-		dialog.open();
-		return;
-	}
-
-	/**
-	 * Convenience method to open a simple Yes/No question dialog.
-	 * 
-	 * @param parent
-	 *            the parent shell of the dialog, or <code>null</code> if none
-	 * @param title
-	 *            the dialog's title, or <code>null</code> if none
-	 * @param message
-	 *            the message
-	 * @return <code>true</code> if the user presses the OK button, <code>false</code> otherwise
-	 */
-	public static boolean openQuestion(Shell parent, String title, String message, String[] items) {
-		ListMessageDialog dialog = new ListMessageDialog(parent, title, null, // accept the default
-					// window icon
-					message, QUESTION, new String[]{IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL}, 0, items); // yes
-		// is
-		// the
-		// default
-		return dialog.open() == 0;
-	}
-
-	/**
-	 * Convenience method to open a standard warning dialog.
-	 * 
-	 * @param parent
-	 *            the parent shell of the dialog, or <code>null</code> if none
-	 * @param title
-	 *            the dialog's title, or <code>null</code> if none
-	 * @param message
-	 *            the message
-	 */
-	public static void openWarning(Shell parent, String title, String message, String[] items) {
-		ListMessageDialog dialog = new ListMessageDialog(parent, title, null, // accept the default
-					// window icon
-					message, WARNING, new String[]{IDialogConstants.OK_LABEL}, 0, items); // ok is
-		// the
-		// default
-		dialog.open();
-		return;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/ListenerList.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/ListenerList.java
deleted file mode 100644
index db72ea5..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/ListenerList.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-import java.awt.event.ActionListener;
-
-public class ListenerList {
-	private final static ActionListener[] NULL_ARRAY = new ActionListener[0];
-	protected transient ActionListener[] listenerList = NULL_ARRAY;
-
-	/**
-	 * Add the listener as a listener of the specified type.
-	 * 
-	 * @param t
-	 *            the type of the listener to be added
-	 * @param l
-	 *            the listener to be added
-	 */
-	public synchronized void add(ActionListener l) {
-		if (l == null)
-			return;
-		if (listenerList == NULL_ARRAY) {
-			// if this is the first listener added,
-			// initialize the lists
-			listenerList = new ActionListener[]{l};
-		} else {
-			// Otherwise copy the array and add the new listener
-			int i = listenerList.length;
-			ActionListener[] tmp = new ActionListener[i + 1];
-			System.arraycopy(listenerList, 0, tmp, 0, i);
-
-			tmp[i + 1] = l;
-
-			listenerList = tmp;
-		}
-	}
-
-	/**
-	 * Return the total number of listeners for this listenerlist
-	 */
-	public int getListenerCount() {
-		return listenerList.length;
-	}
-
-	public ActionListener[] getListenerList() {
-		return listenerList;
-	}
-
-	public synchronized void remove(ActionListener l) {
-		if (l == null)
-			return;
-		int index = -1;
-		for (int i = listenerList.length - 1; i >= 0; i -= 1) {
-			if (listenerList[i].equals(l)) {
-				index = i;
-				break;
-			}
-		}
-		if (index != -1) {
-			ActionListener[] tmp = new ActionListener[listenerList.length - 1];
-			// Copy the list up to index
-			System.arraycopy(listenerList, 0, tmp, 0, index);
-			// Copy from two past the index, up to
-			// the end of tmp (which is two elements
-			// shorter than the old list)
-			if (index < tmp.length)
-				System.arraycopy(listenerList, index + 1, tmp, index, tmp.length - index);
-			// set the listener array to the new array or null
-			listenerList = (tmp.length == 0) ? NULL_ARRAY : tmp;
-		}
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/NewProjectGroup.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/NewProjectGroup.java
deleted file mode 100644
index cac9244..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/NewProjectGroup.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-import java.io.File;
-
-import org.eclipse.core.runtime.Path;
-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.graphics.Font;
-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.DirectoryDialog;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelEvent;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelListener;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelSynchHelper;
-import org.eclipse.wst.common.frameworks.internal.operations.IProjectCreationPropertiesNew;
-
-public class NewProjectGroup implements IProjectCreationPropertiesNew {
-	private IDataModel model;
-	public Text projectNameField = null;
-	protected Text locationPathField = null;
-	protected Button browseButton = null;
-	// constants
-	private static final int SIZING_TEXT_FIELD_WIDTH = 305;
-	// default values
-	private String defProjectNameLabel = WTPCommonUIResourceHandler.Name_; //$NON-NLS-1$
-	private String defBrowseButtonLabel = WTPCommonUIResourceHandler.Browse_;//$NON-NLS-1$
-	private static final String defDirDialogLabel = "Directory"; //$NON-NLS-1$
-
-	private DataModelSynchHelper synchHelper;
-
-	public NewProjectGroup(Composite parent, IDataModel model) {
-		this.model = model;
-		synchHelper = new DataModelSynchHelper(model);
-		buildComposites(parent);
-	}
-
-	/**
-	 * Create the controls within this composite
-	 */
-	public void buildComposites(Composite parent) {
-		createProjectNameGroup(parent);
-		createProjectLocationGroup(parent);
-		projectNameField.setFocus();
-	}
-
-	private final void createProjectNameGroup(Composite parent) {
-		Font font = parent.getFont();
-		// project specification group
-		Composite projectGroup = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		projectGroup.setLayout(layout);
-		projectGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		// new project label
-		Label projectLabel = new Label(projectGroup, SWT.NONE);
-		projectLabel.setFont(font);
-		projectLabel.setText(defProjectNameLabel);
-
-		// new project name entry field
-		projectNameField = new Text(projectGroup, SWT.BORDER);
-		GridData data = new GridData(GridData.FILL_HORIZONTAL);
-		data.widthHint = SIZING_TEXT_FIELD_WIDTH;
-		projectNameField.setLayoutData(data);
-		projectNameField.setFont(font);
-		synchHelper.synchText(projectNameField, PROJECT_NAME, new Control[]{projectLabel});
-	}
-
-	/**
-	 * Creates the project location specification controls.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 */
-	private final void createProjectLocationGroup(Composite parent) {
-
-		Font font = parent.getFont();
-		// project specification group
-		Group projectGroup = new Group(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 3;
-		projectGroup.setLayout(layout);
-		projectGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		projectGroup.setFont(font);
-		projectGroup.setText(IDEWorkbenchMessages.WizardNewProjectCreationPage_projectContentsGroupLabel);
-
-		final Button useDefaultsButton = new Button(projectGroup, SWT.CHECK | SWT.RIGHT);
-		useDefaultsButton.setText(IDEWorkbenchMessages.WizardNewProjectCreationPage_useDefaultLabel);
-		useDefaultsButton.setFont(font);
-		synchHelper.synchCheckbox(useDefaultsButton, USE_DEFAULT_LOCATION, null);
-
-		GridData buttonData = new GridData();
-		buttonData.horizontalSpan = 3;
-		useDefaultsButton.setLayoutData(buttonData);
-
-		createUserSpecifiedProjectLocationGroup(projectGroup);
-	}
-
-	private void createUserSpecifiedProjectLocationGroup(Composite projectGroup) {
-		Font font = projectGroup.getFont();
-		// location label
-		final Label locationLabel = new Label(projectGroup, SWT.NONE);
-		locationLabel.setFont(font);
-		locationLabel.setText(IDEWorkbenchMessages.WizardNewProjectCreationPage_locationLabel);
-
-		// project location entry field
-		locationPathField = new Text(projectGroup, SWT.BORDER);
-		GridData data = new GridData(GridData.FILL_HORIZONTAL);
-		data.widthHint = SIZING_TEXT_FIELD_WIDTH;
-		locationPathField.setLayoutData(data);
-		locationPathField.setFont(font);
-
-		// browse button
-		browseButton = new Button(projectGroup, SWT.PUSH);
-		browseButton.setFont(font);
-		browseButton.setText(defBrowseButtonLabel);
-		browseButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				handleLocationBrowseButtonPressed();
-			}
-		});
-
-		final IDataModel localModel = model;
-
-		class LocationListener implements ModifyListener, IDataModelListener {
-			private boolean typing = false;
-
-			public void modifyText(ModifyEvent e) {
-				if (!localModel.getBooleanProperty(USE_DEFAULT_LOCATION)) {
-					try {
-						typing = true;
-						localModel.setProperty(USER_DEFINED_LOCATION, locationPathField.getText());
-					} finally {
-						typing = false;
-					}
-				}
-			}
-
-			public void propertyChanged(DataModelEvent event) {
-				boolean useDefault = localModel.getBooleanProperty(USE_DEFAULT_LOCATION);
-				if (USE_DEFAULT_LOCATION.equals(event.getPropertyName())) {
-					locationLabel.setEnabled(!useDefault);
-					locationPathField.setEnabled(!useDefault);
-					browseButton.setEnabled(!useDefault);
-					if (useDefault) {
-						locationPathField.setText(localModel.getStringProperty(DEFAULT_LOCATION));
-					} else {
-						locationPathField.setText(localModel.getStringProperty(USER_DEFINED_LOCATION));
-					}
-				} else if (!typing) {
-					if ((useDefault && DEFAULT_LOCATION.equals(event.getPropertyName())) || (!useDefault && USER_DEFINED_LOCATION.equals(event.getPropertyName()))) {
-						locationPathField.setText((String) event.getProperty());
-					}
-				}
-			}
-		}
-
-		LocationListener listener = new LocationListener();
-
-		listener.propertyChanged(new DataModelEvent(model, USE_DEFAULT_LOCATION, IDataModel.VALUE_CHG));
-
-		locationPathField.addModifyListener(listener);
-		model.addListener(listener);
-	}
-
-	/**
-	 * Open an appropriate directory browser
-	 */
-	protected void handleLocationBrowseButtonPressed() {
-		DirectoryDialog dialog = new DirectoryDialog(locationPathField.getShell());
-		dialog.setMessage(defDirDialogLabel);
-		String dirName = model.getStringProperty(USER_DEFINED_LOCATION);
-		if (dirName.trim().length() == 0) {
-			dirName = new Path(model.getStringProperty(DEFAULT_LOCATION)).removeLastSegments(1).toOSString();
-		}
-
-		if ((dirName != null) && (dirName.length() != 0)) {
-			File path = new File(dirName);
-			if (path.exists()) {
-				dialog.setFilterPath(dirName);
-			}
-		}
-		String selectedDirectory = dialog.open();
-		if (selectedDirectory != null) {
-			model.setProperty(USER_DEFINED_LOCATION, selectedDirectory);
-		}
-	}
-
-	public void dispose() {
-		model.removeListener(synchHelper);
-		synchHelper.dispose();
-		model = null;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/OverlayIcon.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/OverlayIcon.java
deleted file mode 100644
index 8ff7b0a..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/OverlayIcon.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.Point;
-
-public class OverlayIcon extends org.eclipse.jface.resource.CompositeImageDescriptor {
-	// //$NON-NLS-1$
-	static final int DEFAULT_WIDTH = 16;
-	static final int DEFAULT_HEIGHT = 16;
-	private Point fSize = null;
-	private ImageDescriptor fBase;
-	private ImageDescriptor fOverlays[][];
-
-	public OverlayIcon(ImageDescriptor base, ImageDescriptor[][] overlays) {
-		fBase = base;
-		if (fBase == null)
-			fBase = ImageDescriptor.getMissingImageDescriptor();
-		fOverlays = overlays;
-		fSize = new Point(DEFAULT_WIDTH, DEFAULT_HEIGHT);
-	}
-
-	public OverlayIcon(ImageDescriptor base, ImageDescriptor[][] overlays, Point size) {
-		fBase = base;
-		if (fBase == null)
-			fBase = ImageDescriptor.getMissingImageDescriptor();
-		fOverlays = overlays;
-		fSize = size;
-	}
-
-	protected void drawBottomLeft(ImageDescriptor[] overlays) {
-		if (overlays == null)
-			return;
-		int length = overlays.length;
-		int x = 0;
-		for (int i = 0; i < 3; i++) {
-			if (i < length && overlays[i] != null) {
-				ImageData id = overlays[i].getImageData();
-				drawImage(id, x, getSize().y - id.height);
-				x += id.width;
-			}
-		}
-	}
-
-	protected void drawBottomRight(ImageDescriptor[] overlays) {
-		if (overlays == null)
-			return;
-		int length = overlays.length;
-		int x = getSize().x;
-		for (int i = 2; i >= 0; i--) {
-			if (i < length && overlays[i] != null) {
-				ImageData id = overlays[i].getImageData();
-				x -= id.width;
-				drawImage(id, x, getSize().y - id.height);
-			}
-		}
-	}
-
-	protected void drawCompositeImage(int width, int height) {
-		ImageData bg = fBase.getImageData();
-		drawImage(bg, 0, 0);
-
-		if (fOverlays != null) {
-			if (fOverlays.length > 0)
-				drawTopRight(fOverlays[0]);
-
-			if (fOverlays.length > 1)
-				drawBottomRight(fOverlays[1]);
-
-			if (fOverlays.length > 2)
-				drawBottomLeft(fOverlays[2]);
-
-			if (fOverlays.length > 3)
-				drawTopLeft(fOverlays[3]);
-		}
-	}
-
-	protected void drawTopLeft(ImageDescriptor[] overlays) {
-		if (overlays == null)
-			return;
-		int length = overlays.length;
-		int x = 0;
-		for (int i = 0; i < 3; i++) {
-			if (i < length && overlays[i] != null) {
-				ImageData id = overlays[i].getImageData();
-				drawImage(id, x, 0);
-				x += id.width;
-			}
-		}
-	}
-
-	protected void drawTopRight(ImageDescriptor[] overlays) {
-		if (overlays == null)
-			return;
-		int length = overlays.length;
-		int x = getSize().x;
-		for (int i = 2; i >= 0; i--) {
-			if (i < length && overlays[i] != null) {
-				ImageData id = overlays[i].getImageData();
-				x -= id.width;
-				drawImage(id, x, 0);
-			}
-		}
-	}
-
-	protected Point getSize() {
-		return fSize;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/PageGroupManager.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/PageGroupManager.java
deleted file mode 100644
index b754528..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/PageGroupManager.java
+++ /dev/null
@@ -1,584 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 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
- **************************************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.Stack;
-import java.util.Vector;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
-import org.eclipse.wst.common.frameworks.internal.DataModelManager;
-import org.eclipse.wst.common.frameworks.internal.OperationListener;
-import org.eclipse.wst.common.frameworks.internal.OperationManager;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.IDMPageGroup;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.IDMPageGroupHandler;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.IDMPageHandler;
-import org.eclipse.wst.common.frameworks.internal.operation.extensionui.CommonUIPluginConstants;
-
-public class PageGroupManager {
-	private IDMPageGroup rootPageGroup;
-	private OperationManager operationManager;
-	private DataModelManager dataModelManager;
-	private HashMap groupTable;
-	private HashSet operationsRun;
-	private Stack pageGroupStack;
-	private IDataModel dataModel;
-	private StackEntry savedTopEntry;
-	private int savedStackSize;
-
-	private IConfigurationElement[] elements;
-
-	private final String ELEMENT_PAGE_GROUP = "wizardPageGroup"; //$NON-NLS-1$
-
-	public PageGroupManager(OperationManager operationManager, DataModelManager dataModelManager, IDMPageGroup rootPageGroup) {
-		this.operationManager = operationManager;
-		this.dataModelManager = dataModelManager;
-		dataModel = this.dataModelManager.getDataModel();
-		groupTable = new HashMap();
-		operationsRun = new HashSet();
-		pageGroupStack = new Stack();
-		this.rootPageGroup = rootPageGroup;
-
-
-		PageGroupEntry rootPageGroupEntry = new PageGroupEntry(rootPageGroup);
-		IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(CommonUIPluginConstants.PLUGIN_ID, ELEMENT_PAGE_GROUP);
-		elements = point.getConfigurationElements();
-		groupTable.put(this.rootPageGroup.getPageGroupID(), rootPageGroupEntry);
-
-		if (this.rootPageGroup.getAllowsExtendedPages()) {
-			// Find all the page groups that follow this root page group.
-			loadExtendedPages(rootPageGroup);
-		}
-
-		this.operationManager.setUndoExecuteListener(new OperationListener() {
-			public boolean notify(IDataModelOperation operation) {
-				operationsRun.remove(operation.getID());
-
-				return true;
-			}
-		});
-
-	}
-
-	public void addGroupAfter(String pageGroupID, IDMPageGroup pageInsertGroup) {
-		PageGroupEntry pageGroupEntry = (PageGroupEntry) groupTable.get(pageGroupID);
-
-		if (pageGroupEntry.pageGroup.getAllowsExtendedPages()) {
-			addPageGroup(pageGroupEntry.pageGroup, pageInsertGroup);
-		}
-	}
-
-	public void moveForwardOnePage() {
-		boolean pageFound = false;
-
-		if (pageGroupStack.empty()) {
-			PageGroupEntry rootEntry = (PageGroupEntry) groupTable.get(rootPageGroup.getPageGroupID());
-			Set dataModelIDs = rootEntry.pageGroup.getDataModelIDs();
-			pageGroupStack.push(new StackEntry(rootEntry, -1));
-
-			if (dataModelIDs != null && dataModelIDs.size() > 0) {
-				Iterator ids = dataModelIDs.iterator();
-
-				while (ids.hasNext()) {
-					String dataModelID = (String) ids.next();
-					dataModelManager.addNestedDataModel(dataModelID);
-				}
-			}
-		}
-
-		saveStackInfo();
-
-		try {
-			pageFound = findNextPage(true);
-		} catch (Throwable exc) {
-			Logger.getLogger().logError(exc);
-			operationManager.undoLastRun();
-			pageFound = false;
-		}
-
-		if (pageFound == false) {
-			// If we moved forward and there wasn't a page then we will restore the stack.
-			// Normally, this wouldn't happen since a call to hasNextPage would have indicated
-			// that there wasn't a page.
-			restoreStackInfo();
-		}
-	}
-
-	public void moveBackOnePage() {
-		if (pageGroupStack.empty())
-			return;
-
-		StackEntry topEntry = (StackEntry) pageGroupStack.peek();
-
-		// Pop the last page.
-		if (!topEntry.pagesReturned.empty())
-			topEntry.pagesReturned.pop();
-
-		// Now find the previous page.
-		boolean foundPreviousPage = findPreviousPageInGroup();
-
-		while (!foundPreviousPage && !pageGroupStack.empty()) {
-			if (topEntry.ranOperations) {
-				operationManager.undoLastRun();
-			}
-
-			Set dataModelIDs = topEntry.pageGroupEntry.pageGroup.getDataModelIDs();
-
-			if (dataModelIDs != null && dataModelIDs.size() > 0) {
-				Iterator ids = dataModelIDs.iterator();
-
-				while (ids.hasNext()) {
-					String dataModelID = (String) ids.next();
-					dataModelManager.removeNestedDataModel(dataModelID);
-				}
-			}
-
-			pageGroupStack.pop();
-
-			if (!pageGroupStack.empty()) {
-				foundPreviousPage = findPreviousPageInGroup();
-				topEntry = (StackEntry) pageGroupStack.peek();
-			}
-		}
-	}
-
-	public void reset(){
-		pageGroupStack.clear();
-	}
-	
-	public IWizardPage getCurrentPage() {
-		IWizardPage page = null;
-
-		if (!pageGroupStack.empty()) {
-			StackEntry topEntry = (StackEntry) pageGroupStack.peek();
-			int pageIndex = topEntry.getTopPageIndex();
-
-			page = pageIndex == -1 ? null : (IWizardPage)topEntry.pageGroupEntry.getPages().get(pageIndex);
-		}
-
-		return page;
-	}
-
-	private Boolean hasMulitplePages;
-
-	public boolean hasMultiplePages() {
-		if (null == hasMulitplePages) {
-			int pageCount = 0;
-			PageGroupEntry rootEntry = (PageGroupEntry) groupTable.get(rootPageGroup.getPageGroupID());
-			pageCount += rootEntry.getPages().size();
-			for (int i = 0; pageCount < 2 && i < rootEntry.groupsThatFollow.size(); i++) {
-				pageCount += ((PageGroupEntry) rootEntry.groupsThatFollow.get(i)).getPages().size();
-			}
-			hasMulitplePages = pageCount > 1 ? Boolean.TRUE : Boolean.FALSE;
-		}
-		return hasMulitplePages.booleanValue();
-	}
-
-	public boolean hasNextPage() {
-		boolean pageFound = false;
-
-		saveStackInfo();
-
-		if (pageGroupStack.empty()) {
-			PageGroupEntry rootEntry = (PageGroupEntry) groupTable.get(rootPageGroup.getPageGroupID());
-			Set dataModelIDs = rootEntry.pageGroup.getDataModelIDs();
-
-			pageGroupStack.push(new StackEntry(rootEntry, -1));
-
-			if (dataModelIDs != null && dataModelIDs.size() > 0) {
-				Iterator ids = dataModelIDs.iterator();
-
-				while (ids.hasNext()) {
-					String dataModelID = (String) ids.next();
-					dataModelManager.addNestedDataModel(dataModelID);
-				}
-			}
-		}
-
-		pageFound = findNextPage(false);
-		restoreStackInfo();
-
-		return pageFound;
-	}
-
-	public boolean runAllRemainingOperations() {
-		setPostListener(null);
-
-		IStatus status = operationManager.runOperations();
-
-		return status.getSeverity() != IStatus.ERROR;
-	}
-
-	public void undoAllCurrentOperations() {
-		while (!pageGroupStack.empty()) {
-			moveBackOnePage();
-		}
-	}
-
-	private boolean findPreviousPageInGroup() {
-		StackEntry topEntry = (StackEntry) pageGroupStack.peek();
-		boolean pageFound = false;
-
-		if (!topEntry.pagesReturned.empty()) {
-			topEntry.pagesComplete = false;
-			pageFound = true;
-		}
-
-		return pageFound;
-	}
-
-	private boolean findNextPage(boolean runOperations) {
-		StackEntry topEntry = (StackEntry) pageGroupStack.peek();
-		int newPageIndex = topEntry.findNextPageIndex();
-		boolean pageFound = false;
-
-		if (newPageIndex == -1) {
-			// Our page handler didn't find a page so we will see if there is a page group that
-			// follows this page group that can find a page.
-			topEntry.pagesComplete = true;
-
-			StackEntry nextStackEntry = findNextPageGroup(pageGroupStack);
-
-			if (nextStackEntry != null) {
-				IDMPageGroup pageGroup = nextStackEntry.pageGroupEntry.pageGroup;
-				String requiresOperationsId = pageGroup.getRequiredDataOperationToRun();
-				Set dataModelIDs = pageGroup.getDataModelIDs();
-
-				// If this group requires an operation and it has not already been run
-				// then we need to run it.
-				if (runOperations && requiresOperationsId != null && !operationsRun.contains(requiresOperationsId)) {
-					setPostListener(requiresOperationsId);
-					IStatus status = operationManager.runOperations();
-
-					nextStackEntry.ranOperations = true;
-					if (status.getSeverity() == IStatus.ERROR) {
-						// TODO need a better error feedback mechanism here.
-						throw new IllegalArgumentException(status.getMessage());
-					}
-				}
-
-				if (dataModelIDs != null && dataModelIDs.size() > 0) {
-					Iterator ids = dataModelIDs.iterator();
-
-					while (ids.hasNext()) {
-						String dataModelID = (String) ids.next();
-						dataModelManager.addNestedDataModel(dataModelID);
-					}
-				}
-
-				pageGroupStack.push(nextStackEntry);
-				pageFound = findNextPage(runOperations);
-			}
-		} else {
-			// We found a new page in the page handler.
-			pageFound = true;
-			topEntry.pagesReturned.push(new Integer(newPageIndex));
-		}
-
-		return pageFound;
-	}
-
-	private void setPostListener(final String operationId) {
-		if (operationId != null) {
-			// Listener for a particular operation and stop after we are notified of it.
-			operationManager.setPostExecuteListener(new OperationListener() {
-				public boolean notify(IDataModelOperation operation) {
-					String id = operation.getID();
-
-					operationsRun.add(id);
-
-					return !id.equals(operationId);
-				}
-			});
-		} else {
-			// Set the post execution listener to doing nothing so that all operations
-			// will execute.
-			operationManager.setPostExecuteListener(new OperationListener() {
-				public boolean notify(IDataModelOperation operation) {
-					return true;
-				}
-			});
-		}
-	}
-
-	private void saveStackInfo() {
-		if (!pageGroupStack.empty()) {
-			savedTopEntry = new StackEntry((StackEntry) pageGroupStack.peek());
-		}
-
-		savedStackSize = pageGroupStack.size();
-	}
-
-	private void restoreStackInfo() {
-		if (savedStackSize == 0) {
-			pageGroupStack.removeAllElements();
-		} else {
-			pageGroupStack.setSize(savedStackSize - 1);
-			pageGroupStack.push(savedTopEntry);
-		}
-	}
-
-	private void loadExtendedPages(IDMPageGroup pageGroup) {
-		String wizardId = rootPageGroup.getWizardID();
-		String pageGroupId = pageGroup.getPageGroupID();
-		int length = elements.length;
-
-		for (int index = 0; index < length; index++) {
-			DMPageGroupElementImpl pageInsertGroup = new DMPageGroupElementImpl(elements[index]);
-			String pageInsertGroupId = pageInsertGroup.getPageGroupInsertionID();
-			if (pageInsertGroup.getWizardID().equals(wizardId) && (null == pageInsertGroupId || pageInsertGroupId.equals(pageGroupId))) {
-				addPageGroup(pageGroup, pageInsertGroup);
-
-				// If this page group has page then add them
-				if (pageInsertGroup.getAllowsExtendedPages()) {
-					loadExtendedPages(pageInsertGroup);
-				}
-			}
-		}
-	}
-
-	private void addPageGroup(IDMPageGroup pageGroup, IDMPageGroup insertedPageGroup) {
-		PageGroupEntry pageGroupEntry = (PageGroupEntry) groupTable.get(pageGroup.getPageGroupID());
-		PageGroupEntry nextGroupEntry = (PageGroupEntry) groupTable.get(insertedPageGroup.getPageGroupID());
-
-		if (pageGroupEntry == null) {
-			pageGroupEntry = new PageGroupEntry(pageGroup);
-			groupTable.put(pageGroup.getPageGroupID(), pageGroupEntry);
-		}
-
-		if (nextGroupEntry == null) {
-			nextGroupEntry = new PageGroupEntry(insertedPageGroup);
-			groupTable.put(insertedPageGroup.getPageGroupID(), nextGroupEntry);
-		}
-
-		pageGroupEntry.groupsThatFollow.add(nextGroupEntry);
-	}
-
-	public StackEntry findNextPageGroup(Stack stack) {
-		StackEntry topEntry = (StackEntry) stack.peek();
-		PageGroupEntry nextPageGroup = topEntry.getNextPageGroup(null);
-		int parentIndex = topEntry.parentGroupIndex;
-		int prevParentIndex = stack.size() - 1;
-
-		// Recurse up through the parents to find the next group if needed.
-		while (parentIndex != -1 && nextPageGroup == null) {
-			StackEntry parentStackEntry = (StackEntry) stack.elementAt(parentIndex);
-
-			nextPageGroup = parentStackEntry.getNextPageGroup(topEntry.getId());
-			prevParentIndex = parentIndex;
-			parentIndex = parentStackEntry.parentGroupIndex;
-			topEntry = parentStackEntry;
-		}
-
-		return nextPageGroup == null ? null : new StackEntry(nextPageGroup, prevParentIndex);
-	}
-
-	private class StackEntry {
-		public PageGroupEntry pageGroupEntry;
-		public Stack pagesReturned; // Element = Interger of page indexes.
-		public boolean pagesComplete;
-		public int parentGroupIndex;
-		public boolean ranOperations;
-
-		public StackEntry(PageGroupEntry newPageGroupEntry, int parentIndex) {
-			pageGroupEntry = newPageGroupEntry;
-			pagesReturned = new Stack();
-			pagesComplete = false;
-			parentGroupIndex = parentIndex;
-			ranOperations = false;
-		}
-
-		public StackEntry(StackEntry stackEntry) {
-			pageGroupEntry = stackEntry.pageGroupEntry;
-			pagesReturned = new Stack();
-			pagesComplete = stackEntry.pagesComplete;
-			parentGroupIndex = stackEntry.parentGroupIndex;
-			ranOperations = stackEntry.ranOperations;
-			pagesReturned.addAll(stackEntry.pagesReturned);
-		}
-
-		public String getId() {
-			return pageGroupEntry.pageGroup.getPageGroupID();
-		}
-
-		public int findNextPageIndex() {
-			int result = -1;
-
-			if (!pagesComplete) {
-				List pages = pageGroupEntry.getPages();
-
-				int pageIndex = getTopPageIndex();
-				String pageId = pageIndex == -1 ? null : ((IWizardPage)pages.get(pageIndex)).getName();
-				String expectedId = pageIndex + 1 >= pages.size() ? null : ((IWizardPage)pages.get(pageIndex + 1)).getName();
-				String newPageId = null;
-
-				try {
-					newPageId = pageGroupEntry.getPageHandler().getNextPage(pageId, expectedId);
-				} catch (Throwable exc) {
-					Logger.getLogger().logError(exc);
-				}
-
-				if (newPageId != null && newPageId.equals(IDMPageHandler.SKIP_PAGE) && pageIndex >= 0 && pageIndex < pages.size() - 2) {
-					result = pageIndex + 2;
-				} else {
-					result = pageGroupEntry.checkForSpecialIds(newPageId);
-				}
-			}
-
-			return result;
-		}
-
-		public PageGroupEntry getNextPageGroup(String afterId) {
-			PageGroupEntry result = null;
-			String nextGroupID = null;
-			String[] groupIDList = getGroupIDList();
-
-			try {
-				nextGroupID = pageGroupEntry.getPageGroupHandler().getNextPageGroup(afterId, groupIDList);
-			} catch (Throwable exc) {
-				Logger.getLogger().logError(exc);
-			}
-
-			if (nextGroupID != null) {
-				// Find this string in the list.
-				for (int index = 0; index < groupIDList.length; index++) {
-					if (groupIDList[index].equals(nextGroupID)) {
-						result = (PageGroupEntry) pageGroupEntry.groupsThatFollow.elementAt(index);
-						break;
-					}
-				}
-			}
-
-			return result;
-		}
-
-		private String[] getGroupIDList() {
-			String[] result = new String[pageGroupEntry.groupsThatFollow.size()];
-
-			for (int index = 0; index < pageGroupEntry.groupsThatFollow.size(); index++) {
-				PageGroupEntry entry = (PageGroupEntry) pageGroupEntry.groupsThatFollow.elementAt(index);
-
-				result[index] = entry.pageGroup.getPageGroupID();
-			}
-
-			return result;
-		}
-
-		private int getTopPageIndex() {
-			return pagesReturned.empty() ? -1 : ((Integer) pagesReturned.peek()).intValue();
-		}
-	}
-
-	private class PageGroupEntry {
-		public IDMPageGroup pageGroup;
-		public Vector groupsThatFollow;
-		private IDMPageHandler pageHandler;
-		private IDMPageGroupHandler pageGroupHandler;
-		private boolean initialized;
-
-		public PageGroupEntry(IDMPageGroup newPageGroup) {
-			pageGroup = newPageGroup;
-			groupsThatFollow = new Vector();
-			initialized = false;
-		}
-
-		public IDMPageHandler getPageHandler() {
-			if (!initialized)
-				init();
-
-			return pageHandler;
-		}
-
-		public IDMPageGroupHandler getPageGroupHandler() {
-			if (!initialized)
-				init();
-
-			return pageGroupHandler;
-		}
-
-		public List getPages() {
-			if (!initialized)
-				init();
-
-			return pageGroup.getPages(dataModel);
-		}
-
-		public PageGroupEntry(PageGroupEntry originalEntry) {
-			pageGroup = originalEntry.pageGroup;
-			groupsThatFollow = originalEntry.groupsThatFollow;
-			pageHandler = originalEntry.pageHandler;
-			pageGroupHandler = originalEntry.pageGroupHandler;
-		}
-
-		private void init() {
-			try {
-				pageHandler = pageGroup.getPageHandler(dataModel);
-				pageGroupHandler = pageGroup.getPageGroupHandler(dataModel);
-			} catch (Throwable exc) {
-				Logger.getLogger().logError(exc);
-			}
-
-			if (pageHandler == null)
-				pageHandler = new SimplePageHandler();
-
-			if (pageGroupHandler == null)
-				pageGroupHandler = new SimplePageGroupHandler();
-
-			initialized = true;
-		}
-
-		private int checkForSpecialIds(String pageId) {
-			int result = -1;
-
-			List pages = getPages();
-			
-			if (pages.isEmpty() || pageId == null)
-				return -1;
-
-			if (pageId.startsWith(IDMPageHandler.PAGE_AFTER)) {
-				String afterID = pageId.substring(IDMPageHandler.PAGE_AFTER.length(), pageId.length());
-				result = getIndexOf(afterID);
-				result = result >= 0 && result < pages.size() - 1 ? result + 1 : -1;
-			} else if (pageId.startsWith(IDMPageHandler.PAGE_BEFORE)) {
-				String beforeID = pageId.substring(IDMPageHandler.PAGE_BEFORE.length(), pageId.length());
-				result = getIndexOf(beforeID);
-				result = result >= 1 && result < pages.size() ? result - 1 : -1;
-			} else {
-				result = getIndexOf(pageId);
-			}
-
-			return result;
-		}
-
-		private int getIndexOf(String pageId) {
-			int result = -1;
-
-			List pages = getPages();
-			for (int index = 0; index < pages.size(); index++) {
-				if (((IWizardPage)pages.get(index)).getName().equals(pageId)) {
-					result = index;
-					break;
-				}
-			}
-
-			return result;
-		}
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/RunnableOperationWrapper.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/RunnableOperationWrapper.java
deleted file mode 100644
index 4b26000..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/RunnableOperationWrapper.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-
-public class RunnableOperationWrapper implements IRunnableWithProgress {
-
-	private IUndoableOperation undoableOperation;
-	private IStatus status;
-
-	public RunnableOperationWrapper(IUndoableOperation undoableOperation) {
-		this.undoableOperation = undoableOperation;
-	}
-
-	public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-		try {
-			status = undoableOperation.execute(monitor, null);
-			if(status.getSeverity() == IStatus.ERROR){
-				throw new InvocationTargetException(status.getException());
-			}
-		} catch (ExecutionException e) {
-			throw new InvocationTargetException(e);
-		}
-	}
-
-	public IStatus getStatus() {
-		return status;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/RunnableWithProgressWrapper.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/RunnableWithProgressWrapper.java
deleted file mode 100644
index 3df3904..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/RunnableWithProgressWrapper.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-
-import org.eclipse.wst.common.frameworks.internal.operations.IHeadlessRunnableWithProgress;
-
-/**
- * This is a wrapper for our IHeadlessRunnableWithProgress to the IRunnableWithProgress. This class
- * needs to be used when running the operation from a IRunnableContext.
- * 
- * @see IRunnableContext
- * @see JavaUIPlugin#getRunnableWithProgress Creation date: (5/8/2001 1:28:45 PM)
- * @author: Administrator
- */
-public class RunnableWithProgressWrapper implements org.eclipse.jface.operation.IRunnableWithProgress {
-	// //$NON-NLS-1$
-	private IHeadlessRunnableWithProgress headlessRunnable;
-
-	/**
-	 * RunnableWithProgressWrapper constructor comment.
-	 */
-	public RunnableWithProgressWrapper(IHeadlessRunnableWithProgress aHeadlessRunnableWithProgress) {
-		setHeadlessRunnable(aHeadlessRunnableWithProgress);
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (5/8/2001 1:29:52 PM)
-	 * 
-	 * @return com.ibm.etools.j2ee.operations.IHeadlessRunnableWithProgress
-	 */
-	protected org.eclipse.wst.common.frameworks.internal.operations.IHeadlessRunnableWithProgress getHeadlessRunnable() {
-		return headlessRunnable;
-	}
-
-	/**
-	 * Runs this operation. Progress should be reported to the given progress monitor. This method
-	 * is usually invoked by an <code>IRunnableContext</code>'s<code>run</code> method, which
-	 * supplies the progress monitor. A request to cancel the operation should be honored and
-	 * acknowledged by throwing <code>InterruptedException</code>.
-	 * 
-	 * @param monitor
-	 *            the progress monitor to use to display progress and receive requests for
-	 *            cancelation
-	 * @exception InvocationTargetException
-	 *                if the run method must propagate a checked exception, it should wrap it inside
-	 *                an <code>InvocationTargetException</code>; runtime exceptions are
-	 *                automatically wrapped in an <code>InvocationTargetException</code> by the
-	 *                calling context
-	 * @exception InterruptedException
-	 *                if the operation detects a request to cancel, using
-	 *                <code>IProgressMonitor.isCanceled()</code>, it should exit by throwing
-	 *                <code>InterruptedException</code>
-	 * 
-	 * @see IRunnableContext#run
-	 */
-	public void run(org.eclipse.core.runtime.IProgressMonitor monitor) throws java.lang.reflect.InvocationTargetException, java.lang.InterruptedException {
-		getHeadlessRunnable().run(monitor);
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (5/8/2001 1:29:52 PM)
-	 * 
-	 * @param newHeadlessRunnable
-	 *            com.ibm.etools.j2ee.operations.IHeadlessRunnableWithProgress
-	 */
-	protected void setHeadlessRunnable(org.eclipse.wst.common.frameworks.internal.operations.IHeadlessRunnableWithProgress newHeadlessRunnable) {
-		headlessRunnable = newHeadlessRunnable;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/SaveHandlerUI.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/SaveHandlerUI.java
deleted file mode 100644
index e316218..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/SaveHandlerUI.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.wst.common.frameworks.internal.ISaveHandler;
-import org.eclipse.wst.common.frameworks.internal.SaveFailedException;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
-
-
-public class SaveHandlerUI implements ISaveHandler {
-	public static final String SAVE_FAILED = WTPCommonPlugin.getResourceString("16"); //$NON-NLS-1$
-	public static final String BEGINNING_MESSAGE = WTPCommonPlugin.getResourceString("17"); //$NON-NLS-1$
-	protected boolean isYesToAll = false;
-	protected int referenceCount = 0;
-
-	/**
-	 * SaveHandlerUI constructor comment.
-	 */
-	public SaveHandlerUI() {
-		super();
-	}
-
-	/**
-	 * access method comment.
-	 */
-	public void access() {
-		referenceCount++;
-	}
-
-	protected Shell getParentShellForDialog() {
-		if (Display.getCurrent() != null)
-			return Display.getCurrent().getActiveShell();
-
-		return null;
-	}
-
-	protected Display getDisplay() {
-		Display result = Display.getCurrent();
-		return result == null ? Display.getDefault() : result;
-	}
-
-	public void handleSaveFailed(SaveFailedException ex, IProgressMonitor monitor) {
-		if (referenceCount > 1)
-			//Let the outermost reference handle it
-			throw ex;
-		String exMsg = ex.getInnerMostNestedException() == null ? ex.getMessage() : ex.getInnerMostNestedException().getMessage();
-		final String message = BEGINNING_MESSAGE + ":\n" + exMsg;//$NON-NLS-1$
-		getDisplay().syncExec(new Runnable() {
-			public void run() {
-				MessageDialog.openError(getParentShellForDialog(), SAVE_FAILED, message);
-			}
-		});
-		if (monitor != null)
-			monitor.setCanceled(true);
-		else
-			throw ex;
-	}
-
-	protected boolean promptUserToSaveReadOnly(IFile aFile) {
-
-		String[] buttonStrings = {WTPCommonPlugin.getResourceString("Yes_UI_"), WTPCommonPlugin.getResourceString("Yes_To_All_UI_"), WTPCommonPlugin.getResourceString("No_UI_")}; //$NON-NLS-3$ = "No" //$NON-NLS-2$ = "Yes To All" //$NON-NLS-1$ = "Yes"
-		String title = WTPCommonPlugin.getResourceString("Saving_Read-Only_File_UI_"); //$NON-NLS-1$ = "Saving Read-Only File"
-		String message = WTPCommonPlugin.getResourceString("2concat_INFO_", (new Object[]{aFile.getFullPath()})); //$NON-NLS-1$ = "The file {0} is read-only and cannot be saved.  Would you like to make it editable and save anyway?"
-
-		final MessageDialog dialog = new MessageDialog(getParentShellForDialog(), title, null, // accept
-					// the
-					// default
-					// window
-					// icon
-					message, MessageDialog.QUESTION, buttonStrings, 0); // Yes is the default
-
-		final int[] ret = new int[1];
-		getDisplay().syncExec(new Runnable() {
-			public void run() {
-				dialog.setBlockOnOpen(true);
-				ret[0] = dialog.open();
-			}
-		});
-
-		switch (ret[0]) {
-			case 0 : {
-				return true;
-			}
-			case 1 : {
-				isYesToAll = true;
-				return true;
-			}
-			case 2 : {
-				return false;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * release method comment.
-	 */
-	public void release() {
-		referenceCount--;
-		if (referenceCount == 0)
-			isYesToAll = false;
-
-	}
-
-	/**
-	 * shouldContinueAndMakeFileEditable method comment.
-	 */
-	public boolean shouldContinueAndMakeFileEditable(IFile aFile) {
-		boolean yes = isYesToAll || promptUserToSaveReadOnly(aFile);
-		if (yes)
-			aFile.getResourceAttributes().setReadOnly(false);
-		return yes;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/SimplePageGroupHandler.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/SimplePageGroupHandler.java
deleted file mode 100644
index c68ee57..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/SimplePageGroupHandler.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 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
- **************************************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.IDMPageGroupHandler;
-
-public class SimplePageGroupHandler implements IDMPageGroupHandler {
-	public String getNextPageGroup(String currentPageGroupID, String[] pageGroupIDs) {
-		if (pageGroupIDs == null || pageGroupIDs.length == 0)
-			return null;
-
-		if (currentPageGroupID == null)
-			return pageGroupIDs[0];
-
-		String result = null;
-
-		for (int index = 0; index < pageGroupIDs.length; index++) {
-			if (pageGroupIDs[index].equals(currentPageGroupID)) {
-				// We found the currentPageGroupID, so we want to return the next one in the
-				// array if there is one.
-				if (index + 1 < pageGroupIDs.length) {
-					result = pageGroupIDs[index + 1];
-				} else {
-					result = null;
-				}
-
-				break;
-			}
-		}
-
-		return result;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/SimplePageHandler.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/SimplePageHandler.java
deleted file mode 100644
index 44db38f..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/SimplePageHandler.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 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
- **************************************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.IDMPageHandler;
-
-public class SimplePageHandler implements IDMPageHandler
-{
-  public String getNextPage(String currentPageName, String expectedNextPageName) 
-  {
-    return expectedNextPageName;
-  }
-
-  public String getPreviousPage(String currentPageName, String expectedPreviousPageName) 
-  {
-	return expectedPreviousPageName;
-  }
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/TimedKeyListener.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/TimedKeyListener.java
deleted file mode 100644
index 7f3c7b4..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/TimedKeyListener.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-import java.awt.event.ActionListener;
-
-import org.eclipse.swt.events.KeyListener;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.events.MouseTrackListener;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * Insert the type's description here. Creation date: (8/30/2001 4:00:28 PM)
- * 
- * @author: Administrator
- */
-public class TimedKeyListener extends Timer implements KeyListener, MouseListener, MouseTrackListener, ModifyListener {
-
-	protected Widget monitoringTarget;
-
-	private final static int TIME_LIMIT = 200;
-
-	/**
-	 * J2EETimedKeyListener constructor comment.
-	 * 
-	 * @param delay
-	 *            int
-	 * @param listener
-	 *            java.awt.event.ActionListener
-	 */
-	public TimedKeyListener(int delay, ActionListener listener) {
-		super(delay, listener);
-		setRepeats(false);
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (8/30/2001 4:43:33 PM)
-	 * 
-	 * @param a
-	 *            java.awt.event.ActionListener
-	 */
-	public TimedKeyListener(ActionListener listener) {
-		this(TIME_LIMIT, listener);
-	}
-
-	/**
-	 * Sent when a key is pressed on the system keyboard.
-	 * 
-	 * @param e
-	 *            an event containing information about the key press
-	 */
-	public void keyPressed(org.eclipse.swt.events.KeyEvent e) {
-	}
-
-	/**
-	 * Sent when a key is released on the system keyboard.
-	 * 
-	 * @param e
-	 *            an event containing information about the key release
-	 */
-	public void keyReleased(org.eclipse.swt.events.KeyEvent e) {
-		// Replaced with SWT.Modify -- see modifyText() in this class
-		//        monitoringTarget = (Widget) e.getSource();
-		//        restart();
-	}
-
-	/**
-	 * @see org.eclipse.swt.events.MouseListener#mouseDoubleClick(MouseEvent)
-	 */
-	public void mouseDoubleClick(MouseEvent e) {
-	}
-
-	/**
-	 * @see org.eclipse.swt.events.MouseListener#mouseDown(MouseEvent)
-	 */
-	public void mouseDown(MouseEvent e) {
-	}
-
-	/**
-	 * @see org.eclipse.swt.events.MouseListener#mouseUp(MouseEvent)
-	 */
-	public void mouseUp(MouseEvent e) {
-		monitoringTarget = (Widget) e.getSource();
-		restart();
-	}
-
-	/**
-	 * @see org.eclipse.swt.events.MouseTrackListener#mouseEnter(MouseEvent)
-	 */
-	public void mouseEnter(MouseEvent e) {
-	}
-
-	/**
-	 * @see org.eclipse.swt.events.MouseTrackListener#mouseExit(MouseEvent)
-	 */
-	public void mouseExit(MouseEvent e) {
-	}
-
-	/**
-	 * @see org.eclipse.swt.events.MouseTrackListener#mouseHover(MouseEvent)
-	 */
-	public void mouseHover(MouseEvent e) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.ui.util.Timer#getSource()
-	 */
-	protected Object getSource() {
-		return monitoringTarget;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
-	 */
-	public void modifyText(ModifyEvent e) {
-		monitoringTarget = (Widget) e.getSource();
-		restart();
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/TimedModifyListener.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/TimedModifyListener.java
deleted file mode 100644
index 98045fe..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/TimedModifyListener.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-/**
- * This class perform the same function as the J2EETimedKeyListener but using the Modify SWT event
- * instead of the KeyUp. Creation date: (9/10/2001 11:46:51 AM)
- * 
- * @author: Administrator
- */
-import java.awt.event.ActionListener;
-
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.widgets.Widget;
-
-public class TimedModifyListener extends TimedKeyListener implements ModifyListener {
-	/**
-	 * J2EETimedModefyListener constructor comment.
-	 * 
-	 * @param delay
-	 *            int
-	 * @param listener
-	 *            java.awt.event.ActionListener
-	 */
-	public TimedModifyListener(int delay, ActionListener listener) {
-		super(delay, listener);
-	}
-
-	/**
-	 * J2EETimedModefyListener constructor comment.
-	 * 
-	 * @param listener
-	 *            java.awt.event.ActionListener
-	 */
-	public TimedModifyListener(ActionListener listener) {
-		super(listener);
-	}
-
-	/*
-	 * Re/Start the timer
-	 */
-	public void modifyText(org.eclipse.swt.events.ModifyEvent e) {
-		monitoringTarget = (Widget) e.getSource();
-		restart();
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/Timer.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/Timer.java
deleted file mode 100644
index 85836ea..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/Timer.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-
-
-public class Timer {
-	/**
-	 * DoPostEvent is a runnable class that fires actionEvents to the listeners on the
-	 * EventDispatchThread, via invokeLater.
-	 * 
-	 * @see #post
-	 */
-	class DoPostEvent implements Runnable {
-		public void run() {
-			if (eventQueued) {
-				fireActionPerformed(new ActionEvent(getSource(), 0, null));
-				cancelEvent();
-			}
-		}
-
-		Timer getTimer() {
-			return Timer.this;
-		}
-	}
-
-	protected ListenerList listenerList = new ListenerList();
-	boolean eventQueued = false;
-	int initialDelay, delay;
-	boolean repeats = true, coalesce = true;
-	private Runnable doPostEvent;
-	// These fields are maintained by TimerQueue.
-	// eventQueued can also be reset by the TimerQueue, but will only ever
-	// happen in applet case when TimerQueues thread is destroyed.
-	long expirationTime;
-	Timer nextTimer;
-	boolean running;
-
-	/**
-	 * Creates a Timer that will notify its listeners every <i>delay </i> milliseconds.
-	 * 
-	 * @param delay
-	 *            The number of milliseconds between listener notification
-	 * @param listener
-	 *            An initial listener
-	 * @see #setInitialDelay
-	 * @see #setRepeats
-	 */
-	public Timer(int delay, ActionListener listener) {
-		super();
-		this.delay = delay;
-		this.initialDelay = delay;
-
-		doPostEvent = new DoPostEvent();
-
-		if (listener != null) {
-			addActionListener(listener);
-		}
-	}
-
-	/**
-	 * Adds an actionListener to the Timer
-	 */
-	public void addActionListener(ActionListener listener) {
-		listenerList.add(listener);
-	}
-
-	synchronized void cancelEvent() {
-		eventQueued = false;
-	}
-
-	/**
-	 * Notify all listeners that have registered interest for notification on this event type. The
-	 * event instance is lazily created using the parameters passed into the fire method.
-	 * 
-	 * @see EventListenerList
-	 */
-	protected void fireActionPerformed(ActionEvent e) {
-		// Guaranteed to return a non-null array
-		ActionListener[] listeners = listenerList.getListenerList();
-
-		// Process the listeners last to first, notifying
-		// those that are interested in this event
-		for (int i = listeners.length - 1; i >= 0; i -= 1) {
-			listeners[i].actionPerformed(e);
-		}
-	}
-
-	/**
-	 * Returns the Timer's delay.
-	 * 
-	 * @see #setDelay
-	 */
-	public int getDelay() {
-		return delay;
-	}
-
-	/**
-	 * Returns the Timer's initial delay.
-	 * 
-	 * @see #setDelay
-	 */
-	public int getInitialDelay() {
-		return initialDelay;
-	}
-
-	/**
-	 * Returns <b>true </b> if the Timer coalesces multiple pending <b>performCommand() </b>
-	 * messages.
-	 * 
-	 * @see #setCoalesce
-	 */
-	public boolean isCoalesce() {
-		return coalesce;
-	}
-
-	/**
-	 * Returns <b>true </b> if the Timer will send a <b>actionPerformed() </b> message to its
-	 * listeners multiple times.
-	 * 
-	 * @see #setRepeats
-	 */
-	public boolean isRepeats() {
-		return repeats;
-	}
-
-	/**
-	 * Returns <b>true </b> if the Timer is running.
-	 * 
-	 * @see #start
-	 */
-	public boolean isRunning() {
-		return timerQueue().containsTimer(this);
-	}
-
-	synchronized void post() {
-		if (!eventQueued) {
-			eventQueued = true;
-			org.eclipse.swt.widgets.Display.getDefault().asyncExec(doPostEvent);
-		}
-	}
-
-	/**
-	 * Removes an ActionListener from the Timer.
-	 */
-	public void removeActionListener(ActionListener listener) {
-		listenerList.remove(listener);
-	}
-
-	/**
-	 * Restarts a Timer, canceling any pending firings, and causing it to fire with its initial
-	 * dely.
-	 */
-	public void restart() {
-		stop();
-		start();
-	}
-
-	/**
-	 * Sets whether the Timer coalesces multiple pending ActionEvent firings. A busy application may
-	 * not be able to keep up with a Timer's message generation, causing multiple
-	 * <b>actionPerformed() </b> message sends to be queued. When processed, the application sends
-	 * these messages one after the other, causing the Timer's listeners to receive a sequence of
-	 * <b>actionPerformed() </b> messages with no delay between them. Coalescing avoids this
-	 * situation by reducing multiple pending messages to a single message send. Timers coalesce
-	 * their message sends by default.
-	 */
-	public void setCoalesce(boolean flag) {
-		coalesce = flag;
-	}
-
-	/**
-	 * Sets the Timer's delay, the number of milliseconds between successive <b>actionPerfomed()
-	 * </b> messages to its listeners
-	 * 
-	 * @see #setInitialDelay
-	 */
-	public void setDelay(int delay) {
-		if (delay < 0) {
-			String msg = WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.Timer_UI_0, new Object[]{Integer.toString(delay)}); //$NON-NLS-1$
-			throw new IllegalArgumentException(msg);
-		}
-		this.delay = delay;
-	}
-
-	/**
-	 * Sets the Timer's initial delay. This will be used for the first "ringing" of the Timer only.
-	 * Subsequent ringings will be spaced using the delay property.
-	 * 
-	 * @see #setDelay
-	 */
-	public void setInitialDelay(int initialDelay) {
-		if (initialDelay < 0) {
-			String msg = WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.Timer_UI_1, new Object[]{Integer.toString(initialDelay)}); //$NON-NLS-1$
-			throw new IllegalArgumentException(msg);
-		}
-		this.initialDelay = initialDelay;
-	}
-
-	/**
-	 * If <b>flag </b> is <b>false </b>, instructs the Timer to send <b>actionPerformed() </b> to
-	 * its listeners only once, and then stop.
-	 */
-	public void setRepeats(boolean flag) {
-		repeats = flag;
-	}
-
-	/**
-	 * Starts the Timer, causing it to send <b>actionPerformed() </b> messages to its listeners.
-	 * 
-	 * @see #stop
-	 */
-	public void start() {
-		timerQueue().addTimer(this, System.currentTimeMillis() + getInitialDelay());
-	}
-
-	/**
-	 * Stops a Timer, causing it to stop sending <b>actionPerformed() </b> messages to its Target.
-	 * 
-	 * @see #start
-	 */
-	public void stop() {
-		timerQueue().removeTimer(this);
-		cancelEvent();
-	}
-
-	/**
-	 * Returns the timer queue.
-	 */
-	TimerQueue timerQueue() {
-		return TimerQueue.singleton();
-	}
-
-	/**
-	 * Return the source for the ActionEvent that is fired.
-	 * 
-	 * @return
-	 */
-	protected Object getSource() {
-		return this;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/TimerQueue.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/TimerQueue.java
deleted file mode 100644
index 7b54f03..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/TimerQueue.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-
-
-
-class TimerQueue implements Runnable {
-	private static TimerQueue singleton;
-	Timer firstTimer;
-	boolean running;
-	private static final Object classLock = new Object();
-
-	/**
-	 * Constructor for TimerQueue.
-	 */
-	public TimerQueue() {
-		super();
-
-		// Now start the TimerQueue thread.
-		start();
-	}
-
-	synchronized void addTimer(Timer timer, long expirationTime) {
-		Timer previousTimer;
-		Timer nextTimer;
-
-		// If the Timer is already in the queue, then ignore the add.
-		if (timer.running) {
-			return;
-		}
-
-		previousTimer = null;
-		nextTimer = firstTimer;
-
-		// Insert the Timer into the linked list in the order they will
-		// expire. If two timers expire at the same time, put the newer entry
-		// later so they expire in the order they came in.
-
-		while (nextTimer != null) {
-			if (nextTimer.expirationTime > expirationTime)
-				break;
-
-			previousTimer = nextTimer;
-			nextTimer = nextTimer.nextTimer;
-		}
-
-		if (previousTimer == null) {
-			firstTimer = timer;
-		} else {
-			previousTimer.nextTimer = timer;
-		}
-
-		timer.expirationTime = expirationTime;
-		timer.nextTimer = nextTimer;
-		timer.running = true;
-		notify();
-	}
-
-	synchronized boolean containsTimer(Timer timer) {
-		return timer.running;
-	}
-
-	/**
-	 * If there are a ton of timers, this method may never return. It loops checking to see if the
-	 * head of the Timer list has expired. If it has, it posts the Timer and reschedules it if
-	 * necessary.
-	 */
-	synchronized long postExpiredTimers() {
-		Timer timer;
-		long currentTime;
-		long timeToWait;
-
-		// The timeToWait we return should never be negative and only be zero
-		// when we have no Timers to wait for.
-
-		do {
-			timer = firstTimer;
-			if (timer == null)
-				return 0;
-
-			currentTime = System.currentTimeMillis();
-			timeToWait = timer.expirationTime - currentTime;
-
-			if (timeToWait <= 0) {
-				try {
-					timer.post(); // have timer post an event
-				} catch (SecurityException e) {
-				}
-
-				// Remove the timer from the queue
-				removeTimer(timer);
-
-				// This tries to keep the interval uniform at
-				// the cost of drift.
-				if (timer.isRepeats()) {
-					addTimer(timer, currentTime + timer.getDelay());
-				}
-			}
-
-			// Allow other threads to call addTimer() and removeTimer()
-			// even when we are posting Timers like mad. Since the wait()
-			// releases the lock, be sure not to maintain any state
-			// between iterations of the loop.
-
-			try {
-				wait(1);
-			} catch (InterruptedException e) {
-			}
-		} while (timeToWait <= 0);
-
-		return timeToWait;
-	}
-
-	synchronized void removeTimer(Timer timer) {
-		Timer previousTimer;
-		Timer nextTimer;
-		boolean found;
-
-		if (!timer.running)
-			return;
-
-		previousTimer = null;
-		nextTimer = firstTimer;
-		found = false;
-
-		while (nextTimer != null) {
-			if (nextTimer == timer) {
-				found = true;
-				break;
-			}
-
-			previousTimer = nextTimer;
-			nextTimer = nextTimer.nextTimer;
-		}
-
-		if (!found)
-			return;
-
-		if (previousTimer == null) {
-			firstTimer = timer.nextTimer;
-		} else {
-			previousTimer.nextTimer = timer.nextTimer;
-		}
-
-		timer.expirationTime = 0;
-		timer.nextTimer = null;
-		timer.running = false;
-	}
-
-	public synchronized void run() {
-		long timeToWait;
-
-		try {
-			while (running) {
-				timeToWait = postExpiredTimers();
-				try {
-					wait(timeToWait);
-				} catch (InterruptedException e) {
-				}
-			}
-		} catch (ThreadDeath td) {
-			running = false;
-			// Mark all the timers we contain as not being queued.
-			Timer timer = firstTimer;
-			while (timer != null) {
-				timer.eventQueued = false;
-				timer = timer.nextTimer;
-			}
-			synchronized (this) {
-				if (!this.running)
-					start();
-			}
-			throw td;
-		}
-	}
-
-	public static TimerQueue singleton() {
-		if (singleton == null)
-			synchronized (classLock) {
-				singleton = new TimerQueue();
-			}
-		return singleton;
-	}
-
-	synchronized void start() {
-		if (running) {
-			throw new RuntimeException(WTPCommonUIResourceHandler.TimerQueue_ERROR_0); //$NON-NLS-1$
-		}
-		Thread timerThread = new Thread(this, "TimerQueue");//$NON-NLS-1$
-		try {
-			timerThread.setDaemon(true);
-		} catch (SecurityException e) {
-		}
-		timerThread.start();
-		running = true;
-	}
-
-	synchronized void stop() {
-		running = false;
-		notify();
-	}
-
-	public synchronized String toString() {
-		StringBuffer buf;
-		Timer nextTimer;
-
-		buf = new StringBuffer();
-		buf.append("TimerQueue (");//$NON-NLS-1$
-
-		nextTimer = firstTimer;
-		while (nextTimer != null) {
-			buf.append(nextTimer.toString());
-
-			nextTimer = nextTimer.nextTimer;
-			if (nextTimer != null)
-				buf.append(", ");//$NON-NLS-1$
-		}
-
-		buf.append(")");//$NON-NLS-1$
-		return buf.toString();
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/UIEnablementIdentifier.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/UIEnablementIdentifier.java
deleted file mode 100644
index 675dc55..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/UIEnablementIdentifier.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Feb 12, 2004
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.ui.activities.IActivityManager;
-import org.eclipse.ui.activities.IIdentifier;
-import org.eclipse.ui.activities.IIdentifierListener;
-import org.eclipse.ui.activities.IdentifierEvent;
-import org.eclipse.wst.common.frameworks.internal.enablement.EnablementIdentifier;
-import org.eclipse.wst.common.frameworks.internal.enablement.EnablementIdentifierEvent;
-import org.eclipse.wst.common.frameworks.internal.enablement.IEnablementManager;
-
-
-/**
- * @author schacher
- * 
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-class UIEnablementIdentifier extends EnablementIdentifier implements IIdentifierListener {
-
-	private IIdentifier activityIdentifier;
-
-	/**
-	 * @param id
-	 * @param project
-	 */
-	public UIEnablementIdentifier(String id, IProject project) {
-		super(id, project);
-		activityIdentifier = getActivityManager().getIdentifier(id);
-		activityIdentifier.addIdentifierListener(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.activities.IIdentifierListener#identifierChanged(org.eclipse.ui.activities.IdentifierEvent)
-	 */
-	public void identifierChanged(IdentifierEvent identifierEvent) {
-		boolean enabledChanged = resetEnabled();
-		EnablementIdentifierEvent evt = new EnablementIdentifierEvent(this, false, enabledChanged);
-		fireIdentifierChanged(evt);
-	}
-
-	protected IActivityManager getActivityManager() {
-		return ((UIEnablementManager) IEnablementManager.INSTANCE).getActivityManager();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclispe.wst.common.frameworks.internal.enablement.EnablementIdentifier#getNewEnabled()
-	 */
-	protected boolean getNewEnabled() {
-		return activityIdentifier.isEnabled() && super.getNewEnabled();
-	}
-
-
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/UIEnablementManager.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/UIEnablementManager.java
deleted file mode 100644
index 44014e2..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/UIEnablementManager.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Feb 3, 2004
- *
- * To change the template for this generated file go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.activities.IActivityManager;
-import org.eclipse.ui.activities.IWorkbenchActivitySupport;
-import org.eclipse.wst.common.frameworks.internal.enablement.EnablementIdentifier;
-import org.eclipse.wst.common.frameworks.internal.enablement.EnablementManager;
-
-/**
- * @author mdelder
- */
-public class UIEnablementManager extends EnablementManager {
-
-	private IWorkbenchActivitySupport activitySupport = null;
-
-	public UIEnablementManager() {
-		super();
-	}
-
-	protected IActivityManager getActivityManager() {
-		return getActivitySupport().getActivityManager();
-	}
-
-	/**
-	 * @return Returns the activitySupport.
-	 */
-	protected IWorkbenchActivitySupport getActivitySupport() {
-		if (activitySupport == null)
-			activitySupport = PlatformUI.getWorkbench().getActivitySupport();
-		return activitySupport;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.enablement.EnablementManager#createIdentifier(java.lang.String,
-	 *      org.eclipse.core.resources.IProject)
-	 */
-	protected EnablementIdentifier createIdentifier(String identifierId, IProject project) {
-		return new UIEnablementIdentifier(identifierId, project);
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/UIOperationHandler.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/UIOperationHandler.java
deleted file mode 100644
index 53ccd53..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/UIOperationHandler.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Aug 5, 2004
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.wst.common.frameworks.internal.operations.IOperationHandler;
-
-
-/**
- * @author dfholt
- * 
- * TODO To change the template for this generated type comment go to Window - Preferences - Java -
- * Code Generation - Code and Comments
- */
-public class UIOperationHandler implements IOperationHandler {
-	protected Shell parentShell;
-	final public static String DEFAULT_INFORMATION = "Information"; //$NON-NLS-1$
-	final public static String DEFAULT_ERROR = "Error"; //$NON-NLS-1$
-	final public static String DEFAULT_CONFIRM = "Confirm"; //$NON-NLS-1$
-	protected String informationTitle = DEFAULT_INFORMATION;
-	protected String confirmTitle = DEFAULT_CONFIRM;
-	protected String errorTitle = DEFAULT_ERROR;
-
-	/**
-	 * UIOperationHandler constructor comment.
-	 */
-	public UIOperationHandler() {
-		super();
-	}
-
-	/**
-	 * UIOperationHandler constructor comment.
-	 */
-	public UIOperationHandler(Shell parent) {
-		super();
-		parentShell = parent;
-	}
-
-	/**
-	 * A decision needs to made as to whether an action/operation can continue
-	 */
-	public boolean canContinue(String message) {
-		return MessageDialog.openQuestion(getParentShell(), getConfirmTitle(), message);
-	}
-
-	/**
-	 * A decision needs to made as to whether an action/operation can continue
-	 */
-	public boolean canContinue(String message, String[] items) {
-		return ListMessageDialog.openQuestion(getParentShell(), getConfirmTitle(), message, items);
-	}
-
-	/**
-	 * A decision needs to made as to whether an action/operation can continue. The boolean array
-	 * will return two booleans. The first indicates their response to the original question and the
-	 * second indicates if they selected the apply to all check box.
-	 * 
-	 * Return the return code for the dialog. 0 = Yes, 1 = Yes to all, 2 = No
-	 */
-	public int canContinueWithAllCheck(String message) {
-		MessageDialog dialog = new MessageDialog(getParentShell(), getConfirmTitle(), null, // accept
-					// the
-					// default
-					// window
-					// icon
-					message, MessageDialog.QUESTION, new String[]{IDialogConstants.YES_LABEL, IDialogConstants.YES_TO_ALL_LABEL, IDialogConstants.NO_LABEL}, 1); // yes
-		// is
-		// the
-		// default
-		return dialog.open();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.j2ee.operations.IOperationHandler#canContinueWithAllCheckAllowCancel(java.lang.String)
-	 */
-	public int canContinueWithAllCheckAllowCancel(String message) {
-		MessageDialog dialog = new MessageDialog(getParentShell(), getConfirmTitle(), null, // accept
-					// the
-					// default
-					// window
-					// icon
-					message, MessageDialog.QUESTION, new String[]{IDialogConstants.YES_LABEL, IDialogConstants.YES_TO_ALL_LABEL, IDialogConstants.NO_LABEL, IDialogConstants.CANCEL_LABEL}, 1); // yes
-		// is
-		// the
-		// default
-		return dialog.open();
-	}
-
-	/**
-	 * An error has occurred
-	 */
-	public void error(String message) {
-		MessageDialog.openError(getParentShell(), getErrorTitle(), message);
-	}
-
-	/**
-	 * The dialog title to be used for confirmations
-	 */
-	public java.lang.String getConfirmTitle() {
-		return confirmTitle;
-	}
-
-	/**
-	 * The dialog title to be used for errors
-	 */
-	public java.lang.String getErrorTitle() {
-		return errorTitle;
-	}
-
-	/**
-	 * The dialog title to be used for information
-	 */
-	public java.lang.String getInformationTitle() {
-		return informationTitle;
-	}
-
-	public Shell getParentShell() {
-		if (parentShell == null)
-			parentShell = WTPUIPlugin.getPluginWorkbench().getActiveWorkbenchWindow().getShell();
-
-		return parentShell;
-	}
-
-	/**
-	 * An informational message needs to be presented
-	 */
-	public void inform(String message) {
-		MessageDialog.openInformation(getParentShell(), getInformationTitle(), message);
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (8/9/2001 11:51:36 AM)
-	 * 
-	 * @param newConfirmTitle
-	 *            java.lang.String
-	 */
-	public void setConfirmTitle(java.lang.String newConfirmTitle) {
-		confirmTitle = newConfirmTitle;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (8/9/2001 11:51:36 AM)
-	 * 
-	 * @param newErrorTitle
-	 *            java.lang.String
-	 */
-	public void setErrorTitle(java.lang.String newErrorTitle) {
-		errorTitle = newErrorTitle;
-	}
-
-	/**
-	 * Insert the method's description here. Creation date: (8/9/2001 11:51:36 AM)
-	 * 
-	 * @param newInformationTitle
-	 *            java.lang.String
-	 */
-	public void setInformationTitle(java.lang.String newInformationTitle) {
-		informationTitle = newInformationTitle;
-	}
-
-	/**
-	 * @see com.ibm.etools.j2ee.operations.IOperationHandler#getContext()
-	 */
-	public Object getContext() {
-		return getParentShell();
-	}
-
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/UITesterImpl.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/UITesterImpl.java
deleted file mode 100644
index 3e80256..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/UITesterImpl.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Oct 27, 2003
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-import org.eclipse.jem.util.UITester;
-import org.eclipse.ui.PlatformUI;
-
-
-/**
- * @author schacher
- * 
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public class UITesterImpl implements UITester {
-
-	/**
-	 *  
-	 */
-	public UITesterImpl() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.UITester#isCurrentContextUI()
-	 */
-	public boolean isCurrentContextUI() {
-		try {
-			return PlatformUI.isWorkbenchRunning() || PlatformUI.getWorkbench().isClosing();
-		} catch (RuntimeException e) {
-			return false;
-		}
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/ValidationStatus.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/ValidationStatus.java
deleted file mode 100644
index e3204e8..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/ValidationStatus.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.swt.widgets.Control;
-
-/**
- * This object encompas a set of Validation status Creation date: (9/10/2001 5:35:12 PM)
- * 
- * @author: Administrator
- */
-public class ValidationStatus {
-	Hashtable errMsgs = new Hashtable();
-	Hashtable errStatus = new Hashtable();
-	Hashtable tControls = new Hashtable();
-	Map warnMsgs;
-	Map warnStatus;
-
-	/**
-	 * ValidationStatus constructor comment.
-	 */
-	public ValidationStatus() {
-		super();
-	}
-
-	/*
-	 * Look for any error. If there is more than one, return errors according to their key. i.e.,
-	 * lower key errors will be returned first.
-	 */
-	public String getLastErrMsg() {
-
-		Enumeration e = errStatus.keys();
-		String[] errs = new String[errStatus.size()];
-		for (int i = 0; i < errs.length; i++)
-			errs[i] = null;
-		boolean foundOne = false;
-		while (e.hasMoreElements()) {
-			Integer key = (Integer) e.nextElement();
-			if (!((Boolean) errStatus.get(key)).booleanValue()) {
-				errs[key.intValue() % errs.length] = (String) errMsgs.get(key);
-				foundOne = true;
-			}
-		}
-		if (foundOne)
-			for (int i = 0; i < errs.length; i++)
-				if (errs[i] != null)
-					return errs[i];
-		return null;
-	}
-
-	private Map getWarningMsgs() {
-		if (warnMsgs == null)
-			warnMsgs = new HashMap();
-		return warnMsgs;
-	}
-
-	private Map getWarningStatusMap() {
-		if (warnStatus == null)
-			warnStatus = new HashMap();
-		return warnStatus;
-	}
-
-	/*
-	 * Look for any warning. If there is more than one, return warnings according to their key.
-	 * i.e., lower key errors will be returned first.
-	 */
-	public String getLastWarningMsg() {
-		if (warnStatus == null)
-			return null;
-		Iterator e = warnStatus.keySet().iterator();
-		String[] warns = new String[warnStatus.size()];
-		for (int i = 0; i < warns.length; i++)
-			warns[i] = null;
-		boolean foundOne = false;
-		while (e.hasNext()) {
-			Integer key = (Integer) e.next();
-			if (!((Boolean) warnStatus.get(key)).booleanValue()) {
-				warns[key.intValue() % warns.length] = (String) warnMsgs.get(key);
-				foundOne = true;
-			}
-		}
-		if (foundOne)
-			for (int i = 0; i < warns.length; i++)
-				if (warns[i] != null)
-					return warns[i];
-		return null;
-	}
-
-	public String getLastErrMsgAndFocus() {
-
-		Enumeration e = errStatus.keys();
-
-		Integer theOne = null;
-		while (e.hasMoreElements()) {
-			Integer key = (Integer) e.nextElement();
-			if (!((Boolean) errStatus.get(key)).booleanValue()) {
-				if (theOne == null || key.intValue() < theOne.intValue()) {
-					theOne = key;
-				}
-			}
-		}
-		if (theOne != null) {
-			Control control = (Control) tControls.get(theOne);
-			if (control != null) {
-				control.setFocus();
-			}
-			return ((String) errMsgs.get(theOne));
-		}
-		return null;
-	}
-
-	public boolean hasError(Integer key) {
-		Boolean stat = (Boolean) errStatus.get(key);
-		if (stat != null)
-			return stat.booleanValue();
-		return true;
-	}
-
-	public void setControl(Integer key, Control control) {
-		tControls.put(key, control);
-	}
-
-	public void setErrorStatus(Integer key, Boolean status, String msg) {
-		errMsgs.put(key, msg);
-		errStatus.put(key, status);
-	}
-
-	public void setErrorStatus(Integer key, String msg) {
-		errMsgs.put(key, msg);
-		errStatus.put(key, new Boolean(false));
-	}
-
-	public void setWarningStatus(Integer key, String msg) {
-		getWarningMsgs().put(key, msg);
-		getWarningStatusMap().put(key, new Boolean(false));
-	}
-
-	public void setOKStatus(Integer key) {
-		errMsgs.put(key, ""); //$NON-NLS-1$
-		errStatus.put(key, new Boolean(true));
-		if (warnMsgs != null)
-			warnMsgs.put(key, ""); //$NON-NLS-1$
-		if (warnStatus != null)
-			warnStatus.put(key, new Boolean(true));
-	}
-
-	public void setStatus(Integer key, boolean ok, String msg) {
-		errMsgs.put(key, msg);
-		errStatus.put(key, new Boolean(ok));
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPActivityBridgeHelperImpl.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPActivityBridgeHelperImpl.java
deleted file mode 100644
index a8440eb..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPActivityBridgeHelperImpl.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on May 4, 2004
- * 
- */
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.ui.IPluginContribution;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.activities.IActivityManager;
-import org.eclipse.ui.activities.IIdentifier;
-import org.eclipse.ui.activities.IWorkbenchActivitySupport;
-import org.eclipse.ui.activities.WorkbenchActivityHelper;
-import org.eclipse.wst.common.frameworks.internal.activities.WTPActivityBridgeHelper;
-
-
-/**
- * @author jsholl
- *  
- */
-public class WTPActivityBridgeHelperImpl implements WTPActivityBridgeHelper {
-
-	private IWorkbenchActivitySupport workbenchActivitySupport = null;
-	private IActivityManager activityManager = null;
-
-	public WTPActivityBridgeHelperImpl() {
-		workbenchActivitySupport = PlatformUI.getWorkbench().getActivitySupport();
-		activityManager = workbenchActivitySupport.getActivityManager();
-	}
-
-	public void enableActivity(String activityID, boolean enabled) {
-		Set enabledActivities = activityManager.getEnabledActivityIds();
-		Set newEnabledActivities = null;
-		if (enabled && !enabledActivities.contains(activityID)) {
-			newEnabledActivities = new HashSet();
-			newEnabledActivities.addAll(enabledActivities);
-			newEnabledActivities.add(activityID);
-		}
-		if (!enabled && enabledActivities.contains(activityID)) {
-			newEnabledActivities = new HashSet();
-			newEnabledActivities.addAll(enabledActivities);
-			newEnabledActivities.remove(activityID);
-		}
-		if (null != newEnabledActivities) {
-			workbenchActivitySupport.setEnabledActivityIds(newEnabledActivities);
-		}
-	}
-
-	public Set getEnabledActivityIds() {
-		return activityManager.getEnabledActivityIds();
-	}
-
-	public void setEnabledActivityIds(Set activityIDs) {
-		workbenchActivitySupport.setEnabledActivityIds(activityIDs);
-	}
-
-	public Set getActivityIDsFromContribution(final String localID, final String pluginID) {
-		IIdentifier identifier = activityManager.getIdentifier(WorkbenchActivityHelper.createUnifiedId(new IPluginContribution() {
-			public String getLocalId() {
-				return localID;
-			}
-
-			public String getPluginId() {
-				return pluginID;
-			}
-		}));
-		return identifier.getActivityIds();
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPActivityHelper.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPActivityHelper.java
deleted file mode 100644
index 37a0221..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPActivityHelper.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Apr 9, 2004
- *
- * To change the template for this generated file go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-import org.eclipse.ui.IPluginContribution;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.activities.IIdentifier;
-import org.eclipse.ui.activities.IWorkbenchActivitySupport;
-
-/**
- * @author jsholl
- * 
- * To change the template for this generated type comment go to Window - Preferences - Java - Code
- * Generation - Code and Comments
- */
-public class WTPActivityHelper {
-
-	/**
-	 * @return whether the UI is set up to filter contributions (has defined activity categories).
-	 */
-	public static final boolean isFiltering() {
-		return !PlatformUI.getWorkbench().getActivitySupport().getActivityManager().getDefinedActivityIds().isEmpty();
-	}
-
-	public static boolean allowUseOf(Object object) {
-		if (!isFiltering())
-			return true;
-		if (object instanceof IPluginContribution) {
-			IPluginContribution contribution = (IPluginContribution) object;
-			if (contribution.getPluginId() != null) {
-				IWorkbenchActivitySupport workbenchActivitySupport = PlatformUI.getWorkbench().getActivitySupport();
-				IIdentifier identifier = workbenchActivitySupport.getActivityManager().getIdentifier(createUnifiedId(contribution));
-				return identifier.isEnabled();
-			}
-		}
-		return true;
-	}
-
-
-	public static final String createUnifiedId(IPluginContribution contribution) {
-		if (contribution.getPluginId() != null)
-			return contribution.getPluginId() + '/' + contribution.getLocalId();
-		return contribution.getLocalId();
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPCommonUIResourceHandler.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPCommonUIResourceHandler.java
deleted file mode 100644
index 6b250ff..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPCommonUIResourceHandler.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on May 23, 2004
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Style - Code Templates
- */
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * @author vijayb
- * 
- * TODO To change the template for this generated type comment go to Window - Preferences - Java -
- * Code Style - Code Templates
- */
-public class WTPCommonUIResourceHandler extends NLS {
-	private static final String BUNDLE_NAME = "wtpcommonui";//$NON-NLS-1$
-
-	private WTPCommonUIResourceHandler() {
-		// Do not instantiate
-	}
-
-	public static String Project_location_;
-	public static String WTPOperationAction_UI_1;
-	public static String MasterDescriptor_UI_1;
-	public static String WTPOptionalOperationDataModel_UI_1;
-	public static String WTPOperationAction_UI_0;
-	public static String WTPOptionalOperationDataModel_UI_0;
-	public static String MULTIPLE_MODULE_PREF_TEXT;
-	public static String IActionWTPOperation_UI_0;
-	public static String MasterDescriptor_ERROR_2;
-	public static String Name_;
-	public static String WTPWizard_UI_1;
-	public static String WTPWizard_UI_0;
-	public static String Browse_;
-	public static String ExtendableWizard_UI_0;
-	public static String ExtendedWizardPage_ERROR_1;
-	public static String ExtendedWizardPage_ERROR_0;
-	public static String WTPActionDialog_UI_0;
-	public static String TimerQueue_ERROR_0;
-	public static String Timer_UI_1;
-	public static String Timer_UI_0;
-	public static String WizardPageExtensionManager_UI_4;
-	public static String WizardPageExtensionManager_UI_3;
-	public static String WizardPageExtensionManager_UI_2;
-	public static String WizardPageExtensionManager_UI_1;
-	public static String WizardPageExtensionManager_UI_0;
-	public static String Delete_UI_0;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, WTPCommonUIResourceHandler.class);
-	}
-
-	public static String getString(String key, Object[] args) {
-		return NLS.bind(key, args);
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPGenericActionIds.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPGenericActionIds.java
deleted file mode 100644
index faaa453..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPGenericActionIds.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Jun 16, 2004
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Style - Code Templates
- */
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-/**
- * @author mdelder
- * 
- * TODO To change the template for this generated type comment go to Window - Preferences - Java -
- * Code Style - Code Templates
- */
-public interface WTPGenericActionIds {
-
-	String CUT = "org.eclipse.wst.common.generic.Cut"; //$NON-NLS-1$
-	String COPY = "org.eclipse.wst.common.generic.Copy"; //$NON-NLS-1$
-	String PASTE = "org.eclipse.wst.common.generic.Paste"; //$NON-NLS-1$
-	String RENAME = "org.eclipse.wst.common.generic.Rename"; //$NON-NLS-1$
-	String DELETE = "org.eclipse.wst.common.generic.Delete"; //$NON-NLS-1$
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPUIPlugin.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPUIPlugin.java
deleted file mode 100644
index 337a9f5..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPUIPlugin.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.eclipse.wst.common.frameworks.internal.operations.IHeadlessRunnableWithProgress;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class WTPUIPlugin extends AbstractUIPlugin {
-
-	public static final String PLUGIN_ID = "org.eclipse.wst.common.frameworks.ui"; //$NON-NLS-1$
-	public static final String EXTENDED_VIEWER_REGISTRY_EXTENSION_POINT = "extendedViewer"; //$NON-NLS-1$
-	// The shared instance.
-	private static WTPUIPlugin plugin;
-	// Resource bundle.
-	private ResourceBundle resourceBundle;
-
-	/**
-	 * The constructor.
-	 */
-	public WTPUIPlugin() {
-		super();
-		plugin = this;
-		try {
-			resourceBundle = ResourceBundle.getBundle("org.eclipse.wst.common.frameworks.internal.ui.WTPUIPluginResources"); //$NON-NLS-1$
-		} catch (MissingResourceException x) {
-			resourceBundle = null;
-		}
-	}
-
-	/**
-	 * @param string
-	 * @return
-	 */
-	public static IStatus createErrorStatus(String message) {
-		return createErrorStatus(message, null);
-	}
-
-	/**
-	 * @param string
-	 * @return
-	 */
-	public static IStatus createErrorStatus(String message, Throwable exception) {
-		return new Status(IStatus.ERROR, PLUGIN_ID, -1, message, exception);
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static WTPUIPlugin getDefault() {
-		return plugin;
-	}
-
-	public static Logger getLogger() {
-		return Logger.getLogger(PLUGIN_ID);
-	}
-
-	/**
-	 * Returns the workspace instance.
-	 */
-	public static IWorkspace getWorkspace() {
-		return ResourcesPlugin.getWorkspace();
-	}
-
-	/**
-	 * Return the workbench
-	 * 
-	 * This method is internal to the j2ee plugin and must not be called by any other plugins.
-	 */
-
-	public static IWorkbench getPluginWorkbench() {
-		return getDefault().getWorkbench();
-
-	}
-
-	public static RunnableOperationWrapper getRunnableWithProgress(final IUndoableOperation operation) {
-		return new RunnableOperationWrapper(operation);
-	}
-
-	public static IRunnableWithProgress getRunnableWithProgress(IHeadlessRunnableWithProgress aHeadlessRunnableWithProgress) {
-		return new RunnableWithProgressWrapper(aHeadlessRunnableWithProgress);
-	}
-
-	/**
-	 * Returns the string from the plugin's resource bundle, or 'key' if not found.
-	 */
-	public static String getResourceString(String key) {
-		ResourceBundle bundle = WTPUIPlugin.getDefault().getResourceBundle();
-		try {
-			return (bundle != null ? bundle.getString(key) : key);
-		} catch (MissingResourceException e) {
-			return key;
-		}
-	}
-
-	/**
-	 * Returns the plugin's resource bundle,
-	 */
-	public ResourceBundle getResourceBundle() {
-		return resourceBundle;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WorkspaceModifyComposedOperation.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WorkspaceModifyComposedOperation.java
deleted file mode 100644
index fed29fc..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WorkspaceModifyComposedOperation.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-
-/**
- * An operation which delegates its work to a runnable that modifies the workspace.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- */
-public class WorkspaceModifyComposedOperation extends org.eclipse.ui.actions.WorkspaceModifyOperation {
-	protected List fRunnables;
-
-	public WorkspaceModifyComposedOperation(ISchedulingRule rule) {
-		super(rule);
-	}
-
-	/**
-	 * Creates a new operation which will delegate its work to the given runnable.
-	 */
-	public WorkspaceModifyComposedOperation() {
-		super();
-	}
-
-	public WorkspaceModifyComposedOperation(ISchedulingRule rule, List nestedRunnablesWithProgress) {
-		super(rule);
-		fRunnables = nestedRunnablesWithProgress;
-	}
-
-	public WorkspaceModifyComposedOperation(List nestedRunnablesWithProgress) {
-		super();
-		fRunnables = nestedRunnablesWithProgress;
-	}
-
-	/**
-	 * Creates a new operation which will delegate its work to the given runnable.
-	 * 
-	 * @param content
-	 *            the runnable to delegate to when this operation is executed
-	 */
-	public WorkspaceModifyComposedOperation(IRunnableWithProgress nestedOp) {
-		super();
-		getRunnables().add(nestedOp);
-	}
-
-	public boolean addRunnable(IRunnableWithProgress nestedOp) {
-		return getRunnables().add(nestedOp);
-	}
-
-	protected void execute(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-		int size = fRunnables.size();
-		monitor.beginTask("", size);//$NON-NLS-1$
-		for (int i = 0; i < fRunnables.size(); i++) {
-			IRunnableWithProgress op = (IRunnableWithProgress) fRunnables.get(i);
-			op.run(new SubProgressMonitor(monitor, 1, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK));
-		}
-	}
-
-	protected List getRunnables() {
-		if (fRunnables == null)
-			fRunnables = new ArrayList(3);
-		return fRunnables;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/package.html b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/package.html
deleted file mode 100644
index fb8fe10..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/package.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<html>
-<head>
-<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-<link rel="stylesheet" href="../../../../../..//apistyles.css" type="text/css">
-<title>wtp operation api overview</title>
-</head>
-<body>
-<p>
-			The WTP Wizard API allows clients to build wizards in conjunction with
-			the WTP Operation Framework quickly and with minimal effort.
-		</p>
-<table width="500">
-<tr>
-<td>
-<p>Under Construction.</p>
-</td>
-</tr>
-</table>
-<table cellpadding="10" cellspacing="10">
-<tr>
-<td>
-<p>
-<img src="escape_out_to_source_folder level/overview/your_image.jpg"></p>
-</td>
-</tr>
-<tr>
-<td>
-<p>
-<i>Figure 1: Image description</i>
-</p>
-</td>
-</tr>
-</table>
-</body>
-</html>
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/package.xml b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/package.xml
deleted file mode 100644
index e217a53..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/package.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<html>
-	<head>
-		<meta
-			name="root"
-			content="../../../../../../" />
-		<title>wtp operation api overview</title>
-	</head>
-
-	<body>
-		<abstract>
-			The WTP Wizard API allows clients to build wizards in conjunction with
-			the WTP Operation Framework quickly and with minimal effort.
-		</abstract>
-		<p>Under Construction.</p>
-		<img src="escape_out_to_source_folder level/overview/your_image.jpg" caption="Image description" />
-	</body>
-</html>
diff --git a/plugins/org.eclipse.wst.common.frameworks/.classpath b/plugins/org.eclipse.wst.common.frameworks/.classpath
deleted file mode 100644
index 2bf4212..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src/"/>
-	<classpathentry kind="src" path="src-non_workbench/"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/plugins/org.eclipse.wst.common.frameworks/.cvsignore b/plugins/org.eclipse.wst.common.frameworks/.cvsignore
deleted file mode 100644
index fd6af57..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/.cvsignore
+++ /dev/null
@@ -1,9 +0,0 @@
-bin
-build.xml
-temp.folder
-common_core.jar
-common.jar
-common_coresrc.zip
-commonsrc.zip
-@dot
-src.zip
diff --git a/plugins/org.eclipse.wst.common.frameworks/.options b/plugins/org.eclipse.wst.common.frameworks/.options
deleted file mode 100644
index 2eaab8a..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/.options
+++ /dev/null
@@ -1,3 +0,0 @@
-org.eclipse.wtp.common/debug/logtrace=false
-org.eclipse.wtp.common/debug/logtracefile=false
-org.eclipse.wtp.common/debug/loglevel=WARNING
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/.project b/plugins/org.eclipse.wst.common.frameworks/.project
deleted file mode 100644
index 30f458a..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.common.frameworks</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.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/plugins/org.eclipse.wst.common.frameworks/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.common.frameworks/META-INF/MANIFEST.MF
deleted file mode 100644
index 6f695f4..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,24 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: org.eclipse.wst.common.frameworks
-Bundle-SymbolicName: org.eclipse.wst.common.frameworks; singleton:=true
-Bundle-Version: 1.0.1.qualifier
-Bundle-Activator: org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin
-Bundle-Vendor: %provider
-Bundle-Localization: plugin
-Export-Package: .,
- org.eclipse.wst.common.frameworks.datamodel,
- org.eclipse.wst.common.frameworks.datamodel.properties,
- org.eclipse.wst.common.frameworks.internal,
- org.eclipse.wst.common.frameworks.internal.activities,
- org.eclipse.wst.common.frameworks.internal.datamodel,
- org.eclipse.wst.common.frameworks.internal.enablement,
- org.eclipse.wst.common.frameworks.internal.enablement.nonui,
- org.eclipse.wst.common.frameworks.internal.operations,
- org.eclipse.wst.common.frameworks.internal.plugin
-Require-Bundle: org.eclipse.core.resources,
- org.eclipse.core.runtime,
- org.eclipse.core.commands,
- org.eclipse.jem.util,
- org.eclipse.wst.common.environment
-Eclipse-AutoStart: true
diff --git a/plugins/org.eclipse.wst.common.frameworks/about.html b/plugins/org.eclipse.wst.common.frameworks/about.html
deleted file mode 100644
index 6f6b96c..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/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>February 24, 2005</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/plugins/org.eclipse.wst.common.frameworks/build.properties b/plugins/org.eclipse.wst.common.frameworks/build.properties
deleted file mode 100644
index 4701114..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/build.properties
+++ /dev/null
@@ -1,22 +0,0 @@
-###############################################################################
-# Copyright (c) 2003, 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
-###############################################################################
-bin.includes = plugin.xml,\
-               .options,\
-               META-INF/,\
-               plugin.properties,\
-               about.html,\
-               .
-jars.compile.order = .
-src.includes = schema/,\
-               component.xml
-output.. = bin/
-source.. = src-non_workbench/,\
-           src/
diff --git a/plugins/org.eclipse.wst.common.frameworks/component.xml b/plugins/org.eclipse.wst.common.frameworks/component.xml
deleted file mode 100644
index 761526a..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/component.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<component  xmlns="http://eclipse.org/wtp/releng/tools/component-model" name="org.eclipse.wst.common.frameworks">
-  <description url=""></description>
-  <component-depends unrestricted="true"></component-depends>
-  <plugin id="org.eclipse.wst.common.frameworks" fragment="false"/>
-  <plugin id="org.eclipse.wst.common.frameworks.ui" fragment="false"/>
-  <plugin id="org.eclipse.wst.common.environment" fragment="false"/>
-
-  <package name="org.eclipse.wst.common.environment">
-    <type name="Choice" subclass="false" instantiate="false" />
-    <type name="EnvironmentException" subclass="false" instantiate="false" />
-    <type name="EnvironmentService" subclass="false" instantiate="false" />
-    <type name="IEnvironment" implement="false" />
-    <type name="ILog" implement="false" />
-    <type name="IStatusHandler" implement="false" />
-    <type name="NullStatusHandler" subclass="false" instantiate="false" />
-    <type name="StatusException" subclass="false" instantiate="false" />
-  </package>
- 
-  <package name="org.eclipse.wst.common.environment.uri">
-    <type name="IURI" implement="false" />
-    <type name="IURIFactory" implement="false" />
-    <type name="IURIFilter" implement="false" />
-    <type name="IURIScheme" implement="false" />
-    <type name="IURIVisitor" implement="false" />
-    <type name="SimpleURIFactory" subclass="false" instantiate="false" />
-    <type name="URIException" subclass="false" instantiate="false" />
-  </package>
-
-  <package name="org.eclipse.wst.common.frameworks.datamodel"></package>
-</component>
diff --git a/plugins/org.eclipse.wst.common.frameworks/plugin.properties b/plugins/org.eclipse.wst.common.frameworks/plugin.properties
deleted file mode 100644
index d1cb8b8..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/plugin.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-###############################################################################
-# Copyright (c) 2003, 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
-###############################################################################
-provider=Eclipse.org
-OperationExtension=OperationExtension
-Function_Extension_Group=Function Extension Group
-WTPActivityBridgeHelper=WTPActivityBridgeHelper
-DataModelProvider=DataModelProvider
diff --git a/plugins/org.eclipse.wst.common.frameworks/plugin.xml b/plugins/org.eclipse.wst.common.frameworks/plugin.xml
deleted file mode 100644
index 0f4338a..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/plugin.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-   <extension-point id="OperationExtension" name="%OperationExtension" schema="schema/OperationExtension.exsd"/>
-   <extension-point id="functionGroup" name="%Function_Extension_Group" schema="schema/functionGroup.exsd"/>
-   <extension-point id="WTPActivityBridgeHelper" name="%WTPActivityBridgeHelper" schema="schema/WTPActivityBridgeHelper.exsd"/>
-   <extension-point id="DataModelProviderExtension" name="%DataModelProvider" schema="schema/DataModelProviderExtension.exsd"/>
-   
-   <extension
-         id="context.Sensitive.Class.saveHandler"
-         name="Save Handler - Headless Context Class"
-         point="org.eclipse.jem.util.uiContextSensitiveClass">
-      <uiContextSensitiveClass
-            key="saveHandler"
-            context="Headless"
-            className="org.eclipse.wst.common.frameworks.internal.SaveHandlerHeadless">
-      </uiContextSensitiveClass>
-   </extension>
-   <extension
-         id="org.eclipse.wst.common.frameworks.internal.enablement"
-         point="org.eclipse.jem.util.uiContextSensitiveClass">
-      <uiContextSensitiveClass
-            key="org.eclipse.wst.common.frameworks.internal.EnablementDetermination"
-            context="Headless"
-            className="org.eclipse.wst.common.frameworks.internal.enablement.EnablementManager">
-      </uiContextSensitiveClass>
-   </extension>
-
-</plugin>
diff --git a/plugins/org.eclipse.wst.common.frameworks/prepareforpii.xml b/plugins/org.eclipse.wst.common.frameworks/prepareforpii.xml
deleted file mode 100644
index 638c7dc..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/prepareforpii.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<project name="PrepareForPII" default="main" basedir=".">
-		
-	<!-- Setup temp variables -->
-	<target name="init">
-		<property name="nlsDir" value="d:/NLS/Corona/0526"/>
-		<property name="plugin" value="com.ibm.wtp.common"/>
-		<property name="plugindir" value="d:/workspaceCorona/${plugin}"/>
-		<property name="outputDir" value="${nlsDir}/${plugin}"/>
-		
-	
-	</target>
-
-	<!-- Create the destination dir -->
-	<target name="nlsDir" depends="init">
-		<mkdir dir="${nlsDir}"/>
-	</target>
-	
-	<!-- Create the destination dir -->
-	<target name="plugindir" depends="nlsDir">
-		<delete dir="${outputDir}"/>
-		<mkdir dir="${outputDir}"/>
-	</target>
-
-	<!-- Move the files to the correct locations in the workspace. -->
-	<target name="main" depends="plugindir">
-	
-		<messageIdGen folderPath = "${plugindir}" componentId = "E" />
-		
-		<copy todir = "${outputDir}/src" >
-			 <fileset dir="${plugindir}/src">
-           	  <include name="**/*.properties"/>
-  			 </fileset>
-  		</copy>
-
-  		
-	</target>
-</project>
diff --git a/plugins/org.eclipse.wst.common.frameworks/schema/DataModelProviderExtension.exsd b/plugins/org.eclipse.wst.common.frameworks/schema/DataModelProviderExtension.exsd
deleted file mode 100644
index 786c1c3..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/schema/DataModelProviderExtension.exsd
+++ /dev/null
@@ -1,153 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.common.frameworks">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.common.frameworks" id="DataModelProviderExtension" name="Data Model Provider"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="DataModelProvider" minOccurs="0" maxOccurs="1"/>
-            <element ref="ProviderDefinesType" minOccurs="0" maxOccurs="1"/>
-            <element ref="ProviderImplementsType" minOccurs="0" maxOccurs="1"/>
-         </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">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="DataModelProvider">
-      <complexType>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="ProviderDefinesType">
-      <complexType>
-         <attribute name="providerType" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="providerID" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="ProviderImplementsType">
-      <complexType>
-         <attribute name="providerType" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="providerID" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;This extension point is part of an interim API that is still under development and expected to change significantly before reaching stability. It is being made available at this early stage to solicit feedback from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken (repeatedly) as the API evolves.&lt;/b&gt;
-      </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) 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/plugins/org.eclipse.wst.common.frameworks/schema/OperationExtension.exsd b/plugins/org.eclipse.wst.common.frameworks/schema/OperationExtension.exsd
deleted file mode 100644
index 5fafe57..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/schema/OperationExtension.exsd
+++ /dev/null
@@ -1,119 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.common.frameworks">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.common.frameworks" id="OperationExtension" name="Operation Extension"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="operationExtension"/>
-         </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>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="operationExtension">
-      <complexType>
-         <sequence>
-         </sequence>
-         <attribute name="preOperationClass" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="postOperationClass" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;This extension point is part of an interim API that is still under development and expected to change significantly before reaching stability. It is being made available at this early stage to solicit feedback from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken (repeatedly) as the API evolves.&lt;/b&gt;
-      </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) 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/plugins/org.eclipse.wst.common.frameworks/schema/WTPActivityBridgeHelper.exsd b/plugins/org.eclipse.wst.common.frameworks/schema/WTPActivityBridgeHelper.exsd
deleted file mode 100644
index c8f926a..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/schema/WTPActivityBridgeHelper.exsd
+++ /dev/null
@@ -1,103 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.common.frameworks">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.common.frameworks" id="WTPActivityBridgeHelper" name="WTP Activity Bridge Helper"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="WTPActivityBridgeHelper"/>
-         </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">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="WTPActivityBridgeHelper">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;This extension point is part of an interim API that is still under development and expected to change significantly before reaching stability. It is being made available at this early stage to solicit feedback from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken (repeatedly) as the API evolves.&lt;/b&gt;
-      </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) 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/plugins/org.eclipse.wst.common.frameworks/schema/functionGroup.exsd b/plugins/org.eclipse.wst.common.frameworks/schema/functionGroup.exsd
deleted file mode 100644
index 2430e97..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/schema/functionGroup.exsd
+++ /dev/null
@@ -1,186 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.common.frameworks">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.common.frameworks" id="functionGroup" name="Function Extension Group"/>
-      </appInfo>
-      <documentation>
-         A functionGroup provides a grouping of related function that can be contributed to the tools.  For example, a third party component may want to contribute actions, editor pages, edit model resources, and many other functions specific to a given product.  By associating all these functions with a group id, a mechanism is exposed for users to selectively enable and disable baskets of function.  Extension points that allow for a &quot;groupID&quot; attribute generally will hide those functions when the group id is disabled.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <choice>
-            <element ref="functionGroup" minOccurs="1" maxOccurs="unbounded"/>
-            <element ref="functionGroupPatternBinding" minOccurs="1" maxOccurs="unbounded"/>
-         </choice>
-         <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">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="functionGroup">
-      <annotation>
-         <documentation>
-            Extension point definition for a group.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="functionGroupID" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A unique id for the group.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A human readable name.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A short description of the group.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="url" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="priority" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Ordering magnitude of plugins
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="initializerClassName" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Class used to determine plugin enablement
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="functionGroupPatternBinding">
-      <annotation>
-         <documentation>
-            This element allows one to bind function groups to patterns.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="functionGroupID" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique identifier of the function group to bind.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="pattern" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The pattern to be bound. Patterns are regular expressions which match unique identifiers.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;pre&gt;
-   &lt;extension
-         point=&quot;org.eclipse.wst.common.frameworks.functionGroup&quot;&gt;
-      &lt;functionGroup
-            name=&quot;Acme Co. Function Extension&quot;
-            functionGroupID=&quot;com.acme.acmepro&quot;
-            description=&quot;The AcmePro Extensions add integration to the Acme Web Server.&quot;
-            enabledByDefault=&quot;true&quot;
-            icon=&quot;...&quot;
-            url=&quot;http://www.acme.com/&quot;/&gt;
-   &lt;/extension&gt;
-&lt;/pre&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) 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/plugins/org.eclipse.wst.common.frameworks/src-non_workbench/org/eclipse/wst/common/frameworks/internal/enablement/nonui/IWFTWrappedException.java b/plugins/org.eclipse.wst.common.frameworks/src-non_workbench/org/eclipse/wst/common/frameworks/internal/enablement/nonui/IWFTWrappedException.java
deleted file mode 100644
index d92bafd..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src-non_workbench/org/eclipse/wst/common/frameworks/internal/enablement/nonui/IWFTWrappedException.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.frameworks.internal.enablement.nonui;
-
-/**
- * Common interface for ArchiveRuntime and ArchiveWrapped exceptions, which can contain nested
- * exceptions
- */
-public interface IWFTWrappedException {
-	/**
-	 * Return the messages from this and all nested exceptions, in order from outermost to innermost
-	 */
-	public String[] getAllMessages();
-
-	/**
-	 * Return the messages from this and all nested exceptions, in order from outermost to
-	 * innermost, concatenated as one
-	 */
-	public String getConcatenatedMessages();
-
-	public Exception getInnerMostNestedException();
-
-	public String getMessage();
-
-	public java.lang.Exception getNestedException();
-
-	public void printStackTrace();
-
-	public void printStackTrace(java.io.PrintStream s);
-
-	public void printStackTrace(java.io.PrintWriter s);
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src-non_workbench/org/eclipse/wst/common/frameworks/internal/enablement/nonui/WFTWrappedException.java b/plugins/org.eclipse.wst.common.frameworks/src-non_workbench/org/eclipse/wst/common/frameworks/internal/enablement/nonui/WFTWrappedException.java
deleted file mode 100644
index 9a59c94..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src-non_workbench/org/eclipse/wst/common/frameworks/internal/enablement/nonui/WFTWrappedException.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.frameworks.internal.enablement.nonui;
-
-//import com.ibm.etools.wft.nls.WFTUtilsResourceHandler;
-
-
-
-/**
- * Insert the type's description here. Creation date: (04/03/01 11:12:51 AM)
- * 
- * @author: Administrator
- */
-public class WFTWrappedException extends java.lang.reflect.InvocationTargetException {
-	/**
-	 * Comment for <code>serialVersionUID</code>
-	 */
-	private static final long serialVersionUID = -6885044277377784429L;
-
-	/**
-	 * WFTWrappedException constructor comment.
-	 */
-	protected WFTWrappedException() {
-		super();
-	}
-
-	/**
-	 * WFTWrappedException constructor comment.
-	 * 
-	 * @param target
-	 *            java.lang.Throwable
-	 */
-	public WFTWrappedException(Throwable target) {
-		super(target);
-	}
-
-	/**
-	 * WFTWrappedException constructor comment.
-	 * 
-	 * @param target
-	 *            java.lang.Throwable
-	 * @param s
-	 *            java.lang.String
-	 */
-	public WFTWrappedException(Throwable target, String s) {
-		super(target, s);
-	}
-
-	/**
-	 * Print out a stack trace to the system err.
-	 */
-	public void printStackTrace() {
-		printStackTrace(System.err);
-	}
-
-	/**
-	 * Prints the exception to System.err. If we have a nested exception, print its stack.
-	 */
-	public void printStackTrace(java.io.PrintStream s) {
-		if (getTargetException() != null) {
-			s.println(this);
-			//TODO add this back in
-			// s.println(WFTUtilsResourceHandler.getString("Stack_trace_of_nested_exce_ERROR_"));
-			// //$NON-NLS-1$ = "Stack trace of nested exception:"
-			getTargetException().printStackTrace(s);
-		} else {
-			super.printStackTrace(s);
-		}
-	}
-
-	/**
-	 * Prints the exception to System.err. If we have a nested exception, print its stack.
-	 */
-	public void printStackTrace(java.io.PrintWriter s) {
-		if (getTargetException() != null) {
-			s.println(this);
-			//TODO add this back in
-			// s.println(WFTUtilsResourceHandler.getString("Stack_trace_of_nested_exce_ERROR_"));
-			// //$NON-NLS-1$ = "Stack trace of nested exception:"
-			getTargetException().printStackTrace(s);
-		} else {
-			super.printStackTrace(s);
-		}
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src-non_workbench/org/eclipse/wst/common/frameworks/internal/enablement/nonui/WorkbenchUtil.java b/plugins/org.eclipse.wst.common.frameworks/src-non_workbench/org/eclipse/wst/common/frameworks/internal/enablement/nonui/WorkbenchUtil.java
deleted file mode 100644
index 67cac79..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src-non_workbench/org/eclipse/wst/common/frameworks/internal/enablement/nonui/WorkbenchUtil.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.common.frameworks.internal.enablement.nonui;
-
-public class WorkbenchUtil {
-
-	protected static boolean WorkbenchRunning = false;
-
-	private WorkbenchUtil() {
-		super();
-	}
-
-	/**
-	 * workbenchIsRunning() - test whether or not we are running in the workbench environment.
-	 * 
-	 * @see JavaPlugin.startup()
-	 */
-	public static boolean workbenchIsRunning() {
-		return WorkbenchRunning;
-	}
-
-	/**
-	 * Set to true if you are running in a Workbench environment.
-	 * 
-	 * @see JavaPlugin.startup()
-	 */
-	public static void setWorkbenchIsRunning(boolean aBoolean) {
-		WorkbenchRunning = aBoolean;
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/AbstractDataModelOperation.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/AbstractDataModelOperation.java
deleted file mode 100644
index 4e44b8f..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/AbstractDataModelOperation.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.datamodel;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.AbstractOperation;
-import org.eclipse.core.resources.IWorkspace;
-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.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.wst.common.environment.IEnvironment;
-
-/**
- * Abstract implementation for an IDataModelOperation.
- * 
- * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation
- * 
- * @since 1.0
- */
-public abstract class AbstractDataModelOperation extends AbstractOperation implements IDataModelOperation {
-
-	/**
-	 * Convenience IStatus.OK.
-	 */
-	protected static final IStatus OK_STATUS = IDataModelProvider.OK_STATUS;
-
-	private String id;
-	private IEnvironment environment;
-
-	/**
-	 * The IDataModel used by this IDataModelOperation
-	 */
-	protected IDataModel model;
-
-	/**
-	 * Default constructor.
-	 */
-	public AbstractDataModelOperation() {
-		super(""); //$NON-NLS-1$
-		this.id = getClass().getName();
-	}
-
-	/**
-	 * Constructor taking an IDataModel
-	 * 
-	 * @param model
-	 *            the IDataModel used to drive this operation
-	 */
-	public AbstractDataModelOperation(IDataModel model) {
-		super(""); //$NON-NLS-1$ // TODO add a label property to IDataModel???
-		this.model = model;
-		this.id = getClass().getName();
-	}
-
-	/**
-	 * Default implementation of setID().
-	 * 
-	 * @see IDataModelOperation#setID(String)
-	 */
-	public void setID(String id) {
-		this.id = id;
-	}
-
-	/**
-	 * Default implementation of getID().
-	 * 
-	 * @see IDataModelOperation#getID()
-	 */
-	public String getID() {
-		return id;
-	}
-
-	/**
-	 * Default implementation of setDataModel()
-	 * 
-	 * @see IDataModelOperation#setDataModel(IDataModel)
-	 */
-	public void setDataModel(IDataModel model) {
-		this.model = model;
-	}
-
-	/**
-	 * Default implementation of getDataModel()
-	 * 
-	 * @see IDataModelOperation#getDataModel()
-	 */
-	public IDataModel getDataModel() {
-		return model;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation#getDataModelIDs()
-	 */
-	public Set getDataModelIDs() {
-		return new HashSet();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation#getSchedulingRule()
-	 */
-	public ISchedulingRule getSchedulingRule() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation#getOperationExecutionFlags()
-	 */
-	public int getOperationExecutionFlags() {
-		return IWorkspace.AVOID_UPDATE;
-	}
-
-  /**
-   * The framework will set the environment on this operation 
-   * before it is executed.  The operation can then use the
-   * environment to report status, log information, and access
-   * resources in an environment neutral way.
-   */
-	public final void setEnvironment(IEnvironment env) {
-		environment = env;
-	}
-
-  /**
-   * An operation can call this method to get the environment
-   * that has been set by the operations framework.
-   * @return returns an environment.
-   */
-	public final IEnvironment getEnvironment() {
-		return environment;
-	}
-
-  /**
-   * An operation can specify a list of operations that should run
-   * before this operation.  Subclasses can override this method to 
-   * provide these operations.  The operations provided will be
-   * executed in the order specified in the list.
-   * @return returns a list of data model operations or null.  
-   * Null indicates that there are no pre operations.
-   */
-  public List getPreOperations()
-  {
-    return null; 
-  }
-  
-  /**
-   * An operation can specify a list of operations that should run
-   * after this operation.  Subclasses can override this method to 
-   * provide these operations.  The operations provided will be
-   * executed in the order specified in the list.
-   * @return returns a list of data model operations or null.
-   * Null indicates that there are no post operations.
-   */
-  public List getPostOperations()
-  {
-    return null; 
-  }
-  
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#redo(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
-	 */
-	public IStatus redo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-		return Status.OK_STATUS;
-	}
-
-	public IStatus undo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-		return Status.OK_STATUS;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/AbstractDataModelProvider.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/AbstractDataModelProvider.java
deleted file mode 100644
index 57f3302..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/AbstractDataModelProvider.java
+++ /dev/null
@@ -1,327 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.datamodel;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * <p>
- * A default implementation of <code>IDataModelProvider</code>.
- * </p>
- * 
- * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider
- * @since 1.0
- */
-public abstract class AbstractDataModelProvider implements IDataModelProvider {
-
-	/**
-	 * <p>
-	 * The IDataModel for this provider.
-	 * </p>
-	 */
-	protected IDataModel model = null;
-
-	public Set getPropertyNames() {
-		return new HashSet();
-	}
-	
-	/**
-	 * <p>
-	 * A default implementation of init(). Subclasses should override as necessary.
-	 * </p>
-	 * 
-	 * @see IDataModelProvider#init()
-	 */
-	public void init() {
-	}
-
-	/**
-	 * </p>
-	 * An implemenation of setDataModel().
-	 * </p>
-	 * 
-	 * @see IDataModelProvider#setDataModel(IDataModel)
-	 */
-	public final void setDataModel(IDataModel dataModel) {
-		this.model = dataModel;
-	}
-
-	/**
-	 * <p>
-	 * An implemenation of getDataModel().
-	 * </p>
-	 * 
-	 * @see IDataModelProvider#getDataModel()
-	 */
-	public final IDataModel getDataModel() {
-		return model;
-	}
-
-
-	/**
-	 * </p>
-	 * A default impleneation of propertySet(). Subclasses should override as necessary.
-	 * </p>
-	 * 
-	 * @param propertyName
-	 *            the name of the property that has been set
-	 * @param propertyValue
-	 *            the value the property has been set
-	 * 
-	 * @see IDataModelProvider#propertySet(String, Object)
-	 */
-	public boolean propertySet(String propertyName, Object propertyValue) {
-		return true;
-	}
-
-	/**
-	 * <p>
-	 * A default implemenation of getDefaultProperty(). Subclasses should override as necessary.
-	 * </p>
-	 * 
-	 * @param propertyName
-	 *            the specified property
-	 * 
-	 * @see IDataModelProvider#getDefaultProperty(String)
-	 */
-	public Object getDefaultProperty(String propertyName) {
-		if(ALLOW_EXTENSIONS.equals(propertyName)){
-			return Boolean.TRUE;
-		} else if(RESTRICT_EXTENSIONS.equals(propertyName)){
-			return Collections.EMPTY_LIST;
-		}
-		return null;
-	}
-
-	/**
-	 * <p>
-	 * A default implemenation of isPropertyEnabled(). Subclasses should override as necessary.
-	 * </p>
-	 * 
-	 * @param propertyName
-	 *            the specified property
-	 * @see IDataModelProvider#isPropertyEnabled(String)
-	 */
-	public boolean isPropertyEnabled(String propertyName) {
-		return true;
-	}
-
-	/**
-	 * <p>
-	 * A default implemenation of validate(). Subclasses should override as necessary.
-	 * </p>
-	 * 
-	 * @param name
-	 *            the name of the property or nested IDataModel being validated.
-	 * 
-	 * @see IDataModelProvider#validate(String)
-	 */
-	public IStatus validate(String name) {
-		return null;
-	}
-
-	/**
-	 * <p>
-	 * A default implemenation of getPropertyDescriptor(). Subclasses should override as necessary.
-	 * </p>
-	 * 
-	 * @param propertyName
-	 *            the specified property
-	 * @see IDataModelProvider#getPropertyDescriptor(String)
-	 */
-	public DataModelPropertyDescriptor getPropertyDescriptor(String propertyName) {
-		return null;
-	}
-
-	/**
-	 * <p>
-	 * A default implemenation of getValidPropertyDescriptors(). Subclasses should override as
-	 * necessary.
-	 * </p>
-	 * 
-	 * @param propertyName
-	 *            the specified property
-	 * @see IDataModelProvider#getValidPropertyDescriptors(String)
-	 */
-	public DataModelPropertyDescriptor[] getValidPropertyDescriptors(String propertyName) {
-		return null;
-	}
-
-	/**
-	 * <p>
-	 * A default implemenation of getExtendedContext(). Subclasses should override as necessary.
-	 * </p>
-	 * 
-	 * @see IDataModelProvider#getExtendedContext()
-	 */
-	public List getExtendedContext() {
-		return null;
-	}
-
-	/**
-	 * <p>
-	 * A default implemenation of getDefaultOperation(). Subclasses should override as necessary.
-	 * </p>
-	 * 
-	 * @see IDataModelProvider#getDefaultOperation()
-	 */
-	public IDataModelOperation getDefaultOperation() {
-		return null;
-	}
-
-	/**
-	 * <p>
-	 * A default implemenation of getName(). Subclasses should override as necessary.
-	 * </p>
-	 * 
-	 * @see IDataModelProvider#getID()
-	 */
-	public String getID() {
-		return this.getClass().getName();
-	}
-
-	/**
-	 * <p>
-	 * A default implemenation of dispose(). Subclasses should override as necessary.
-	 * </p>
-	 * 
-	 * @see IDataModelProvider#dispose()
-	 */
-	public void dispose() {
-	}
-
-	/**
-	 * <p>
-	 * Convenience method for getting a property from the backing IDataModel.
-	 * </p>
-	 * 
-	 * @param propertyName
-	 *            the property name
-	 * @return the property value
-	 * 
-	 * @see IDataModel#getProperty(String)
-	 */
-	protected final Object getProperty(String propertyName) {
-		return model.getProperty(propertyName);
-	}
-
-	/**
-	 * <p>
-	 * Convenience method for setting a property on the backing IDataModel.
-	 * </p>
-	 * 
-	 * @param propertyName
-	 *            the property name
-	 * @param propertyValue
-	 *            the property value
-	 * 
-	 * @see IDataModel#setProperty(String, Object)
-	 */
-	protected final void setProperty(String propertyName, Object propertyValue) {
-		model.setProperty(propertyName, propertyValue);
-	}
-
-	/**
-	 * <p>
-	 * Convenience method for getting a boolean property from the backing IDataModel.
-	 * </p>
-	 * 
-	 * @param propertyName
-	 *            the property name
-	 * @return the boolean value of the property
-	 * 
-	 * @see IDataModel#getBooleanProperty(String)
-	 */
-	protected final boolean getBooleanProperty(String propertyName) {
-		return model.getBooleanProperty(propertyName);
-	}
-
-	/**
-	 * <p>
-	 * Convenience method for setting a boolean property on the backing IDataModel.
-	 * </p>
-	 * 
-	 * @param propertyName
-	 *            the property name
-	 * @param propertyValue
-	 *            the boolean property value
-	 * 
-	 * @see IDataModel#setBooleanProperty(String, boolean)
-	 */
-	protected final void setBooleanProperty(String propertyName, boolean propertyValue) {
-		model.setBooleanProperty(propertyName, propertyValue);
-	}
-
-	/**
-	 * <p>
-	 * Convenience method for getting an int property from the backing IDataModel.
-	 * </p>
-	 * 
-	 * @param propertyName
-	 *            the property name
-	 * @return the int value of the property
-	 * 
-	 * @see IDataModel#getIntProperty(String)
-	 */
-	protected final int getIntProperty(String propertyName) {
-		return model.getIntProperty(propertyName);
-	}
-
-	/**
-	 * <p>
-	 * Convenience method for setting an int property on the backing IDataModel.
-	 * </p>
-	 * 
-	 * @param propertyName
-	 *            the property name
-	 * @param propertyValue
-	 *            the int property value
-	 * 
-	 * @see IDataModel#setIntProperty(String, int)
-	 */
-	protected final void setIntProperty(String propertyName, int propertyValue) {
-		model.setIntProperty(propertyName, propertyValue);
-	}
-
-	/**
-	 * <p>
-	 * Convenience method for getting a String property from the backing IDataModel.
-	 * </p>
-	 * 
-	 * @param propertyName
-	 *            the property name
-	 * @return the String value of the property
-	 * 
-	 * @see IDataModel#getStringProperty(String)
-	 */
-	protected final String getStringProperty(String propertyName) {
-		return model.getStringProperty(propertyName);
-	}
-
-	/**
-	 * <p>
-	 * Convenience method for checking if a property is set from the backing IDataModel.
-	 * </p>
-	 * 
-	 * @param propertyName
-	 *            the property name
-	 * @return <code>true</code> if the property is set, <code>false</code> otherwise.
-	 */
-	protected final boolean isPropertySet(String propertyName) {
-		return model.isPropertySet(propertyName);
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/DataModelEvent.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/DataModelEvent.java
deleted file mode 100644
index 402b0bc..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/DataModelEvent.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.datamodel;
-
-/**
- * <p>
- * This event is used to communicate property changes from IDataModels to their IDataModelListeners.
- * </p>
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * 
- * @see org.eclipse.wst.common.frameworks.datamodel.IDataModel#addListener(IDataModelListener)
- * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelListener
- * 
- * @since 1.0
- */
-public final class DataModelEvent {
-
-	/**
-	 * <p>
-	 * A flag used to specify the property's value has changed.
-	 * </p>
-	 * 
-	 * @see IDataModel#getProperty(String)
-	 * @see #getFlag()
-	 */
-	public static final int VALUE_CHG = 1;
-
-	/**
-	 * Internal. Clients should not use.
-	 */
-	static final int DEFAULT_CHG = 2;
-
-	/**
-	 * <p>
-	 * A flag used to specify the property's enablment has changed.
-	 * </p>
-	 * 
-	 * @see IDataModel#isPropertyEnabled(String)
-	 * @see #getFlag()
-	 */
-	public static final int ENABLE_CHG = 3;
-
-	/**
-	 * <p>
-	 * A flag used to specify the property's valid values have changed.
-	 * </p>
-	 * 
-	 * @see IDataModel#getValidPropertyDescriptors(String)
-	 * @see #getFlag()
-	 */
-	public static final int VALID_VALUES_CHG = 4;
-
-
-	private IDataModel dataModel;
-	private String propertyName;
-	private int flag;
-
-	/**
-	 * <p>
-	 * Constructor for DataModelEvent.
-	 * </p>
-	 * 
-	 * @param dataModel
-	 *            the IDataModel whose property has changed
-	 * @param propertyName
-	 *            the name of the changed property
-	 * @param flag
-	 *            contains a flag specifiying the event type
-	 */
-	public DataModelEvent(IDataModel dataModel, String propertyName, int flag) {
-		this.dataModel = dataModel;
-		this.propertyName = propertyName;
-		this.flag = flag;
-	}
-
-	/**
-	 * <p>
-	 * Returns the IDataModel whose property has changed.
-	 * </p>
-	 * 
-	 * @return the IDataModel whose property has changed.
-	 */
-	public IDataModel getDataModel() {
-		return dataModel;
-	}
-
-	/**
-	 * <p>
-	 * Returns the name of the changed property.
-	 * </p>
-	 * 
-	 * @return the name of the changed property.
-	 */
-	public String getPropertyName() {
-		return propertyName;
-	}
-
-	/**
-	 * <p>
-	 * Returns the flag indicating the event type. Valid types are:
-	 * <ul>
-	 * <li><code>PROPERTY_CHG</code></li>
-	 * <li><code>VALID_VALUES_CHG</code></li>
-	 * <li><code>ENABLE_CHG</code></li>
-	 * </ul>
-	 * </p>
-	 * 
-	 * @return the flag indicating the event type.
-	 */
-	public int getFlag() {
-		return flag;
-	}
-
-	/**
-	 * <p>
-	 * Convenience method to return the IDataModel's property. This is equavalent to:
-	 * <code>getDataModel().getProperty(getPropertyName())</code>.
-	 * </p>
-	 * 
-	 * @return the dataModel's property.
-	 * @see IDataModel#getProperty(String)
-	 */
-	public Object getProperty() {
-		return dataModel.getProperty(propertyName);
-	}
-
-	/**
-	 * <p>
-	 * Convenience method to return the IDataModel property's enablement state. This is equavalent
-	 * to: <code>getDataModel().isPropertyEnabled(getPropertyName())</code>.
-	 * </p>
-	 * 
-	 * @return the dataModel property's enablement state.
-	 * @see IDataModel#isPropertyEnabled(String)
-	 */
-	public boolean isPropertyEnabled() {
-		return dataModel.isPropertyEnabled(propertyName);
-	}
-
-	/**
-	 * <p>
-	 * Convenience method to return the IDataModel property's valid property descriptors. This is
-	 * equavalent to: <code>getDataModel().getValidPropertyDescriptors(getPropertyName())</code>.
-	 * </p>
-	 * 
-	 * @return the dataModel property's valid property descriptors.
-	 * @see IDataModel#getValidPropertyDescriptors(String)
-	 */
-	public DataModelPropertyDescriptor[] getValidPropertyDescriptors() {
-		return dataModel.getValidPropertyDescriptors(propertyName);
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/DataModelFactory.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/DataModelFactory.java
deleted file mode 100644
index 02df2f7..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/DataModelFactory.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.datamodel;
-
-import org.eclipse.wst.common.frameworks.internal.datamodel.DataModelExtensionReader;
-import org.eclipse.wst.common.frameworks.internal.datamodel.DataModelImpl;
-
-/**
- * <p>
- * DataModelFactory is used to create IDataModel instances.
- * </p>
- * 
- * @since 1.0
- */
-public class DataModelFactory {
-
-	private static DataModelExtensionReader reader;
-
-	private DataModelFactory() {
-	}
-
-	/**
-	 * <p>
-	 * Looks up the appropriate IDataModelProvider by the specified id and constructs a new
-	 * IDataModel. If the IDataModelProvider is not found then a RuntimeException is logged and null
-	 * is returned.
-	 * </p>
-	 * 
-	 * @param dataModelProviderID
-	 *            the id of the IDataModelProvider
-	 * @return a new IDataModel
-	 */
-	public static IDataModel createDataModel(String dataModelProviderID) {
-		IDataModelProvider provider = loadProvider(dataModelProviderID);
-		if (provider == null)
-			return null;
-		return createDataModel(provider);
-	}
-
-	private static IDataModelProvider loadProvider(String id) {
-		if (null == reader) {
-			reader = new DataModelExtensionReader();
-		}
-		return reader.getProvider(id);
-	}
-
-	/**
-	 * <p>
-	 * Looks up the appropriate dataModelProviderIDs by the specified dataModelProviderKindID.
-	 * </p>
-	 * 
-	 * @param dataModelProviderKindID
-	 *            the String id of the dataModelProviderKindID
-	 * 
-	 * @return the array of valid dataModelProviderIDs or an empty array if there are none.
-	 */
-	public static String[] getDataModelProviderIDsForKind(String dataModelProviderKindID) {
-		String[] validProviderIDs = loadProviderForProviderKind(dataModelProviderKindID);
-		return null != validProviderIDs ? validProviderIDs : new String[0];
-	}
-
-
-	private static String[] loadProviderForProviderKind(String providerKind) {
-		if (null == reader) {
-			reader = new DataModelExtensionReader();
-		}
-		return reader.getProviderDescriptorsForProviderKind(providerKind);
-	}
-
-	/**
-	 * <p>
-	 * Looks up the appropriate IDataModelProvider using the name of the specified class. This
-	 * method is equavalent to <code>createDataModel(dataModelProviderClassID.getName())</code>.
-	 * </p>
-	 * 
-	 * @param dataModelProviderClass
-	 *            the class whose name is the id of the IDataModelProvider
-	 * @return a new IDataModel
-	 */
-	public static IDataModel createDataModel(Class dataModelProviderClass) {
-		return createDataModel(dataModelProviderClass.getName());
-	}
-
-	/**
-	 * <p>
-	 * Creates a new IDataModel using the the specified instance of an IDataModelProvider.
-	 * </p>
-	 * 
-	 * @param provider
-	 * @return a new IDataModel
-	 */
-	public static IDataModel createDataModel(IDataModelProvider provider) {
-		if (null == provider) {
-			throw new NullPointerException();
-		}
-		DataModelImpl dataModel = new DataModelImpl(provider);
-		return dataModel;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/DataModelPropertyDescriptor.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/DataModelPropertyDescriptor.java
deleted file mode 100644
index 2154ecc..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/DataModelPropertyDescriptor.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.datamodel;
-
-/**
- * <p>
- * A DataModelPropertyDescriptor provides a human readible description for an IDataModel
- * propertyValue.
- * </p>
- * 
- * @see org.eclipse.wst.common.frameworks.datamodel.IDataModel#getPropertyDescriptor(String)
- * @see org.eclipse.wst.common.frameworks.datamodel.IDataModel#getValidPropertyDescriptors(String)
- * 
- * @since 1.0
- */
-public final class DataModelPropertyDescriptor {
-
-	/**
-	 * <p>
-	 * A convenience method which returns an array of DataModelPropertyDescriptors. If
-	 * <code>values</code> is <code>null</code> then a 0 length array is returned. Otherwise for
-	 * each <code>values[i]</code> in the array, a new DataModelPropertyDescriptors is created
-	 * using <code>new DataModelPropertyDescriptors(values[i]);</code>.
-	 * </p>
-	 * 
-	 * @param values
-	 *            the array of property values
-	 * @return the constructed DataModelPropertyDescriptors array
-	 */
-	public static DataModelPropertyDescriptor[] createDescriptors(Object[] values) {
-		if (null == values) {
-			return new DataModelPropertyDescriptor[0];
-		}
-		DataModelPropertyDescriptor[] descriptors = new DataModelPropertyDescriptor[values.length];
-		for (int i = 0; i < descriptors.length; i++) {
-			descriptors[i] = new DataModelPropertyDescriptor(values[i]);
-		}
-		return descriptors;
-	}
-
-	/**
-	 * <p>
-	 * A convenience method which returns an array of DataModelPropertyDescriptors. If
-	 * <code>values</code> is <code>null</code> then a 0 length array is returned. Otherwise for
-	 * each <code>values[i]</code> and <code>descriptions[i]</code> in the arrays, a new
-	 * DataModelPropertyDescriptor is created using
-	 * <code>new DataModelPropertyDescriptor(values[i], descriptions[i]);</code>. Both arrays
-	 * must be the same length.
-	 * </p>
-	 * 
-	 * @param values
-	 *            the array of property values
-	 * @param descriptions
-	 *            the array of property descriptions cooresponding the values array
-	 * @return the constructed DataModelPropertyDescriptors array
-	 */
-	public static DataModelPropertyDescriptor[] createDescriptors(Object[] values, String[] descriptions) {
-		if (null == values) {
-			return new DataModelPropertyDescriptor[0];
-		}
-		DataModelPropertyDescriptor[] descriptors = new DataModelPropertyDescriptor[values.length];
-		for (int i = 0; i < descriptors.length; i++) {
-			descriptors[i] = new DataModelPropertyDescriptor(values[i], descriptions[i]);
-		}
-		return descriptors;
-
-	}
-
-	private Object propertyValue;
-	private String propertyDescription;
-
-	/**
-	 * <p>
-	 * This is equavalent to calling <code>DataModelPropertyDescriptor(propertyValue, null)</code>.
-	 * </p>
-	 * 
-	 * @param propertyValue
-	 *            the propery value
-	 */
-	public DataModelPropertyDescriptor(Object propertyValue) {
-		this.propertyValue = propertyValue;
-	}
-
-	/**
-	 * <p>
-	 * Creates a new DataModelPropertyDescriptor with the specified propertyValue and
-	 * propertyDescription.
-	 * </p>
-	 * 
-	 * @param propertyValue
-	 *            the property value
-	 * @param propertyDescription
-	 *            the human readible proeprty descriptionF
-	 */
-	public DataModelPropertyDescriptor(Object propertyValue, String propertyDescription) {
-		this.propertyValue = propertyValue;
-		this.propertyDescription = propertyDescription;
-	}
-
-	/**
-	 * <p>
-	 * Returns the property value.
-	 * </p>
-	 * 
-	 * @return the property value
-	 */
-	public Object getPropertyValue() {
-		return propertyValue;
-	}
-
-	/**
-	 * <p>
-	 * Returns a human readible property description. If a non null description has been specified,
-	 * then it will be returned. Otherwise, the property value's <code>toString()</code> will be
-	 * returned if it is not null. Otherwise the empty String (<code>""</code>) will be
-	 * returned. <code>null</code> will never be returned.
-	 * </p>
-	 * 
-	 * @return the human readible property description, never <code>null</code>
-	 */
-	public String getPropertyDescription() {
-		if (null != propertyDescription) {
-			return propertyDescription;
-		}
-		String str = (null != propertyValue) ? propertyValue.toString() : null;
-		return (null != str) ? str : ""; //$NON-NLS-1$
-	}
-	
-	public String toString(){
-		return getPropertyDescription();
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/IDataModel.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/IDataModel.java
deleted file mode 100644
index 1d4a14e..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/IDataModel.java
+++ /dev/null
@@ -1,724 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.datamodel;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * <p>
- * IDataModels are the core piece of a framework used to simplify data collection, operation
- * execution, and Wizard generation.
- * </p>
- * <p>
- * IDataModels are primaryly an intelligent mechanism for managing data. Each IDataModel tracks
- * specific Objects known as "properties". Each property may be set or get using its property name.
- * A Collection of property names for an IDataModel instance may be retreived using
- * <code>getAllProperties()</code>. In addition to getting/setting properties, IDataModels may
- * also provide default values for unset properties, human readable descriptors for properties,
- * enumerations of valid property values, validation for properties, and enablement for properties.
- * </p>
- * <p>
- * IDataModels may also be nested (and unnested) recursively within another. When one IDataModel is
- * nested within another, then client code may access all properties on the former through the
- * latter. This is especially useful when the same IDataModel (tracking the same properties) may be
- * used within the context of several different broader scenarios. Nesting may apply to any
- * IDataModel, and may be abitraryly deep (even cylical if you dare). Nesting offers flexibility,
- * especially for extension by 3rd party clients.
- * </p>
- * <p>
- * Each IDataModel may also supply an IDataModelOperation (a subclass of
- * org.eclipse.core.commands.operations.IUndoableOperation) for execution. When executed within the
- * IDataModel framework all these operations are inherently and abitrarily extendable.
- * </p>
- * <p>
- * Each IDataModel may also indirectly supply a DataModelWizard. This indirection is necessary to
- * spilt UI dependencies from the core IDataModel framework. DataModelWizards are also inherently
- * extendable.
- * </p>
- * <p>
- * IDataModels are not meant to be instantiated directly, rather they are built from an
- * IDataModelProvider. Clients wishing to define their own IDataModel must do so by implementing an
- * IDataModelProvider. Clients wishing to utilize an IDataModel must create it using the
- * DataModelFactory with the associated IDataModelProvider.
- * </p>
- * 
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * 
- * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider
- * @see org.eclipse.wst.common.frameworks.datamodel.DataModelFactory
- * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation
- * 
- * @since 1.0
- */
-public interface IDataModel {
-
-	/**
-	 * <p>
-	 * Returns the unique ID which identifies this IDataModel instance. The same ID should be used
-	 * by the default operation (if any) for clients to extend or instantiate directly, the
-	 * DataModelWizard (if any) for clients to extend or instantiate directly.
-	 * </p>
-	 * <p>
-	 * Note, this is not the same as a hashcode. Multiple IDataModel instances created with the same
-	 * IDataModelProvider type will all have the same ID.
-	 * </p>
-	 * <p>
-	 * An IDataModel implementor defines this in IDataModelProvider.
-	 * </p>
-	 * 
-	 * @see IDataModelProvider#getID()
-	 * 
-	 * @return the unique ID for this IDataModel
-	 */
-	public String getID();
-
-	/**
-	 * <p>
-	 * Returns the default operation to execute against this IDataModel.
-	 * </p>
-	 * <p>
-	 * An IDataModel implementor defines this in IDataModelProvider. If the IDataModelProvider does
-	 * not define an operation, an empty operation will be returned; <code>null</code> will never
-	 * be returned.
-	 * </p>
-	 * 
-	 * @see IDataModelProvider#getDefaultOperation()
-	 * 
-	 * @return the default operation or an empty operation; never <code>null</code>.
-	 */
-	public IDataModelOperation getDefaultOperation();
-
-	/**
-	 * <p>
-	 * This method only pertains to IDataModels for extedended operations. The returned extended
-	 * context is used by the IDataModelOperation framework to determine whether a particular
-	 * extended operation should execute. The returned list is should contain Objects adaptable to
-	 * IProject. This IDataModel's function groups are looked up through the extension mechanism. If
-	 * a function group is defined, it is first checked for enablement. Then each adapted IProject
-	 * is inspected to verify it handles the function group. If all these conditions are met, then
-	 * the extended operation associated with this IDataModel is executed; otherwise it is skipped.
-	 * If no function group is defined, or no extended context is defined (i.e. this method returns
-	 * an empty list, or the objects in the returned list are not adaptable to IProject) then the
-	 * extended operation will execute (it will never be skipped).
-	 * </p>
-	 * <p>
-	 * An IDataModel implementor defines this in IDataModelProvider.
-	 * </p>
-	 * <p>
-	 * This method should not be called by clients.
-	 * </p>
-	 * 
-	 * @return a List of Objects adaptable to IProject or an empty list; never <code>null</code>.
-	 * 
-	 * @see IDataModelProvider#getExtendedContext()
-	 */
-	public List getExtendedContext();
-
-	/**
-	 * <p>
-	 * Returns the property value for the specified propertyName.
-	 * </p>
-	 * <p>
-	 * If the specified propertyName is not a property then a RuntimeException will be thrown.
-	 * </p>
-	 * <p>
-	 * Before the property is returned, first the owning IDataModel must be located. If the
-	 * specified propertyName is a base property {@link #isBaseProperty(String)}, then this
-	 * IDataModel is the owner. Otherwise, a recursive search through the nested IDataModels is
-	 * conducted to locate the owning IDataModel. If more than one nested IDataModel defines the
-	 * property, then the first one located is considered the owning IDataModel.
-	 * </p>
-	 * <p>
-	 * Once the owning IDataModel is found the property is checked to see if it is set
-	 * {@link #isPropertySet(String)}. If the property is set, the set value is returned. If the
-	 * property is not set, its default is returned {@link #getDefaultProperty(String)}.
-	 * </p>
-	 * <p>
-	 * There are convenience methods for getting primitive <code>int</code> and
-	 * <code>boolean</code> types as well as Strings.
-	 * <ul>
-	 * <li>{@link #getIntProperty(String)}</li>
-	 * <li>{@link #getBooleanProperty(String)}</li>
-	 * <li>{@link #getStringProperty(String)}</li>
-	 * </ul>
-	 * </p>
-	 * 
-	 * @param propertyName
-	 *            the property name
-	 * @return the property
-	 * 
-	 * @see #setProperty(String, Object)
-	 * @see #getBooleanProperty(String)
-	 * @see #getIntProperty(String)
-	 * @see #getStringProperty(String)
-	 */
-	public Object getProperty(String propertyName);
-
-	/**
-	 * <p>
-	 * Returns the default property value for the specified propertyName.
-	 * </p>
-	 * <p>
-	 * An IDataModel implementor defines this in IDataModelProvider.
-	 * </p>
-	 * 
-	 * @see IDataModelProvider#getDefaultProperty(String)
-	 */
-	public Object getDefaultProperty(String propertyName);
-
-	/**
-	 * <p>
-	 * A convenience method for getting ints. If the property is set or has a default value then
-	 * this method is equavalent to:
-	 * </p>
-	 * <p>
-	 * <code>((Integer)getProperty(propertyName)).intValue();</code>
-	 * </p>
-	 * <p>
-	 * <code>-1</code> is returned if a call to getProperty(propertyName) returns
-	 * <code>null</code>.
-	 * </p>
-	 * 
-	 * @param propertyName
-	 *            the property name
-	 * @return the int value of the property
-	 * @see #setProperty(String, Object)
-	 * @see #setIntProperty(String, int)
-	 */
-	public int getIntProperty(String propertyName);
-
-	/**
-	 * <p>
-	 * A convenience method for getting booleans. If the property is set or has a default value then
-	 * this method is equavalent to:
-	 * </p>
-	 * <p>
-	 * <code>((Boolean)getProperty(propertyName)).booleanValue();</code>
-	 * </p>
-	 * <p>
-	 * <code>false</code> is returned if a call to getProperty(propertyName) returns
-	 * <code>null</code>.
-	 * </p>
-	 * 
-	 * @param propertyName
-	 *            the property name
-	 * @return the boolean value of the property
-	 * @see #setProperty(String, Object)
-	 * @see #setBooleanProperty(String, boolean)
-	 */
-	public boolean getBooleanProperty(String propertyName);
-
-	/**
-	 * <p>
-	 * A convenience method for getting Strings. If the property is set or has a default value then
-	 * this method is equavalent to:
-	 * </p>
-	 * <p>
-	 * <code>(String)getProperty(propertyName);</code>
-	 * </p>
-	 * <p>
-	 * <code>""</code> is returned if a call to getProperty(propertyName) returns
-	 * <code>null</code>.
-	 * </p>
-	 * 
-	 * @param propertyName
-	 * @see #setProperty(String, Object)
-	 */
-	public String getStringProperty(String propertyName);
-
-	/**
-	 * <p>
-	 * Sets the specified propertyName to the specified propertyValue. Subsequent calls to
-	 * {@link #getProperty(String)} will return the same propertyValue.
-	 * </p>
-	 * <p>
-	 * When a propertyValue other than <code>null</code> is set, the property is considered
-	 * "set" (see {@link #isPropertySet(String)}), conversly, a propertyValue of <code>null</code>
-	 * is considered "unset".
-	 * </p>
-	 * <p>
-	 * If the specified propertyName is not a property (see {@link #isProperty(String)}) then a
-	 * RuntimeException will be thrown.
-	 * </p>
-	 * <p>
-	 * There are convenience methods for setting primitive <code>int</code> and
-	 * <code>boolean</code> types as well as Strings.
-	 * <ul>
-	 * <li>{@link #setIntProperty(String, int)}</li>
-	 * <li>{@link #setBooleanProperty(String, boolean)}</li>
-	 * <li>{@link #setStringProperty(String, String)}</li>
-	 * </ul>
-	 * </p>
-	 * <p>
-	 * An IDataModel implementor may define additional post set logic in
-	 * {@link IDataModelProvider#propertySet(String, Object)}.
-	 * </p>
-	 * 
-	 * @param propertyName
-	 *            the name of the property to set
-	 * @param propertyValue
-	 *            the value to set the property
-	 * 
-	 * 
-	 * @see #getProperty(String)
-	 * @see #isPropertySet(String)
-	 * @see #isProperty(String)
-	 * @see IDataModelProvider#propertySet(String, Object)
-	 */
-	public void setProperty(String propertyName, Object propertyValue);
-
-	/**
-	 * <p>
-	 * A convenience method for setting ints. This method is equavalent to:
-	 * <p>
-	 * <code>setProperty(propertyName, new Integer(propertyValue));</code>
-	 * </p>
-	 * 
-	 * @param propertyName
-	 *            the name of the property
-	 * @param propertyValue
-	 *            the <code>int</code> value of the property
-	 * @see #setProperty(String, Object)
-	 * @see #getIntProperty(String)
-	 */
-	public void setIntProperty(String propertyName, int propertyValue);
-
-	/**
-	 * <p>
-	 * A convenience method for setting booleans. This method is equavalent to:
-	 * <p>
-	 * <code>setProperty(propertyName, (value) ? Boolean.TRUE : Boolean.FALSE);</code>
-	 * </p>
-	 * 
-	 * @param propertyName
-	 *            the name of the property
-	 * @param propertyValue
-	 *            the <code>boolean</code> value of the property
-	 * @see #setProperty(String, Object)
-	 * @see #getBooleanProperty(String)
-	 */
-	public void setBooleanProperty(String propertyName, boolean propertyValue);
-
-	/**
-	 * <p>
-	 * A convenience method for setting Strings. This method is equavalent to:
-	 * <p>
-	 * <code>setProperty(propertyName, propertyValue);</code>
-	 * </p>
-	 * 
-	 * @param propertyName
-	 *            the name of the property
-	 * @param propertyValue
-	 *            the value of the property
-	 * @see #setProperty(String, Object)
-	 * @see #getStringProperty(String)
-	 */
-	public void setStringProperty(String propertyName, String propertyValue);
-
-	/**
-	 * <p>
-	 * This method is used to nest the specified IDataModel within this IDataModel. The
-	 * <code>nestedModelName</code> argument should be a unique String to identify this particular
-	 * nested IDataModel. The same String is required when accessing the nested IDataModel using
-	 * either {@link #getNestedModel(String)} or {@link #removeNestedModel(String)}. If the
-	 * specified nested IDataModel has already been nested under this IDataModel or it is the same
-	 * instance as this IDataModel, then calling this method will have no effect.
-	 * </p>
-	 * 
-	 * @param nestedModelName
-	 *            the name of the IDataModel to be nested
-	 * @param dataModel
-	 *            the IDataModel to be nested
-	 * @return <code>true</code> if the nesting was successful, <code>false</code> otherwise.
-	 * 
-	 * @see #getNestedModel(String)
-	 * @see #removeNestedModel(String)
-	 */
-	public boolean addNestedModel(String nestedModelName, IDataModel dataModel);
-
-	/**
-	 * <p>
-	 * Remove the specified nestedModel.
-	 * </p>
-	 * 
-	 * @param nestedModelName
-	 *            the name of the nested IDataModel to remove.
-	 * @return the IDataModel removed, or <code>null</code> if the nested model does not exist or
-	 *         if the specified name is null.
-	 */
-	public IDataModel removeNestedModel(String nestedModelName);
-
-	/**
-	 * Returns <code>true</code> if a nested model exists (at the top level only) with the
-	 * specified name and <code>false</code> otherwise.
-	 * 
-	 * @param nestedModelName
-	 *            the name of the nested IDataModel to check.
-	 * @return Returns <code>true</code> if a nested model exists (at the top level only) with the
-	 *         specified name and <code>false</code> otherwise.
-	 */
-	public boolean isNestedModel(String nestedModelName);
-
-	/**
-	 * Returns the nested IDataModel identified the by the specified name. A RuntimeException is
-	 * thrown if there is no such nested IDataModel (i.e. isNestedModel() would return
-	 * <code>false</code>).
-	 * 
-	 * @param nestedModelName
-	 *            the name of the nested IDataModel to get.
-	 * @return the nested IDataModel
-	 */
-	public IDataModel getNestedModel(String nestedModelName);
-
-	/**
-	 * Returns a Collection of all nested IDataModels, or an empty Collection if none exist.
-	 * 
-	 * @return a Collection of all nested IDataModels, or an empty Collection if none exist.
-	 */
-	public Collection getNestedModels();
-
-	/**
-	 * Returns a Collection of all nested IDataModels names, or an empty Collection if none exist.
-	 * 
-	 * @return a Collection of all nested IDataModels names, or an empty Collection if none exist.
-	 */
-	public Collection getNestedModelNames();
-
-	/**
-	 * Returns a Collection of all nesting (the inverse of nested) IDataModels, or an empty
-	 * Collection if none exist.
-	 * 
-	 * @return a Collection of all nesting (the inverse of nested) IDataModels, or an empty
-	 *         Collection if none exist.
-	 */
-	public Collection getNestingModels();
-
-	/**
-	 * Returns a Collection of all base properties (not including nested properties), or an empty
-	 * Collection if none exist.
-	 * 
-	 * @return a Collection of all base properties (not including nested properties), or an empty
-	 *         Collection if none exist.
-	 */
-	public Collection getBaseProperties();
-
-	/**
-	 * Returns a Collection of all properties of recursively nested IDataModels, or an empty
-	 * Collection if none exist.
-	 * 
-	 * @return a Collection of all properties of recursively nested IDataModels, or an empty
-	 *         Collection if none exist.
-	 */
-	public Collection getNestedProperties();
-
-	/**
-	 * Returns a Collection of all properties (the union of getBaseProperties() and
-	 * getNestedProperties()), or an empty Collection if none exist.
-	 * 
-	 * @return a Collection of all properties (the union of getBaseProperties() and
-	 *         getNestedProperties()), or an empty Collection if none exist.
-	 */
-	public Collection getAllProperties();
-
-	/**
-	 * Returns <code>true</code> if the specified propertyName is a valid propertyName for this
-	 * root IDataModel only. Nested IDataModels are not checked, though it is possible for a nested
-	 * IDataModel to contain the same property.
-	 * 
-	 * @param propertyName
-	 *            the property name to check
-	 * @return <code>true</code> if this property is a base property, <code>false</code>
-	 *         otherwise.
-	 * 
-	 * @see #isProperty(String)
-	 * @see #isNestedProperty(String)
-	 */
-	public boolean isBaseProperty(String propertyName);
-
-	/**
-	 * Returns <code>true</code> if the specified propertyName is a valid propertyName for this
-	 * DataModel or any of its (recursively) nested IDataModels.
-	 * 
-	 * @param propertyName
-	 *            the property name to check
-	 * @return <code>true</code> if this is a property, <code>false</code> otherwise.
-	 * 
-	 * @see #isBaseProperty(String)
-	 */
-	public boolean isProperty(String propertyName);
-
-	/**
-	 * Returns <code>true</code> if the specified propertyName is a valid propertyName for any of
-	 * its (recursively) nested IDataModels. The root IDataModel is not checked, though it is
-	 * possible for the root IDataModel to contain the same property.
-	 * 
-	 * @param propertyName
-	 *            the property name to check
-	 * @return <code>true</code> if the property is nested, <code>false</code> otherwise.
-	 * @see #isBaseProperty(String)
-	 */
-	public boolean isNestedProperty(String propertyName);
-
-	/**
-	 * Returns <code>true</code> if the specified property has been set on the IDataModel. If it
-	 * has not been set, then a call to get the same property will return the default value.
-	 * 
-	 * @param propertyName
-	 *            the property name to check
-	 * @return <code>true</code> if the property is set, <code>false</code> otherwise.
-	 */
-	public boolean isPropertySet(String propertyName);
-
-	/**
-	 * <p>
-	 * Returns <code>true</code> if the specified property is enabled and <code>false</code>
-	 * otherwise.
-	 * </p>
-	 * <p>
-	 * An IDataModel implementor defines this in IDataModelProvider.
-	 * </p>
-	 * 
-	 * @see IDataModelProvider#isPropertyEnabled(String)
-	 * 
-	 * @param propertyName
-	 *            the property name to check
-	 * @return <code>true</code> if the specified property is enabled and <code>false</code>
-	 *         otherwise.
-	 */
-	public boolean isPropertyEnabled(String propertyName);
-
-	/**
-	 * <p>
-	 * Returns <code>false</code> if the the IStatus returned by validateProperty(String) is ERROR
-	 * and <code>true</code> otherwise.
-	 * </p>
-	 * 
-	 * @param propertyName
-	 *            the property name to check
-	 * @return <code>false</code> if the the IStatus returned by validateProperty(String) is ERROR
-	 *         and <code>true</code> otherwise.
-	 */
-	public boolean isPropertyValid(String propertyName);
-
-	/**
-	 * <p>
-	 * Returns an IStatus for the specified property. Retuns an IStatus.OK if the returned value is
-	 * valid with respect itself, other properites, and broader context of the IDataModel.
-	 * IStatus.ERROR is returned if the returned value is invalid. IStatus.WARNING may also be
-	 * returned if the value is not optimal.
-	 * </p>
-	 * <p>
-	 * An IDataModel implementor defines this in IDataModelProvider.
-	 * </p>
-	 * 
-	 * @see IDataModelProvider#validate(String)
-	 */
-	public IStatus validateProperty(String propertyName);
-
-	/**
-	 * <p>
-	 * Returns <code>false</code> if the IStatus returned by validate(true) is ERROR and
-	 * <code>true</code> otherwise.
-	 * </p>
-	 * 
-	 * @return <code>false</code> if the IStatus returned by validate(true) is ERROR and
-	 *         <code>true</code> otherwise.
-	 */
-	public boolean isValid();
-
-	/**
-	 * <p>
-	 * Equavalent to calling <code>validate(true)</code>.
-	 * </p>
-	 * 
-	 * @return an IStatus
-	 */
-	public IStatus validate();
-
-	/**
-	 * <p>
-	 * Iterates over all base properties and nested models IDs and calls validate(String). This
-	 * method returns when any call to validate(String) returns an IStatus error and
-	 * stopAtFirstFailure is set to true.
-	 * <p>
-	 * 
-	 * @param stopAtFirstFailure
-	 *            whether validation should stop at the first failure
-	 * @return an IStatus
-	 */
-	public IStatus validate(boolean stopAtFirstFailure);
-
-
-
-	/**
-	 * <p>
-	 * Returns a DataModelPropertyDescriptor for the specified property. The
-	 * <code>getPropertyValue()</code> method on the returned DataModelPropertyDescriptor will be
-	 * the same value as returned by <code>getPropertyValue(propertyName)</code>.
-	 * </p>
-	 * <p>
-	 * Following the example introduced in {@link #getValidPropertyDescriptors(String)}, suppose
-	 * the <code>SHIRT_SIZE</code> property is currently set to 1. A call to this method would
-	 * return a DataModelPropertyDescriptor whose <code>getPropertyValue()</code> returns
-	 * <code>1</code> and whose <code>getPropertyDescription()</code> returns <code>small</code>.
-	 * </p>
-	 * <p>
-	 * Also, note that even if a particular property is not confined to a finite set of values as
-	 * defined by {@link #getValidPropertyDescriptors(String)}this method will always return a
-	 * valid DataModelPropertyDescriptor.
-	 * </p>
-	 * 
-	 * <p>
-	 * An IDataModel implementor defines this in IDataModelProvider.
-	 * </p>
-	 * 
-	 * @param propertyName
-	 * @return the DataModelPropertyDescriptor for the specified property
-	 * 
-	 * @see #getValidPropertyDescriptors(String)
-	 */
-	public DataModelPropertyDescriptor getPropertyDescriptor(String propertyName);
-
-	/**
-	 * <p>
-	 * Returns a DataModelPropertyDescriptor array consisting of all valid
-	 * DataModelPropertyDescriptors for the specified property. Each
-	 * {@link DataModelPropertyDescriptor} contains a value and a human readible description for the
-	 * value. The set of all values in the returned array are those values which are valid for the
-	 * IDataModel. This value set only makes sense when valid property values conform to a well
-	 * defined finite set. If no such value set exists for the property, then a 0 length array is
-	 * returned. <code>null</code> is never returned.
-	 * </p>
-	 * <p>
-	 * As an example, suppose there is a property called <code>SHIRT_SIZE</code> which is an
-	 * <code>Integer</code> type. Also suppse that valid shirt sizes are only small, medium, or
-	 * large. However, the actual values representing small, medium, and large are 1, 2, and 3
-	 * respectively. A call to <code>getValidPropertyDescriptors(SHIRT_SIZE)</code> would return a
-	 * DataModelPropertyDescriptor array where the value, description pairs would be {(1, small),
-	 * (2, medium), (3, large)}.
-	 * </p>
-	 * <p>
-	 * An IDataModel implementor defines this in IDataModelProvider.
-	 * </p>
-	 * 
-	 * 
-	 * @param propertyName
-	 *            then name of the property to check
-	 * @return the array of valid DataModelPropertyDescriptors
-	 * @see #getPropertyDescriptor(String)
-	 */
-	public DataModelPropertyDescriptor[] getValidPropertyDescriptors(String propertyName);
-
-	/**
-	 * <p>
-	 * Adds the specified IDataModelListener to listen for DataModelEvents. If the specified
-	 * listener has already been added, calling this method will have no effect.
-	 * </p>
-	 * 
-	 * @param dataModelListener
-	 *            the new listener to add.
-	 * 
-	 * @see #removeListener(IDataModelListener)
-	 */
-	public void addListener(IDataModelListener dataModelListener);
-
-	/**
-	 * <p>
-	 * Remove the specified IDataModelListener. If the specified listener is not a registered
-	 * listenr on this IDataModel, then calling this method will have no effect.
-	 * </p>
-	 * 
-	 * @param dataModelListener
-	 *            the listener to remove.
-	 * @see #addListener(IDataModelListener)
-	 */
-	public void removeListener(IDataModelListener dataModelListener);
-
-	/**
-	 * <p>
-	 * A constant used for notification.
-	 * </p>
-	 * 
-	 * @see DataModelEvent#VALUE_CHG
-	 * @see #notifyPropertyChange(String, int)
-	 */
-	public static final int VALUE_CHG = DataModelEvent.VALUE_CHG;
-	/**
-	 * <p>
-	 * A constant used for notification. This contant is different from the others because it does
-	 * not map to an event type on DataModelEvent. When notifying with this type, a check is first
-	 * done to see whether the property is set. If the property is <empf>NOT</emph> set, then a
-	 * <code>VALUE_CHG</code> is fired, otherwise nothing happens.
-	 * </p>
-	 * 
-	 * @see #notifyPropertyChange(String, int)
-	 */
-	public static final int DEFAULT_CHG = DataModelEvent.DEFAULT_CHG;
-	/**
-	 * <p>
-	 * A constant used for notification.
-	 * </p>
-	 * 
-	 * @see DataModelEvent#ENABLE_CHG
-	 * @see #notifyPropertyChange(String, int)
-	 */
-	public static final int ENABLE_CHG = DataModelEvent.ENABLE_CHG;
-	/**
-	 * <p>
-	 * A constant used for notification.
-	 * </p>
-	 * 
-	 * @see DataModelEvent#VALID_VALUES_CHG
-	 * @see #notifyPropertyChange(String, int)
-	 */
-	public static final int VALID_VALUES_CHG = DataModelEvent.VALID_VALUES_CHG;
-
-	/**
-	 * <p>
-	 * Notify all listeners of a property change. <code>eventType</code> specifies the type of
-	 * change. Acceptible values for eventType are <code>VALUE_CHG</code>,
-	 * <code>DEFAULT_CHG</code>, <code>ENABLE_CHG</code>, <code>VALID_VALUES_CHG</code>. If
-	 * the eventType is <code>DEFAULT_CHG</code> and the specified property is set, then this
-	 * method will do nothing.
-	 * </p>
-	 * <p>
-	 * Typically this method should only be invoked by an IDataModelProvider from its propertySet
-	 * implementation.
-	 * </p>
-	 * 
-	 * @param propertyName
-	 *            the name of the property changing
-	 * @param eventType
-	 *            the type of event to fire
-	 * 
-	 * @see #VALUE_CHG
-	 * @see #DEFAULT_CHG
-	 * @see #ENABLE_CHG
-	 * @see #VALID_VALUES_CHG
-	 * @see DataModelEvent
-	 */
-	public void notifyPropertyChange(String propertyName, int eventType);
-
-	/**
-	 * <p>
-	 * A typical dispose method used to clean up any resources not handled by general garbage
-	 * collection.
-	 * </p>
-	 * 
-	 */
-	public void dispose();
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/IDataModelListener.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/IDataModelListener.java
deleted file mode 100644
index d50aa4a..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/IDataModelListener.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.datamodel;
-
-/**
- * <p>
- * The interface required when listening for DataModelEvents from an IDataModel.
- * </p>
- * 
- * @see org.eclipse.wst.common.frameworks.datamodel.IDataModel#addListener(IDataModelListener)
- * @see org.eclipse.wst.common.frameworks.datamodel.DataModelEvent
- * 
- * @since 1.0
- */
-public interface IDataModelListener {
-
-	/**
-	 * <p>
-	 * Sent when DataModelEvents occur.
-	 * </p>
-	 * 
-	 * @param event
-	 *            the DataModelEvent
-	 */
-	public void propertyChanged(DataModelEvent event);
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/IDataModelOperation.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/IDataModelOperation.java
deleted file mode 100644
index 8029d64..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/IDataModelOperation.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.datamodel;
-
-import java.util.List;
-import java.util.Set;
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.wst.common.environment.IEnvironment;
-
-/**
- * <p>
- * IDataModelOperation defines an IDataModel driven undoable operation. Every IDataModelOperation
- * may be extended by third party clients using the extended operation framework.
- * </p>
- * 
- * @see org.eclipse.wst.common.frameworks.datamodel.IDataModel
- * 
- * @since 1.0
- */
-public interface IDataModelOperation extends IUndoableOperation {
-
-	/**
-	 * <p>
-	 * Sets the unique operation id. Typically, clients should not invoke this method.
-	 * </p>
-	 * 
-	 * @param id
-	 *            the unique operation id
-	 */
-	public void setID(String id);
-
-	/**
-	 * <p>
-	 * Returns the unique operation id.
-	 * </p>
-	 * 
-	 * @return the unique operation id
-	 */
-	public String getID();
-
-	/**
-	 * <p>
-	 * Sets the IDataModel for this operation.
-	 * </p>
-	 * 
-	 * @param model
-	 *            the IDataModel used to run this operation
-	 */
-	public void setDataModel(IDataModel model);
-
-	/**
-	 * <p>
-	 * Returns this operation's IDataModel.
-	 * </p>
-	 * 
-	 * @return this operation's IDataModel.
-	 */
-	public IDataModel getDataModel();
-
-	public Set getDataModelIDs();
-
-	public ISchedulingRule getSchedulingRule();
-
-	public int getOperationExecutionFlags();
-
-  /**
-   * The framework will set the environment on this operation 
-   * before it is executed.  The operation can then use the
-   * environment to report status, log information, and access
-   * resources in an environment neutral way.
-   */
-  public void setEnvironment( IEnvironment environment );
-  
-  /**
-   * An operation can specify a list of operations that should run
-   * before this operation.  Subclasses can override this method to 
-   * provide these operations.  The operations provided will be
-   * executed in the order specified in the list.
-   * @return returns a list of data model operations or null.  
-   * Null indicates that there are no pre operations.
-   */
-  public List getPreOperations();
-  
-  /**
-   * An operation can specify a list of operations that should run
-   * after this operation.  Subclasses can override this method to 
-   * provide these operations.  The operations provided will be
-   * executed in the order specified in the list.
-   * @return returns a list of data model operations or null.
-   * Null indicates that there are no post operations.
-   */
-  public List getPostOperations();
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/IDataModelProperties.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/IDataModelProperties.java
deleted file mode 100644
index a52d3cf..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/IDataModelProperties.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.datamodel;
-/**
- * <p>
- * IDataModelProperties provides the base interface for all Data Model Properties interfaces.
- * The interface itself can be used to access an instance of the IDataModel and IDataModelProvider which will be registered
- * against with the interface.  IDataModels are not meant to be instantiated directly, rather they are built from an
- * IDataModelProvider. In this way the user will call to the DataModelFactory passing in the interface,
- * which will return the correct IDataModel. 
- * </p>
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * 
- * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider
- * @see org.eclipse.wst.common.frameworks.datamodel.DataModelFactory
- * 
- * @since 1.0
- */
-public interface IDataModelProperties {
-
-	/**
-	 * A boolean property defaults to Boolean.TRUE. If this is set to Boolean.FALSE no extended
-	 * operations will be executed.
-	 */
-	public static final String ALLOW_EXTENSIONS = "IDataModelProperties.ALLOW_EXTENSIONS"; //$NON-NLS-1$
-	
-	/**
-	 * A List containing String objects, defautls to an empty List. If this list contains elements
-	 * and ALLOW_EXTENSIONS is set to Boolean.TRUE, then only extended operations not identified in
-	 * this list will be executed. These strings should either be the operation id or the fully
-	 * qualified operation class name.
-	 */
-	public static final String RESTRICT_EXTENSIONS = "IDataModelProperties.RESTRICT_EXTENSIONS"; //$NON-NLS-1$
-	
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/IDataModelProvider.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/IDataModelProvider.java
deleted file mode 100644
index 63a2723..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/IDataModelProvider.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.datamodel;
-
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-/**
- * IDataModelProviders are used by the DataMdoelFactory to construct IDataModels.  
- * 
- * 
- * @since 1.0
- */
-public interface IDataModelProvider extends IDataModelProperties {
-
-	public static IStatus OK_STATUS = new Status(IStatus.OK, "org.eclipse.wst.common.frameworks.internal", 0, "OK", null); //$NON-NLS-1$ //$NON-NLS-2$
-
-	public void setDataModel(IDataModel dataModel);
-
-	/**
-	 * <p>
-	 * Returns the backing IDataModel for this provider.
-	 * </p>
-	 * 
-	 * @return the backing IDataModel
-	 */
-	public IDataModel getDataModel();
-
-	/**
-	 * <p>
-	 * Returns a list of property names for which this provider is responsible. This method is
-	 * called only once during initialization.
-	 * </p>
-	 * 
-	 * @return the array of valid property names.
-	 */
-	public Set getPropertyNames();
-
-	/**
-	 * <p>
-	 * Providers should perform additional initialization here.
-	 * </p>
-	 */
-	public void init();
-
-	/**
-	 * <p>
-	 * This is where the provider should define how default properties should be computed.
-	 * </p>
-	 * 
-	 * @param propertyName
-	 *            the specified property
-	 * @return the default property value
-	 */
-	public Object getDefaultProperty(String propertyName);
-
-
-	/**
-	 * <p>
-	 * This is where the provider should define how property enablements are computed.
-	 * </p>
-	 * 
-	 * @param propertyName
-	 *            the specified property
-	 * @return <code>true</code> if the property is enabled, <code>false</code> otherwise.
-	 */
-	public boolean isPropertyEnabled(String propertyName);
-
-	/**
-	 * IDataModelProviders should perform property validation here. All calls to
-	 * IDataModel.validateProperty(String) are routed to the appropriate IDatModelProvider. When
-	 * IDataModel.validate() or IDataModel.validate(boolean) are called to validate the entire
-	 * IDataModel, any nested model names are also passed through to the IDataModelProvider for a
-	 * chance to validate the nested IDataModel in an appropriate manner.
-	 * 
-	 * @param name
-	 * @return an IStatus
-	 */
-	public IStatus validate(String name);
-
-	/**
-	 * <p>
-	 * This is a special callback hook for the IDataModel provider to be notified of a setProperty()
-	 * call invoked on the backing IDataModel. This method is called after the actual value has been
-	 * stored by the IDataModel but before any general notifications are fired to its listeners.
-	 * Thus this IDataModelProvider may react to updates apropriately by setting other properties,
-	 * notifying default changes, notifying valid value changes, etc.
-	 * </p>
-	 * 
-	 * @param propertyName
-	 * @param propertyValue
-	 * @return <code>true</code> to fire a VALUE_CHG DataModelEvent.
-	 */
-	public boolean propertySet(String propertyName, Object propertyValue);
-
-	public DataModelPropertyDescriptor getPropertyDescriptor(String propertyName);
-
-	public DataModelPropertyDescriptor[] getValidPropertyDescriptors(String propertyName);
-
-	public List getExtendedContext();
-
-	public IDataModelOperation getDefaultOperation();
-
-	public String getID();
-
-	public void dispose();
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/package.xml b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/package.xml
deleted file mode 100644
index 855e7a4..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/package.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<html>
-    <head>
-        <meta
-            name="root"
-            content="../../../../../../" />
-        <title>Component creation and Referenced Component api overview</title>
-    </head>
-
-    <body>  
-		<abstract>
-        This package includes API  for Data Model Provider framework for builing executable
-        and undoable operations using data models, their providers and provider interfaces that
-        contain the properties used by the providers to set and retrieve these propertiese. 
-		</abstract>
-
-	<a href="#top">top</a>
-    </body>
-</html>    
-    
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/properties/package.xml b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/properties/package.xml
deleted file mode 100644
index caaf774..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/properties/package.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<html>
-    <head>
-        <meta
-            name="root"
-            content="../../../../../../../" />
-        <title>Component creation and Referenced Component api overview</title>
-    </head>
-
-    <body>  
-		<abstract>
-        This package includes API that defines the propeties that can be set on a flexible
-        project datamodel to drive the the wizard and operations.
-		</abstract>
-
-	<a href="#top">top</a>
-    </body>
-</html>    
-    
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/AbstractRegistryDescriptor.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/AbstractRegistryDescriptor.java
deleted file mode 100644
index d4069c5..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/AbstractRegistryDescriptor.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Feb 12, 2004
- *
- */
-package org.eclipse.wst.common.frameworks.internal;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.wst.common.frameworks.internal.enablement.FunctionGroupRegistry;
-import org.eclipse.wst.common.frameworks.internal.enablement.IEnablementIdentifier;
-import org.eclipse.wst.common.frameworks.internal.enablement.IEnablementManager;
-import org.eclipse.wst.common.frameworks.internal.enablement.Identifiable;
-
-
-/**
- * @author schacher
- * 
- * Common superclass for enablement-aware (e.g., using function groups or activiities) extension
- * points.
- */
-public abstract class AbstractRegistryDescriptor extends ConfigurationElementWrapper implements Identifiable {
-
-	protected Integer priority;
-
-	public AbstractRegistryDescriptor(IConfigurationElement anElement) {
-		super(anElement);
-	}
-
-	public IEnablementIdentifier getEnablementIdentifier(IProject project) {
-		return IEnablementManager.INSTANCE.getIdentifier(getID(), project);
-	}
-
-	public abstract String getID();
-
-	public int getPriority() {
-		if (priority == null)
-			priority = new Integer(FunctionGroupRegistry.getInstance().getFunctionPriority(getID()));
-		return priority.intValue();
-	}
-
-	public boolean isEnabled(IProject p) {
-		IEnablementIdentifier id = getEnablementIdentifier(p);
-		return id.isEnabled();
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/AdaptabilityUtility.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/AdaptabilityUtility.java
deleted file mode 100644
index 9e8a19d..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/AdaptabilityUtility.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.frameworks.internal;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.Platform;
-
-/**
- * @author mdelder
- *  
- */
-public class AdaptabilityUtility {
-
-
-	public static Object getAdapter(Object element, Class adapter) {
-		if (element == null)
-			return null;
-		else if (element instanceof IAdaptable)
-			return ((IAdaptable) element).getAdapter(adapter);
-		else
-			return Platform.getAdapterManager().getAdapter(element, adapter);
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/ConfigurationElementWrapper.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/ConfigurationElementWrapper.java
deleted file mode 100644
index 1f3572a..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/ConfigurationElementWrapper.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Oct 20, 2003
- *
- * To change the template for this generated file go to
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-
-/**
- * @author schacher
- * 
- * To change the template for this generated type comment go to Window>Preferences>Java>Code
- * Generation>Code and Comments
- */
-public class ConfigurationElementWrapper {
-
-	protected IConfigurationElement element;
-
-	/**
-	 *  
-	 */
-	public ConfigurationElementWrapper(IConfigurationElement element) {
-		super();
-		this.element = element;
-	}
-
-
-
-	/**
-	 * @return Returns the element.
-	 */
-	protected IConfigurationElement getElement() {
-		return element;
-	}
-
-	/**
-	 * Return the plugin id of the configuration element
-	 * 
-	 * @return
-	 */
-	public String getPluginId() {
-		String pluginId = null;
-
-		if (element != null) {
-			IExtension extension = element.getDeclaringExtension();
-
-			if (extension != null) {
-				pluginId = extension.getNamespace();
-				// TODO jsholl is this correct???
-			}
-		}
-
-		return pluginId;
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/DataModelManager.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/DataModelManager.java
deleted file mode 100644
index 5396fd7..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/DataModelManager.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 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
- **************************************************************************************************/
-package org.eclipse.wst.common.frameworks.internal;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-
-public class DataModelManager {
-	private IDataModel rootDataModel;
-	private HashMap nestedModelEntries; // Element = java.lang.Integer
-
-	public DataModelManager(IDataModel rootDataModel) {
-		this.rootDataModel = rootDataModel;
-		nestedModelEntries = new HashMap();
-
-		Iterator names = this.rootDataModel.getNestedModelNames().iterator();
-
-		while (names.hasNext()) {
-			String nestedModelName = (String) names.next();
-			nestedModelEntries.put(nestedModelName, new Integer(1));
-		}
-	}
-
-	public IDataModel getDataModel() {
-		return rootDataModel;
-	}
-
-	public void addNestedDataModel(String dataModelID) {
-		Integer referenceCount = (Integer) nestedModelEntries.get(dataModelID);
-
-		if (referenceCount == null) {
-			// This nested data model is not currently in the root data model.
-			// Therefore, we need to create one and add it as a nested data model.
-			IDataModel dataModel = DataModelFactory.createDataModel(dataModelID);
-
-			if (dataModel != null) {
-				rootDataModel.addNestedModel(dataModelID, dataModel);
-				nestedModelEntries.put(dataModelID, new Integer(1));
-			}
-		} else {
-			// We already have this data model nested in the root data model
-			// so just increment the reference count.
-			nestedModelEntries.put(dataModelID, new Integer(referenceCount.intValue() + 1));
-		}
-	}
-
-	public void removeNestedDataModel(String dataModelID) {
-		Integer referenceCount = (Integer) nestedModelEntries.get(dataModelID);
-
-		if (referenceCount != null) {
-			int newRefCount = referenceCount.intValue() - 1;
-
-			if (newRefCount == 0) {
-				// Remove the nested data model.
-				nestedModelEntries.remove(dataModelID);
-				rootDataModel.removeNestedModel(dataModelID);
-			} else {
-				// Set the table entry to the decremented ref count value.
-				nestedModelEntries.put(dataModelID, new Integer(newRefCount));
-			}
-		}
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/ExceptionHelper.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/ExceptionHelper.java
deleted file mode 100644
index 517d65b..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/ExceptionHelper.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-
-package org.eclipse.wst.common.frameworks.internal;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Utility class to factor common code for implementers of IArchiveWrappedException
- */
-public class ExceptionHelper {
-	/**
-	 * Utility class; cannot be instantiated
-	 */
-	private ExceptionHelper() {
-		super();
-	}
-
-	/**
-	 * Return the messages from
-	 * 
-	 * @exception and
-	 *                all nested exceptions, in order from outermost to innermost
-	 */
-	public static java.lang.String[] getAllMessages(IWrappedException exception) {
-		List messages = new ArrayList(4);
-		messages.add(exception.getMessage());
-		Exception nested = exception.getNestedException();
-		while (nested != null) {
-			messages.add(nested.getMessage());
-			if (nested instanceof IWrappedException)
-				nested = ((IWrappedException) nested).getNestedException();
-			else
-				nested = null;
-		}
-		return (String[]) messages.toArray(new String[messages.size()]);
-	}
-
-	/**
-	 * Return the messages from
-	 * 
-	 * @exception and
-	 *                all nested exceptions, in order from outermost to innermost, concatenated as
-	 *                one
-	 */
-	public static String getConcatenatedMessages(IWrappedException exception) {
-		String[] messages = getAllMessages(exception);
-		StringBuffer sb = new StringBuffer(256);
-		for (int i = 0; i < messages.length; i++) {
-			sb.append(messages[i]);
-			if (i < messages.length - 1)
-				sb.append('\n');
-		}
-		return sb.toString();
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/ISaveHandler.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/ISaveHandler.java
deleted file mode 100644
index f67ce31..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/ISaveHandler.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-
-package org.eclipse.wst.common.frameworks.internal;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IProgressMonitor;
-
-/**
- * Defines the API for coping with attempts to overwrite read-only files or save failures
- */
-public interface ISaveHandler {
-	public void access();
-
-	public void handleSaveFailed(SaveFailedException ex, IProgressMonitor monitor);
-
-	public void release();
-
-	public boolean shouldContinueAndMakeFileEditable(IFile aFile);
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/IWrappedException.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/IWrappedException.java
deleted file mode 100644
index 7b3f3ae..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/IWrappedException.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-
-package org.eclipse.wst.common.frameworks.internal;
-
-/**
- * Common interface for ArchiveRuntime and ArchiveWrapped exceptions, which can contain nested
- * exceptions
- */
-public interface IWrappedException {
-	/**
-	 * Return the messages from this and all nested exceptions, in order from outermost to innermost
-	 */
-	public String[] getAllMessages();
-
-	/**
-	 * Return the messages from this and all nested exceptions, in order from outermost to
-	 * innermost, concatenated as one
-	 */
-	public String getConcatenatedMessages();
-
-	public Exception getInnerMostNestedException();
-
-	public String getMessage();
-
-	public java.lang.Exception getNestedException();
-
-	public void printStackTrace();
-
-	public void printStackTrace(java.io.PrintStream s);
-
-	public void printStackTrace(java.io.PrintWriter s);
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/Messages.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/Messages.java
deleted file mode 100644
index d8756a9..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/Messages.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Nov 21, 2003
- *
- * To change the template for this generated file go to
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal;
-
-import java.text.MessageFormat;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * @author DABERG
- * 
- * To change the template for this generated type comment go to Window>Preferences>Java>Code
- * Generation>Code and Comments
- */
-public abstract class Messages {
-	//Resource bundle.
-	protected ResourceBundle resourceBundle;
-
-	/**
-	 * The constructor.
-	 */
-	public Messages() {
-		initializeBundle();
-	}
-
-	protected abstract void initializeBundle();
-
-	/**
-	 * Returns the string from the resource bundle, or 'key' if not found.
-	 */
-	protected String doGetResourceString(String key) {
-		try {
-			return (resourceBundle != null ? resourceBundle.getString(key) : key);
-		} catch (MissingResourceException e) {
-			return "!" + key + "!"; //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	protected String doGetResourceString(String key, Object[] args) {
-		String pattern = doGetResourceString(key);
-		if (pattern != null)
-			return MessageFormat.format(pattern, args);
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/OperationListener.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/OperationListener.java
deleted file mode 100644
index e6efab7..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/OperationListener.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 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
- **************************************************************************************************/
-package org.eclipse.wst.common.frameworks.internal;
-
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
-
-public interface OperationListener {
-	/**
-	 * 
-	 * @param operation
-	 *            the operation for this traversal event.
-	 * @return return true if the traversal of operations should continue.
-	 */
-	public boolean notify(IDataModelOperation operation);
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/OperationManager.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/OperationManager.java
deleted file mode 100644
index c40a66b..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/OperationManager.java
+++ /dev/null
@@ -1,464 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 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
- **************************************************************************************************/
-package org.eclipse.wst.common.frameworks.internal;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.Stack;
-import java.util.Vector;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-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.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.wst.common.environment.IEnvironment;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
-import org.eclipse.wst.common.frameworks.internal.datamodel.IWorkspaceRunnableWithStatus;
-import org.eclipse.wst.common.frameworks.internal.operations.ComposedExtendedOperationHolder;
-import org.eclipse.wst.common.frameworks.internal.operations.OperationStatus;
-
-public class OperationManager {
-	private IDataModel dataModel;
-	private DataModelManager dataModelManager;
-	private TableEntry rootOperation;
-	private HashMap operationTable;
-	private Stack runStopList;
-	private IProgressMonitor monitor;
-	private IAdaptable adaptable;
-	private OperationStatus status;
-	private OperationListener preExecuteListener;
-	private OperationListener postExecuteListener;
-	private OperationListener undoExecuteListener;
-	private IEnvironment environment;
-
-	public OperationManager(DataModelManager aDataModelManager, IDataModelOperation aRootOperation, IEnvironment aEnvironment) {
-		if (aRootOperation == null)
-			aRootOperation = new NullOperation();
-
-		TableEntry entry = new TableEntry(aRootOperation);
-
-		dataModelManager = aDataModelManager;
-		dataModel = dataModelManager.getDataModel();
-		rootOperation = entry;
-		operationTable = new HashMap();
-		runStopList = new Stack();
-		operationTable.put(aRootOperation.getID(), entry);
-		environment = aEnvironment;
-		addExtendedOperations(aRootOperation);
-
-		OperationListener defaultListener = new OperationListener() {
-			public boolean notify(IDataModelOperation operation) {
-				return true;
-			}
-		};
-
-		preExecuteListener = defaultListener;
-		postExecuteListener = defaultListener;
-		undoExecuteListener = defaultListener;
-	}
-
-	public void setProgressMonitor(IProgressMonitor monitor) {
-		this.monitor = monitor;
-	}
-
-	public void setAdaptable(IAdaptable adaptable) {
-		this.adaptable = adaptable;
-	}
-
-	public void addExtendedPreOperation(String operationId, IDataModelOperation insertOperation) {
-		TableEntry entry = (TableEntry) operationTable.get(operationId);
-
-		if (entry != null) {
-			TableEntry newEntry = new TableEntry(insertOperation);
-
-			entry.preOperations.add(newEntry);
-			operationTable.put(insertOperation.getID(), newEntry);
-		}
-	}
-
-	public void addExtendedPostOperation(String operationId, IDataModelOperation insertOperation) {
-		TableEntry entry = (TableEntry) operationTable.get(operationId);
-
-		if (entry != null) {
-			TableEntry newEntry = new TableEntry(insertOperation);
-
-			entry.postOperations.add(newEntry);
-			operationTable.put(insertOperation.getID(), newEntry);
-		}
-	}
-
-	public void setPreExecuteListener(OperationListener listener) {
-		if (listener != null)
-			preExecuteListener = listener;
-	}
-
-	public void setPostExecuteListener(OperationListener listener) {
-		if (listener != null)
-			postExecuteListener = listener;
-	}
-
-	public void setUndoExecuteListener(OperationListener listener) {
-		if (listener != null)
-			undoExecuteListener = listener;
-	}
-
-	public IStatus runOperations() {
-		boolean continueRun = true;
-		RunListEntry runEntry = startNewRun();
-
-		status = null;
-
-		// All operations have already been run so just return OK.
-		if (runEntry.stackEntries.empty())
-			return Status.OK_STATUS;
-
-		while (continueRun) {
-			continueRun = runOperationsUntilStopped(runEntry) && !runEntry.stackEntries.empty();
-		}
-
-		if (status != null && status.getSeverity() == IStatus.ERROR) {
-			undoLastRun();
-		}
-		return status;
-	}
-
-	public void undoLastRun() {
-		if (!runStopList.empty()) {
-			RunListEntry runListEntry = (RunListEntry) runStopList.pop();
-
-			for (int index = runListEntry.executedOperations.size() - 1; index >= 0; index--) {
-				IDataModelOperation operation = (IDataModelOperation) runListEntry.executedOperations.elementAt(index);
-				Set dataModelIDs = operation.getDataModelIDs();
-
-				if (dataModelIDs != null && dataModelIDs.size() > 0) {
-					Iterator ids = dataModelIDs.iterator();
-
-					while (ids.hasNext()) {
-						String dataModelID = (String) ids.next();
-						dataModelManager.removeNestedDataModel(dataModelID);
-					}
-				}
-
-				try {
-					undoExecuteListener.notify(operation);
-				} catch (Throwable exc) {
-					// TODO report undo notify exception.
-				}
-
-				if (operation.canUndo()) {
-					try {
-						runOperation(operation, true);
-					} catch (Throwable exc) {
-						// TODO report an undo exception here.
-					}
-				}
-			}
-		}
-	}
-
-	private RunListEntry startNewRun() {
-		RunListEntry newEntry = null;
-
-		if (runStopList.empty()) {
-			newEntry = new RunListEntry(rootOperation);
-		} else {
-			RunListEntry topRunList = (RunListEntry) runStopList.peek();
-			newEntry = new RunListEntry(topRunList);
-		}
-
-		runStopList.push(newEntry);
-
-		return newEntry;
-	}
-
-	private boolean runOperationsUntilStopped(RunListEntry runListEntry) {
-		StackEntry stackEntry = (StackEntry) runListEntry.stackEntries.peek();
-		boolean continueRun = true;
-
-		// Run extended pre operations.
-		for (int index = stackEntry.preOperationIndex + 1; continueRun && index < stackEntry.tableEntry.preOperations.size(); index++) {
-			TableEntry tableEntry = (TableEntry) stackEntry.tableEntry.preOperations.elementAt(index);
-
-			runListEntry.stackEntries.push(new StackEntry(tableEntry));
-			stackEntry.preOperationIndex = index;
-			continueRun = runOperationsUntilStopped(runListEntry);
-		}
-
-		if (continueRun && stackEntry.preOpChildIndex == -1)
-			stackEntry.addPreOpChildren();
-
-		// Run child pre operations.
-		for (int index = stackEntry.preOpChildIndex + 1; continueRun && index < stackEntry.preOpChildren.size(); index++) {
-			TableEntry tableEntry = (TableEntry) stackEntry.preOpChildren.elementAt(index);
-
-			runListEntry.stackEntries.push(new StackEntry(tableEntry));
-			stackEntry.preOpChildIndex = index;
-			continueRun = runOperationsUntilStopped(runListEntry);
-		}
-
-		if (continueRun && !stackEntry.operationExecuted) {
-			IDataModelOperation operation = stackEntry.tableEntry.operation;
-
-			try {
-				continueRun = preExecuteListener.notify(operation);
-
-				if (continueRun) {
-					Set dataModelIDs = operation.getDataModelIDs();
-
-					if (dataModelIDs != null && dataModelIDs.size() > 0) {
-						Iterator ids = dataModelIDs.iterator();
-
-						while (ids.hasNext()) {
-							String dataModelID = (String) ids.next();
-							dataModelManager.addNestedDataModel(dataModelID);
-						}
-					}
-
-					operation.setDataModel(dataModel);
-					operation.setEnvironment(environment);
-					setStatus(runOperation(operation, false));
-					runListEntry.executedOperations.add(operation);
-					stackEntry.operationExecuted = true;
-					continueRun = postExecuteListener.notify(operation);
-				}
-			} catch (Throwable exc) {
-				setStatus(new Status(IStatus.ERROR, "id", 0, exc.getMessage() == null ? exc.toString() : exc.getMessage(), exc));
-			}
-
-			if (status != null && status.getSeverity() == IStatus.ERROR) {
-				// This isn't really true, but it will cause the run operations to stop.
-				continueRun = false;
-			}
-		}
-
-		if (continueRun && stackEntry.postOpChildIndex == -1)
-			stackEntry.addPostOpChildren();
-
-		// Run child post operations.
-		for (int index = stackEntry.postOpChildIndex + 1; continueRun && index < stackEntry.postOpChildren.size(); index++) {
-			TableEntry tableEntry = (TableEntry) stackEntry.postOpChildren.elementAt(index);
-
-			stackEntry.postOpChildIndex = index;
-			runListEntry.stackEntries.push(new StackEntry(tableEntry));
-			continueRun = runOperationsUntilStopped(runListEntry);
-		}
-
-		// Run extended post operations.
-		for (int index = stackEntry.postOperationIndex + 1; continueRun && index < stackEntry.tableEntry.postOperations.size(); index++) {
-			TableEntry tableEntry = (TableEntry) stackEntry.tableEntry.postOperations.elementAt(index);
-
-			stackEntry.postOperationIndex = index;
-			runListEntry.stackEntries.push(new StackEntry(tableEntry));
-			continueRun = runOperationsUntilStopped(runListEntry);
-		}
-
-		// If we are have run the pre ops, this operation, and
-		// the post ops, we should pop this entry off the stack.
-		// Also, if continueRun is false we don't want to pop the stack since we will want to come
-		// back to this entry later.
-		if (continueRun) {
-			runListEntry.stackEntries.pop();
-		}
-
-		return continueRun;
-	}
-
-	private IStatus runOperation(final IDataModelOperation operation, final boolean isUndo) {
-		IWorkspaceRunnableWithStatus workspaceRunnable = new IWorkspaceRunnableWithStatus(adaptable) {
-			public void run(IProgressMonitor pm) throws CoreException {
-				try {
-					if (isUndo) {
-						this.setStatus(operation.undo(monitor, getInfo()));
-					} else {
-						this.setStatus(operation.execute(monitor, getInfo()));
-					}
-				} catch (Throwable exc) {
-					exc.printStackTrace();
-				}
-			}
-		};
-
-		ISchedulingRule rule = operation.getSchedulingRule();
-
-		try {
-			if (rule == null) {
-				ResourcesPlugin.getWorkspace().run(workspaceRunnable, monitor);
-			} else {
-				ResourcesPlugin.getWorkspace().run(workspaceRunnable, rule, operation.getOperationExecutionFlags(), monitor);
-			}
-		} catch (CoreException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		return workspaceRunnable.getStatus();
-	}
-
-	private void setStatus(IStatus newStatus) {
-		if (status == null) {
-			status = new OperationStatus(newStatus.getMessage(), newStatus.getException());
-			status.setSeverity(newStatus.getSeverity());
-			status.add(newStatus);
-		} else {
-			status.add(newStatus);
-		}
-	}
-
-	private void addExtendedOperations(IDataModelOperation operation) {
-		ComposedExtendedOperationHolder extendedOps = ComposedExtendedOperationHolder.createExtendedOperationHolder(operation.getID());
-
-		ArrayList preOps = null;
-		ArrayList postOps = null;
-
-		if (extendedOps != null) {
-			preOps = extendedOps.getPreOps();
-			postOps = extendedOps.getPostOps();
-		}
-
-		if (preOps == null)
-			preOps = new ArrayList();
-		if (postOps == null)
-			postOps = new ArrayList();
-
-		for (int index = 0; index < preOps.size(); index++) {
-			IDataModelOperation newOperation = (IDataModelOperation) preOps.get(index);
-
-			addExtendedPreOperation(operation.getID(), newOperation);
-			addExtendedOperations(newOperation);
-		}
-
-		for (int index = 0; index < postOps.size(); index++) {
-			IDataModelOperation newOperation = (IDataModelOperation) postOps.get(index);
-
-			addExtendedPostOperation(operation.getID(), newOperation);
-			addExtendedOperations(newOperation);
-		}
-	}
-
-	private class RunListEntry {
-		public Stack stackEntries;
-		public Vector executedOperations;
-
-		public RunListEntry(TableEntry newEntry) {
-			stackEntries = new Stack();
-			executedOperations = new Vector();
-			stackEntries.push(new StackEntry(newEntry));
-		}
-
-		public RunListEntry(RunListEntry oldList) {
-			stackEntries = new Stack();
-			executedOperations = new Vector();
-
-			for (int index = 0; index < oldList.stackEntries.size(); index++) {
-				StackEntry oldEntry = (StackEntry) oldList.stackEntries.elementAt(index);
-				stackEntries.add(new StackEntry(oldEntry));
-			}
-		}
-	}
-
-	private class StackEntry {
-		public int preOperationIndex;
-		public int postOperationIndex;
-		public int preOpChildIndex;
-		public int postOpChildIndex;
-		public boolean operationExecuted;
-		public Vector preOpChildren;
-		public Vector postOpChildren;
-		public TableEntry tableEntry;
-
-		public StackEntry(TableEntry newTableEntry) {
-			preOperationIndex = -1;
-			postOperationIndex = -1;
-			operationExecuted = false;
-			preOpChildIndex = -1;
-			postOpChildIndex = -1;
-			tableEntry = newTableEntry;
-		}
-
-		public StackEntry(StackEntry newStackEntry) {
-			preOperationIndex = newStackEntry.preOperationIndex;
-			postOperationIndex = newStackEntry.postOperationIndex;
-			operationExecuted = newStackEntry.operationExecuted;
-			tableEntry = newStackEntry.tableEntry;
-			preOpChildIndex = newStackEntry.preOpChildIndex;
-			postOpChildIndex = newStackEntry.postOpChildIndex;
-			preOpChildren = newStackEntry.preOpChildren == null ? null : new Vector(newStackEntry.preOpChildren);
-			postOpChildren = newStackEntry.postOpChildren == null ? null : new Vector(newStackEntry.postOpChildren);
-		}
-
-		public void addPreOpChildren() {
-			List preOps = tableEntry.operation.getPreOperations();
-
-			preOpChildren = new Vector();
-
-			if (preOps != null) {
-				for (int index = 0; index < preOps.size(); index++) {
-					IDataModelOperation op = (IDataModelOperation) preOps.get(index);
-					TableEntry newEntry = new TableEntry(op);
-
-					preOpChildren.add(newEntry);
-					operationTable.put(op.getID(), newEntry);
-					addExtendedOperations(op);
-				}
-			}
-		}
-
-		public void addPostOpChildren() {
-			List postOps = tableEntry.operation.getPostOperations();
-
-			postOpChildren = new Vector();
-
-			if (postOps != null) {
-				for (int index = 0; index < postOps.size(); index++) {
-					IDataModelOperation op = (IDataModelOperation) postOps.get(index);
-					TableEntry newEntry = new TableEntry(op);
-
-					postOpChildren.add(newEntry);
-					operationTable.put(op.getID(), newEntry);
-					addExtendedOperations(op);
-				}
-			}
-		}
-	}
-
-	private class TableEntry {
-		public IDataModelOperation operation;
-		public Vector preOperations;
-		public Vector postOperations;
-
-		public TableEntry(IDataModelOperation newOperation) {
-			operation = newOperation;
-			preOperations = new Vector(3);
-			postOperations = new Vector(3);
-		}
-	}
-
-	private class NullOperation extends AbstractDataModelOperation {
-		public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-			return Status.OK_STATUS;
-		}
-
-		public IStatus redo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-			return Status.OK_STATUS;
-		}
-
-		public IStatus undo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-			return Status.OK_STATUS;
-		}
-
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/SaveFailedException.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/SaveFailedException.java
deleted file mode 100644
index 7763509..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/SaveFailedException.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-
-package org.eclipse.wst.common.frameworks.internal;
-
-/**
- * Runtime exception that could get thrown during save of an edit model; clients should use
- * {@link #getConcatenatedMessages}to get all the messages of this and all nested exceptions to
- * report the failure.
- */
-public class SaveFailedException extends WrappedRuntimeException {
-	/**
-	 * Comment for <code>serialVersionUID</code>
-	 */
-	private static final long serialVersionUID = -4640018901910731240L;
-
-	/**
-	 * SaveFailedException constructor comment.
-	 */
-	public SaveFailedException() {
-		super();
-	}
-
-	/**
-	 * SaveFailedException constructor comment.
-	 * 
-	 * @param e
-	 *            java.lang.Exception
-	 */
-	public SaveFailedException(Exception e) {
-		super(e);
-	}
-
-	/**
-	 * SaveFailedException constructor comment.
-	 * 
-	 * @param s
-	 *            java.lang.String
-	 */
-	public SaveFailedException(String s) {
-		super(s);
-	}
-
-	/**
-	 * SaveFailedException constructor comment.
-	 * 
-	 * @param s
-	 *            java.lang.String
-	 * @param e
-	 *            java.lang.Exception
-	 */
-	public SaveFailedException(String s, Exception e) {
-		super(s, e);
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/SaveHandlerHeadless.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/SaveHandlerHeadless.java
deleted file mode 100644
index a9c07ce..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/SaveHandlerHeadless.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-
-package org.eclipse.wst.common.frameworks.internal;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.frameworks.internal.enablement.nonui.IWFTWrappedException;
-
-/**
- * Insert the type's description here. Creation date: (10/19/2001 11:40:59 AM)
- * 
- * @author: Administrator
- */
-public class SaveHandlerHeadless implements ISaveHandler {
-	/**
-	 * HeadlessSaveHandler constructor comment.
-	 */
-	public SaveHandlerHeadless() {
-		super();
-	}
-
-	/**
-	 * access method comment.
-	 */
-	public void access() {
-	}
-
-	/**
-	 * handleSaveFailed method comment.
-	 */
-	public void handleSaveFailed(SaveFailedException ex, org.eclipse.core.runtime.IProgressMonitor monitor) {
-		throw ex;
-	}
-
-	public static boolean isFailedWriteFileFailure(IWFTWrappedException ex) {
-		Exception nested = ex.getInnerMostNestedException();
-		if (nested == null)
-			return false;
-
-		return isFailedWriteFileFailure(nested);
-	}
-
-	public static boolean isFailedWriteFileFailure(Exception ex) {
-		if (ex instanceof IWFTWrappedException)
-			return isFailedWriteFileFailure((IWFTWrappedException) ex);
-		else if (ex instanceof CoreException)
-			return isFailedWriteFileFailure((CoreException) ex);
-		return false;
-	}
-
-	public static boolean isFailedWriteFileFailure(CoreException ex) {
-		org.eclipse.core.runtime.IStatus status = ex.getStatus();
-		if (status == null)
-			return false;
-		Throwable nested = status.getException();
-		if (nested instanceof CoreException)
-			return isFailedWriteFileFailure((CoreException) nested);
-		return status.getCode() == org.eclipse.core.resources.IResourceStatus.FAILED_WRITE_LOCAL;
-	}
-
-	/**
-	 * release method comment.
-	 */
-	public void release() {
-	}
-
-	/**
-	 * shouldContinueAndMakeFileEditable method comment.
-	 */
-	public boolean shouldContinueAndMakeFileEditable(org.eclipse.core.resources.IFile aFile) {
-		if (aFile == null)
-			return false;
-		String error = WTPResourceHandler.getString("Unable_to_save_read-only_f_ERROR_", new Object[]{aFile.getFullPath()}); //$NON-NLS-1$ = "Unable to save read-only file: "
-		Logger.getLogger().logError(error);
-		return false;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/SaveHandlerRegister.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/SaveHandlerRegister.java
deleted file mode 100644
index 7dee26d..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/SaveHandlerRegister.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal;
-
-import org.eclipse.jem.util.UIContextDetermination;
-
-
-/**
- * A registry for the default ISaveHandler to use when saving edit models
- */
-public class SaveHandlerRegister {
-	private static ISaveHandler saveHandler;
-
-	/**
-	 * This is a utility class and should not be instantiated
-	 */
-	protected SaveHandlerRegister() {
-		super();
-	}
-
-	public static ISaveHandler getSaveHandler() {
-		if (saveHandler == null)
-			saveHandler = (ISaveHandler) UIContextDetermination.createInstance("saveHandler"); //$NON-NLS-1$
-		return saveHandler;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/WTPPlugin.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/WTPPlugin.java
deleted file mode 100644
index 37c04a0..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/WTPPlugin.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Dec 10, 2003
- * 
- * To change the template for this generated file go to Window - Preferences - Java - Code
- * Generation - Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal;
-
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jem.util.logger.proxyrender.DefaultPluginTraceRenderer;
-import org.eclipse.jem.util.logger.proxyrender.IMsgLogger;
-import org.eclipse.wst.common.frameworks.internal.enablement.nonui.WorkbenchUtil;
-import org.osgi.framework.BundleContext;
-
-public abstract class WTPPlugin extends Plugin implements IMsgLogger {
-	protected static Logger logger = null;
-	protected static WTPPlugin instance = null; 
-	public ResourceBundle resourceBundle;
-
-	/**
-	 * @param descriptor
-	 */
-	public WTPPlugin() {
-		super();
-		instance = this;
-	}
-
-	public Logger getMsgLogger() {
-		if (logger == null) {
-			logger = Logger.getLogger(getPluginID());
-			setRenderer(logger);
-		}
-		return logger;
-	}
-
-	/**
-	 * @param aLogger
-	 */
-	protected void setRenderer(Logger aLogger) {
-		new DefaultPluginTraceRenderer(aLogger);
-	}
-
-	public Logger getLogger() {
-		return getMsgLogger();
-	}
-	public static boolean isPlatformCaseSensitive() {
-		return Platform.OS_MACOSX.equals(Platform.getOS()) ? false : new
-				java.io.File("a").compareTo(new java.io.File("A")) != 0;
-	}
-
-	public abstract String getPluginID();
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.Plugin#startup()
-	 */
-	public void start(BundleContext context) throws Exception  {
-		super.start(context);
-		WorkbenchUtil.setWorkbenchIsRunning(true);
-	}
-	
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/WTPProjectUtilities.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/WTPProjectUtilities.java
deleted file mode 100644
index d10281e..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/WTPProjectUtilities.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Nov 4, 2003
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.IResource;
-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.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
-
-
-/**
- * @author jsholl
- * 
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public class WTPProjectUtilities {
-
-	/**
-	 * Adds a old nauture to a project, FIRST, this is used to make project backward compatible
-	 */
-	public static void addOldNatureToProject(IProject proj, String natureId) throws CoreException {
-		IProjectDescription description = proj.getDescription();
-		String[] prevNatures = description.getNatureIds();
-
-		//check if the old nature does not exist
-		boolean addNature = true;
-		for (int i = 0; i < prevNatures.length; i++) {
-			String nature = prevNatures[i];
-			if (nature.equals(natureId)) {
-				addNature = false;
-				break;
-			}
-		}
-		if (addNature) {
-			String[] newNatures = new String[prevNatures.length + 1];
-			System.arraycopy(prevNatures, 0, newNatures, 1, prevNatures.length);
-			newNatures[0] = natureId;
-			description.setNatureIds(newNatures);
-			proj.setDescription(description, IResource.AVOID_NATURE_CONFIG, null);
-		}
-	}
-
-	/**
-	 * Adds a nature in the project in the index specified
-	 */
-	public static void addOldNatureToProject(IProject proj, String natureId, int index) throws CoreException {
-		IProjectDescription description = proj.getDescription();
-		String[] prevNatures = description.getNatureIds();
-
-		//check if the old nature does not exist
-		boolean addNature = true;
-		for (int i = 0; i < prevNatures.length; i++) {
-			String nature = prevNatures[i];
-			if (nature.equals(natureId)) {
-				addNature = false;
-				break;
-			}
-		}
-		if (addNature) {
-			String[] newNatures = new String[prevNatures.length + 1];
-			System.arraycopy(prevNatures, 0, newNatures, 0, index);
-
-			newNatures[index] = natureId;
-			System.arraycopy(prevNatures, index, newNatures, index + 1, prevNatures.length - index);
-			description.setNatureIds(newNatures);
-			proj.setDescription(description, IResource.AVOID_NATURE_CONFIG, null);
-		}
-	}
-
-	/**
-	 * Adds a nauture to a project, FIRST
-	 */
-	public static void addNatureToProject(IProject proj, String natureId) throws CoreException {
-		IProjectDescription description = proj.getDescription();
-		String[] prevNatures = description.getNatureIds();
-		String[] newNatures = new String[prevNatures.length + 1];
-		System.arraycopy(prevNatures, 0, newNatures, 1, prevNatures.length);
-		newNatures[0] = natureId;
-		description.setNatureIds(newNatures);
-		proj.setDescription(description, null);
-	}
-
-	/**
-	 * Adds a nature to a project, LAST
-	 */
-	public static void addNatureToProjectLast(IProject proj, String natureId) throws CoreException {
-		IProjectDescription description = proj.getDescription();
-		String[] prevNatures = description.getNatureIds();
-		String[] newNatures = new String[prevNatures.length + 1];
-		System.arraycopy(prevNatures, 0, newNatures, 0, prevNatures.length);
-		newNatures[prevNatures.length] = natureId;
-		description.setNatureIds(newNatures);
-		proj.setDescription(description, null);
-	}
-
-	/**
-	 * remove a nature from the project
-	 */
-	public static void removeNatureFromProject(IProject project, String natureId) throws CoreException {
-		IProjectDescription description = project.getDescription();
-		String[] prevNatures = description.getNatureIds();
-		int size = prevNatures.length;
-		int newsize = 0;
-		String[] newNatures = new String[size];
-		boolean matchfound = false;
-		for (int i = 0; i < size; i++) {
-			if (prevNatures[i].equals(natureId)) {
-				matchfound = true;
-				continue;
-			}
-			newNatures[newsize++] = prevNatures[i];
-		}
-		if (!matchfound)
-			throw new CoreException(new Status(IStatus.ERROR, WTPCommonPlugin.PLUGIN_ID, 0, "The nature id " + natureId + " does not exist on the project " + project.getName(), null)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		String[] temp = newNatures;
-		newNatures = new String[newsize];
-		System.arraycopy(temp, 0, newNatures, 0, newsize);
-		description.setNatureIds(newNatures);
-		project.setDescription(description, null);
-	}
-
-	public static IProject getProject(Object object) {
-		IProject result = null;
-
-		if (object instanceof IProject)
-			result = (IProject) object;
-		else if (object instanceof IResource)
-			result = ((IResource) object).getProject();
-		else if (object instanceof IAdaptable)
-			result = (IProject) ((IAdaptable) object).getAdapter(IProject.class);
-
-		return result;
-	}
-
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/WTPResourceHandler.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/WTPResourceHandler.java
deleted file mode 100644
index 6d82d66..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/WTPResourceHandler.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-
-package org.eclipse.wst.common.frameworks.internal;
-
-import java.text.MessageFormat;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * @author Administrator
- * 
- *  
- */
-public class WTPResourceHandler {
-
-	private static ResourceBundle fgResourceBundle;
-
-	/**
-	 * Returns the resource bundle used by all classes in this Project
-	 */
-	public static ResourceBundle getResourceBundle() {
-		try {
-			return ResourceBundle.getBundle("wtp_common"); //$NON-NLS-1$
-		} catch (MissingResourceException e) {
-			// does nothing - this method will return null and
-			// getString(String) will return the key
-			// it was called with
-		}
-		return null;
-	}
-
-	public static String getString(String key) {
-		if (fgResourceBundle == null) {
-			fgResourceBundle = getResourceBundle();
-		}
-
-		if (fgResourceBundle != null) {
-			try {
-				return fgResourceBundle.getString(key);
-			} catch (MissingResourceException e) {
-				return "!" + key + "!"; //$NON-NLS-2$//$NON-NLS-1$
-			}
-		}
-		return "!" + key + "!"; //$NON-NLS-2$//$NON-NLS-1$
-	}
-
-	public static String getString(String key, Object[] args) {
-
-		try {
-			return MessageFormat.format(getString(key), args);
-		} catch (IllegalArgumentException e) {
-			return getString(key);
-		}
-
-	}
-
-	public static String getString(String key, Object[] args, int x) {
-
-		return getString(key);
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/WrappedException.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/WrappedException.java
deleted file mode 100644
index cd2aba8..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/WrappedException.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-
-package org.eclipse.wst.common.frameworks.internal;
-
-public class WrappedException extends java.lang.reflect.InvocationTargetException {
-	/**
-	 * Comment for <code>serialVersionUID</code>
-	 */
-	private static final long serialVersionUID = -9221925581603648538L;
-
-	/**
-	 * WFTWrappedException constructor comment.
-	 */
-	protected WrappedException() {
-		super();
-	}
-
-	/**
-	 * WFTWrappedException constructor comment.
-	 * 
-	 * @param target
-	 *            java.lang.Throwable
-	 */
-	public WrappedException(Throwable target) {
-		super(target);
-	}
-
-	/**
-	 * WFTWrappedException constructor comment.
-	 * 
-	 * @param target
-	 *            java.lang.Throwable
-	 * @param s
-	 *            java.lang.String
-	 */
-	public WrappedException(Throwable target, String s) {
-		super(target, s);
-	}
-
-	/**
-	 * Print out a stack trace to the system err.
-	 */
-	public void printStackTrace() {
-		printStackTrace(System.err);
-	}
-
-	/**
-	 * Prints the exception to System.err. If we have a nested exception, print its stack.
-	 */
-	public void printStackTrace(java.io.PrintStream s) {
-		if (getTargetException() != null) {
-			s.println(this);
-			s.println("Stack trace of nested exception:"); //$NON-NLS-1$
-			getTargetException().printStackTrace(s);
-		} else {
-			super.printStackTrace(s);
-		}
-	}
-
-	/**
-	 * Prints the exception to System.err. If we have a nested exception, print its stack.
-	 */
-	public void printStackTrace(java.io.PrintWriter s) {
-		if (getTargetException() != null) {
-			s.println(this);
-			s.println("Stack trace of nested exception:"); //$NON-NLS-1$
-			getTargetException().printStackTrace(s);
-		} else {
-			super.printStackTrace(s);
-		}
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/WrappedRuntimeException.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/WrappedRuntimeException.java
deleted file mode 100644
index 35ed923..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/WrappedRuntimeException.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-
-package org.eclipse.wst.common.frameworks.internal;
-
-public class WrappedRuntimeException extends RuntimeException implements IWrappedException {
-	/**
-	 * Comment for <code>serialVersionUID</code>
-	 */
-	private static final long serialVersionUID = 2684637746275620101L;
-	/** The exception which necessitated this runtime exception, if one exists */
-	protected Exception nestedException;
-
-	public WrappedRuntimeException() {
-		super();
-	}
-
-	public WrappedRuntimeException(Exception e) {
-		super();
-		setNestedException(e);
-	}
-
-	public WrappedRuntimeException(String s) {
-		super(s);
-	}
-
-	public WrappedRuntimeException(String s, Exception e) {
-		super(s);
-		setNestedException(e);
-	}
-
-	/**
-	 * Return the messages from this and all nested exceptions, in order from outermost to innermost
-	 */
-	public java.lang.String[] getAllMessages() {
-		return ExceptionHelper.getAllMessages(this);
-	}
-
-	/**
-	 * Return the messages from this and all nested exceptions, in order from outermost to
-	 * innermost, concatenated as one
-	 */
-	public java.lang.String getConcatenatedMessages() {
-		return ExceptionHelper.getConcatenatedMessages(this);
-	}
-
-	/**
-	 * getInnerMostNestedException method comment.
-	 */
-	public java.lang.Exception getInnerMostNestedException() {
-		Exception n = getNestedException();
-		if (n == null)
-			return this;
-		else if (n instanceof IWrappedException)
-			return ((IWrappedException) n).getInnerMostNestedException();
-		else
-			return n;
-	}
-
-	/**
-	 * @return java.lang.Exception
-	 */
-	public java.lang.Exception getNestedException() {
-		return nestedException;
-	}
-
-	/**
-	 * Print out a stack trace to the system err.
-	 */
-	public void printStackTrace() {
-		printStackTrace(System.err);
-	}
-
-	/**
-	 * Prints the exception to System.err. If we have a nested exception, print its stack.
-	 */
-	public void printStackTrace(java.io.PrintStream s) {
-		if (nestedException != null) {
-			s.println(this);
-			s.println("Stack trace of nested exception:"); //$NON-NLS-1$
-			nestedException.printStackTrace(s);
-		} else {
-			super.printStackTrace(s);
-		}
-	}
-
-	/**
-	 * Prints the exception to System.err. If we have a nested exception, print its stack.
-	 */
-	public void printStackTrace(java.io.PrintWriter s) {
-		if (nestedException != null) {
-			s.println(this);
-			s.println("Stack trace of nested exception:"); //$NON-NLS-1$
-			nestedException.printStackTrace(s);
-		} else {
-			super.printStackTrace(s);
-		}
-	}
-
-	/**
-	 * @param newNestedException
-	 *            java.lang.Exception
-	 */
-	public void setNestedException(java.lang.Exception newNestedException) {
-		nestedException = newNestedException;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/activities/WTPActivityBridge.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/activities/WTPActivityBridge.java
deleted file mode 100644
index 3538ea4..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/activities/WTPActivityBridge.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on May 4, 2004
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal.activities;
-
-import java.util.Collections;
-import java.util.Set;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jem.util.logger.proxy.Logger;
-
-/**
- * @author jsholl
- * 
- * TODO To change the template for this generated type comment go to Window - Preferences - Java -
- * Code Generation - Code and Comments
- */
-public class WTPActivityBridge {
-	private static final String PLUGIN_ID = "org.eclipse.wst.common.frameworks"; //$NON-NLS-1$
-	private static final String EXTENSION_POINT = "WTPActivityBridgeHelper"; //$NON-NLS-1$
-	private static final String LISTENER_CLASS = "class"; //$NON-NLS-1$
-
-	private static WTPActivityBridge INSTANCE = null;
-	private WTPActivityBridgeHelper[] listeners;
-
-	public static WTPActivityBridge getInstance() {
-		if (null == INSTANCE) {
-			INSTANCE = new WTPActivityBridge();
-		}
-		return INSTANCE;
-	}
-
-	private WTPActivityBridge() {
-		loadExtensionPoints();
-	}
-
-	public void enableActivity(String activityID, boolean enabled) {
-		for (int i = 0; i < listeners.length; i++) {
-			listeners[i].enableActivity(activityID, enabled);
-		}
-	}
-
-	public Set getEnabledActivityIds() {
-		for (int i = 0; i < listeners.length; i++) {
-			return listeners[i].getEnabledActivityIds();
-		}
-		return Collections.EMPTY_SET;
-	}
-
-	public void setEnabledActivityIds(Set activityIDs) {
-		for (int i = 0; i < listeners.length; i++) {
-			listeners[i].setEnabledActivityIds(activityIDs);
-		}
-	}
-
-	public Set getActivityIDsFromContribution(String localID, String pluginID) {
-		for (int i = 0; i < listeners.length; i++) {
-			return listeners[i].getActivityIDsFromContribution(localID, pluginID);
-		}
-		return Collections.EMPTY_SET;
-	}
-
-	private void loadExtensionPoints() {
-		IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(PLUGIN_ID, EXTENSION_POINT);
-		if (point == null)
-			return;
-		IConfigurationElement[] elements = point.getConfigurationElements();
-		listeners = new WTPActivityBridgeHelper[elements.length];
-		for (int i = 0; i < elements.length; i++) {
-			if (null == elements[i].getAttribute(LISTENER_CLASS)) {
-				logError(elements[i], "No " + LISTENER_CLASS + " defined."); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			try {
-				listeners[i] = (WTPActivityBridgeHelper) elements[i].createExecutableExtension(LISTENER_CLASS);
-			} catch (CoreException e) {
-				logError(elements[i], "Error loading " + LISTENER_CLASS + ":" + elements[i].getAttribute(LISTENER_CLASS)); //$NON-NLS-1$ //$NON-NLS-2$
-				e.printStackTrace();
-			}
-		}
-	}
-
-	public static void logError(IConfigurationElement element, String text) {
-		IExtension extension = element.getDeclaringExtension();
-		StringBuffer buf = new StringBuffer();
-		buf.append("Plugin " + extension.getNamespace() + ", extension " + extension.getExtensionPointUniqueIdentifier()); //$NON-NLS-1$ //$NON-NLS-2$
-		buf.append("\n" + text); //$NON-NLS-1$
-		Logger.getLogger().logError(buf.toString());
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/activities/WTPActivityBridgeHelper.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/activities/WTPActivityBridgeHelper.java
deleted file mode 100644
index 4378df1..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/activities/WTPActivityBridgeHelper.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on May 4, 2004
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal.activities;
-
-import java.util.Set;
-
-/**
- * @author jsholl
- * 
- * TODO To change the template for this generated type comment go to Window - Preferences - Java -
- * Code Generation - Code and Comments
- */
-public interface WTPActivityBridgeHelper {
-
-	public void enableActivity(String activityID, boolean enabled);
-
-	public Set getEnabledActivityIds();
-
-	public void setEnabledActivityIds(Set activityIDs);
-
-	public Set getActivityIDsFromContribution(String localID, String pluginID);
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/datamodel/DataModelExtensionReader.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/datamodel/DataModelExtensionReader.java
deleted file mode 100644
index 86adbc6..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/datamodel/DataModelExtensionReader.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.datamodel;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jem.util.RegistryReader;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
-
-public class DataModelExtensionReader extends RegistryReader {
-
-	private static final String EXTENSION = "DataModelProviderExtension"; //$NON-NLS-1$
-
-	private static final String PROVIDER_ELEMENT = "DataModelProvider"; //$NON-NLS-1$
-	private static final String DEFINES_TYPE_ELEMENT = "ProviderDefinesType"; //$NON-NLS-1$
-	private static final String IMPLEMENTS_TYPE_ELEMENT = "ProviderImplementsType"; //$NON-NLS-1$
-
-	private static final String ATTRIBUTE_ID = "id"; //$NON-NLS-1$
-	private static final String ATTRIBUTE_CLASS = "class"; //$NON-NLS-1$
-	private static final String ATTRIBUTE_PROVIDER_TYPE = "providerType"; //$NON-NLS-1$
-	private static final String ATTRIBUTE_PROVIDER_ID = "providerID"; //$NON-NLS-1$
-//	private static final String ATTRIBUTE_FG = "functionGroupID"; //$NON-NLS-1$
-
-	private HashMap providerExtensions;
-	private HashMap definesExtensions;
-	private HashMap implementsExtensions;
-
-	private boolean hasInitialized = false;
-
-	public DataModelExtensionReader() {
-		super(WTPCommonPlugin.PLUGIN_ID, EXTENSION);
-	}
-
-	public boolean readElement(IConfigurationElement element) {
-		if (element.getName().equals(PROVIDER_ELEMENT)) {
-			String id = element.getAttribute(ATTRIBUTE_ID);
-			if (null == id || id.trim().length() == 0) {
-				Logger.getLogger().logError(new RuntimeException("Extension:" + EXTENSION + " Element:" + PROVIDER_ELEMENT + " is missing " + ATTRIBUTE_ID)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			}
-			String className = element.getAttribute(ATTRIBUTE_CLASS);
-			if (null == className || className.trim().length() == 0) {
-				Logger.getLogger().logError(new RuntimeException("Extension:" + EXTENSION + " Element:" + PROVIDER_ELEMENT + " is missing " + ATTRIBUTE_CLASS)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			}
-			addProviderExtension(id, element);
-		} else if (element.getName().equals(DEFINES_TYPE_ELEMENT)) {
-			String type = element.getAttribute(ATTRIBUTE_PROVIDER_TYPE);
-			if (null == type || type.trim().length() == 0) {
-				Logger.getLogger().logError(new RuntimeException("Extension:" + EXTENSION + " Element:" + DEFINES_TYPE_ELEMENT + " is missing " + ATTRIBUTE_PROVIDER_TYPE)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			}
-			String id = element.getAttribute(ATTRIBUTE_PROVIDER_ID);
-			if (null == id || id.trim().length() == 0) {
-				Logger.getLogger().logError(new RuntimeException("Extension:" + EXTENSION + " Element:" + DEFINES_TYPE_ELEMENT + " is missing " + ATTRIBUTE_PROVIDER_ID)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			}
-			addDefinesExtension(type, id);
-		} else if (element.getName().equals(IMPLEMENTS_TYPE_ELEMENT)) {
-			String type = element.getAttribute(ATTRIBUTE_PROVIDER_TYPE);
-			if (null == type || type.trim().length() == 0) {
-				Logger.getLogger().logError(new RuntimeException("Extension:" + EXTENSION + " Element:" + DEFINES_TYPE_ELEMENT + " is missing " + ATTRIBUTE_PROVIDER_TYPE)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			}
-			String id = element.getAttribute(ATTRIBUTE_PROVIDER_ID);
-			if (null == id || id.trim().length() == 0) {
-				Logger.getLogger().logError(new RuntimeException("Extension:" + EXTENSION + " Element:" + DEFINES_TYPE_ELEMENT + " is missing " + ATTRIBUTE_PROVIDER_ID)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			}
-			addImplementsExtension(type, id);
-		}
-		return true;
-	}
-
-	private void addProviderExtension(String id, IConfigurationElement element) {
-		if (providerExtensions.containsKey(id)) {
-			Logger.getLogger().logError(new RuntimeException("Duplicate " + PROVIDER_ELEMENT + " " + ATTRIBUTE_ID + " " + id)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		}
-		providerExtensions.put(id, element);
-	}
-
-	private void addDefinesExtension(String type, String id) {
-		if (definesExtensions.containsKey(type)) {
-			Logger.getLogger().logError(new RuntimeException("Duplicate " + PROVIDER_ELEMENT + " " + ATTRIBUTE_PROVIDER_TYPE + " " + type)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		}
-		definesExtensions.put(type, id);
-	}
-
-	private void addImplementsExtension(String type, String id) {
-		List cache;
-		if (implementsExtensions.containsKey(type))
-			cache = (List) implementsExtensions.get(type);
-		else
-			cache = new ArrayList();
-		cache.add(id);
-		implementsExtensions.put(type, cache);
-	}
-
-	protected IConfigurationElement getProviderExtension(String id) {
-		readRegistryIfNecessary();
-		IConfigurationElement element = (IConfigurationElement) providerExtensions.get(id);
-		if (null == element) {
-			Logger.getLogger().log(new RuntimeException("Extension:" + EXTENSION + " Element:" + PROVIDER_ELEMENT + " not found for " + ATTRIBUTE_ID + ": " + id)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-		}
-		return element;
-	}
-
-	protected String getDefinesExtension(String providerType) {
-		readRegistryIfNecessary();
-		String element = (String) definesExtensions.get(providerType);
-		if (null == element) {
-			Logger.getLogger().log(new RuntimeException("Extension:" + EXTENSION + " Element:" + DEFINES_TYPE_ELEMENT + " not found for " + ATTRIBUTE_PROVIDER_TYPE + ": " + providerType)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-		}
-		return element;
-	}
-
-	public String[] getProviderDescriptorsForProviderKind(String providerType) {
-		readRegistryIfNecessary();
-		List providerList = new ArrayList();
-		providerList.add(getDefinesExtension(providerType));
-		if (implementsExtensions.containsKey(providerType)) {
-			List implementsIds = (List) implementsExtensions.get(providerType);
-			if (implementsIds != null && !implementsIds.isEmpty()) {
-				providerList.addAll(implementsIds);
-			}
-		}
-		String[] providerArray = new String[providerList.size()];
-		for (int i = 0; i < providerArray.length; i++) {
-			providerArray[i] = (String) providerList.get(i);
-		}
-		return providerArray;
-	}
-
-	private void readRegistryIfNecessary() {
-		if (!hasInitialized) {
-			providerExtensions = new HashMap();
-			definesExtensions = new HashMap();
-			implementsExtensions = new HashMap();
-			readRegistry();
-			hasInitialized = true;
-		}
-	}
-
-	public IDataModelProvider getProvider(String id) {
-		IDataModelProvider provider = null;
-		IConfigurationElement element = getProviderExtension(id);
-		if (element == null)
-			return null;
-		try {
-			provider = (IDataModelProvider) element.createExecutableExtension(ATTRIBUTE_CLASS);
-		} catch (CoreException e) {
-			Logger.getLogger().logError(e);
-		}
-		return provider;
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/datamodel/DataModelImpl.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/datamodel/DataModelImpl.java
deleted file mode 100644
index eb7027a..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/datamodel/DataModelImpl.java
+++ /dev/null
@@ -1,464 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.datamodel;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-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.MultiStatus;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelEvent;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelPropertyDescriptor;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelListener;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelProperties;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
-import org.eclipse.wst.common.frameworks.internal.WTPResourceHandler;
-
-public final class DataModelImpl implements IDataModel, IDataModelListener {
-
-	private static final String PROPERTY_NOT_LOCATED_ = WTPResourceHandler.getString("20"); //$NON-NLS-1$
-	private static final String NESTED_MODEL_NOT_LOCATED = WTPResourceHandler.getString("21"); //$NON-NLS-1$
-
-	private static final DataModelPropertyDescriptor[] NO_DESCRIPTORS = new DataModelPropertyDescriptor[0];
-
-	private Collection basePropertyNames;
-	private Collection allPropertyNames;
-	private Collection nestedPropertyNames; // lazily initialzed when nested models added
-	private Map propertyValues = new Hashtable();
-	private Map nestedModels;
-	private Set nestingModels;
-	private List listeners;
-
-	private IDataModelProvider provider;
-
-	public DataModelImpl(IDataModelProvider dataModelProvider) {
-		init(dataModelProvider);
-	}
-
-	private void init(IDataModelProvider dataModelProvider) {
-		this.provider = dataModelProvider;
-		dataModelProvider.setDataModel(this);
-		Collection propertyNames = dataModelProvider.getPropertyNames();
-		HashSet properties = new HashSet();
-		properties.addAll(propertyNames);
-
-		properties.add(IDataModelProperties.ALLOW_EXTENSIONS);
-		properties.add(IDataModelProperties.RESTRICT_EXTENSIONS);
-		basePropertyNames = Collections.unmodifiableCollection(properties);
-		allPropertyNames = new HashSet();
-		allPropertyNames.addAll(basePropertyNames);
-		dataModelProvider.init();
-	}
-
-	public boolean isBaseProperty(String propertyName) {
-		return basePropertyNames.contains(propertyName);
-	}
-
-	public Collection getBaseProperties() {
-		return Collections.unmodifiableCollection(basePropertyNames);
-	}
-
-	public boolean isProperty(String propertyName) {
-		return allPropertyNames.contains(propertyName);
-	}
-
-	public Collection getAllProperties() {
-		return Collections.unmodifiableCollection(allPropertyNames);
-	}
-
-	public boolean isNestedProperty(String propertyName) {
-		return null != nestedPropertyNames && nestedPropertyNames.contains(propertyName);
-	}
-
-	public Collection getNestedProperties() {
-		return Collections.unmodifiableCollection(nestedPropertyNames);
-	}
-
-	private void checkValidPropertyName(String propertyName) {
-		if (!isProperty(propertyName)) {
-			throw new RuntimeException(PROPERTY_NOT_LOCATED_ + propertyName);
-		}
-	}
-
-	private DataModelImpl getOwningDataModel(String propertyName) {
-		checkValidPropertyName(propertyName);
-		return searchNestedModels(propertyName);
-	}
-
-	private DataModelImpl searchNestedModels(String propertyName) {
-		if (isBaseProperty(propertyName)) {
-			return this;
-		} else if (nestedModels != null) {
-			DataModelImpl dataModel = null;
-			Object[] keys = nestedModels.keySet().toArray();
-			for (int i = 0; i < keys.length; i++) {
-				dataModel = (DataModelImpl) nestedModels.get(keys[i]);
-				if (dataModel.isProperty(propertyName)) {
-					return dataModel.searchNestedModels(propertyName);
-				}
-			}
-		}
-		throw new RuntimeException(PROPERTY_NOT_LOCATED_ + propertyName);
-	}
-
-	public Object getProperty(String propertyName) {
-		DataModelImpl dataModel = getOwningDataModel(propertyName);
-		if (dataModel.propertyValues.containsKey(propertyName)) {
-			return dataModel.propertyValues.get(propertyName);
-		}
-		return dataModel.provider.getDefaultProperty(propertyName);
-	}
-
-	public Object getDefaultProperty(String propertyName) {
-		DataModelImpl dataModel = getOwningDataModel(propertyName);
-		return dataModel.provider.getDefaultProperty(propertyName);
-	}
-
-	public int getIntProperty(String propertyName) {
-		Object prop = getProperty(propertyName);
-		if (prop == null)
-			return -1;
-		return ((Integer) prop).intValue();
-	}
-
-	public boolean getBooleanProperty(String propertyName) {
-		Object prop = getProperty(propertyName);
-		if (prop == null)
-			return false;
-		return ((Boolean) prop).booleanValue();
-	}
-
-	public String getStringProperty(String propertyName) {
-		Object prop = getProperty(propertyName);
-		if (prop == null)
-			return ""; //$NON-NLS-1$
-		return (String) prop;
-	}
-
-	public boolean isPropertySet(String propertyName) {
-		DataModelImpl dataModel = getOwningDataModel(propertyName);
-		return dataModel.propertyValues.containsKey(propertyName);
-	}
-
-	public boolean isPropertyEnabled(String propertyName) {
-		DataModelImpl dataModel = getOwningDataModel(propertyName);
-		return dataModel.provider.isPropertyEnabled(propertyName);
-	}
-
-
-	public void setProperty(String propertyName, Object propertyValue) {
-		DataModelImpl dataModel = getOwningDataModel(propertyName);
-		dataModel.internalSetProperty(propertyName, propertyValue);
-	}
-
-	private void internalSetProperty(String propertyName, Object propertyValue) {
-		Object oldValue = propertyValues.get(propertyName);
-		if (valueChanged(propertyValue, oldValue)) {
-			if (null != propertyValue)
-				propertyValues.put(propertyName, propertyValue);
-			else if (propertyValues.containsKey(propertyName))
-				propertyValues.remove(propertyName);
-			if (provider.propertySet(propertyName, propertyValue)) {
-				notifyPropertyChange(propertyName, DataModelEvent.VALUE_CHG);
-			}
-		}
-	}
-
-	private boolean valueChanged(Object o1, Object o2) {
-		return o1 != o2 && ((o1 != null && !o1.equals(o2)) || !o2.equals(o1));
-	}
-
-	public void setIntProperty(String propertyName, int value) {
-		setProperty(propertyName, new Integer(value));
-	}
-
-	public void setBooleanProperty(String propertyName, boolean value) {
-		setProperty(propertyName, (value) ? Boolean.TRUE : Boolean.FALSE);
-	}
-
-	public void setStringProperty(String propertyName, String value) {
-		setProperty(propertyName, value);
-	}
-
-	public boolean addNestedModel(String modelName, IDataModel dataModel) {
-		if (this == dataModel) {
-			return false;
-		}
-		if (null == nestedModels) {
-			nestedModels = new Hashtable();
-			nestedPropertyNames = new HashSet();
-		}
-		DataModelImpl nestedDataModel = (DataModelImpl) dataModel;
-		if (null == nestedDataModel.nestingModels) {
-			nestedDataModel.nestingModels = new HashSet();
-		}
-		if (nestedDataModel.nestingModels.contains(this)) {
-			return false;
-		}
-		nestedDataModel.nestingModels.add(this);
-
-		nestedModels.put(modelName, nestedDataModel);
-
-		addNestedProperties(nestedDataModel.allPropertyNames);
-		nestedDataModel.addListener(this);
-		return true;
-	}
-
-	private void addNestedProperties(Collection nestedProperties) {
-		boolean propertiesAdded = allPropertyNames.addAll(nestedProperties);
-		propertiesAdded = nestedPropertyNames.addAll(nestedProperties) || propertiesAdded;
-		// Pass the new properties up the nesting chain
-		if (propertiesAdded && nestingModels != null) {
-			Iterator iterator = nestingModels.iterator();
-			while (iterator.hasNext()) {
-				((DataModelImpl) iterator.next()).addNestedProperties(nestedProperties);
-			}
-		}
-	}
-
-	public Collection getNestedModels() {
-		return nestedModels != null ? Collections.unmodifiableCollection(nestedModels.values()) : Collections.EMPTY_SET;
-	}
-
-	public Collection getNestedModelNames() {
-		return nestedModels != null ? Collections.unmodifiableCollection(nestedModels.keySet()) : Collections.EMPTY_SET;
-	}
-
-	public Collection getNestingModels() {
-		return nestingModels != null ? Collections.unmodifiableCollection(nestingModels) : Collections.EMPTY_SET;
-	}
-
-	public IDataModel removeNestedModel(String modelName) {
-		if (!isNestedModel(modelName)) {
-			return null;
-		}
-		DataModelImpl model = (DataModelImpl) nestedModels.remove(modelName);
-		model.nestingModels.remove(this);
-		removeNestedProperties(model.allPropertyNames);
-		model.removeListener(this);
-		if (nestedModels.isEmpty()) {
-			nestedModels = null;
-		}
-		return model;
-	}
-
-	private void removeNestedProperties(Collection nestedProperties) {
-		Iterator iterator = nestedProperties.iterator();
-		String property = null;
-		boolean keepProperty = false;
-		Set nestedPropertiesToRemove = null;
-		while (iterator.hasNext()) {
-			keepProperty = false;
-			property = (String) iterator.next();
-			if (basePropertyNames.contains(property)) {
-				keepProperty = true;
-			}
-			if (!keepProperty && nestedModels != null) {
-				Iterator nestedModelsIterator = nestedModels.values().iterator();
-				while (!keepProperty && nestedModelsIterator.hasNext()) {
-					DataModelImpl nestedModel = (DataModelImpl) nestedModelsIterator.next();
-					if (nestedModel.isProperty(property)) {
-						keepProperty = true;
-					}
-				}
-			}
-			if (!keepProperty) {
-				if (null == nestedPropertiesToRemove) {
-					nestedPropertiesToRemove = new HashSet();
-				}
-				nestedPropertiesToRemove.add(property);
-			}
-		}
-
-		if (null != nestedPropertiesToRemove) {
-			allPropertyNames.removeAll(nestedPropertiesToRemove);
-			nestedPropertyNames.removeAll(nestedPropertiesToRemove);
-			if (nestingModels != null) {
-				Iterator nestingModelsIterator = nestingModels.iterator();
-				while (nestingModelsIterator.hasNext()) {
-					((DataModelImpl) nestingModelsIterator.next()).removeNestedProperties(nestedPropertiesToRemove);
-				}
-			}
-		}
-	}
-
-	public boolean isNestedModel(String modelName) {
-		return modelName != null && null != nestedModels && nestedModels.containsKey(modelName);
-	}
-
-	public IDataModel getNestedModel(String modelName) {
-		IDataModel dataModel = (null != nestedModels && null != modelName) ? (IDataModel) nestedModels.get(modelName) : null;
-		if (null == dataModel) {
-			throw new RuntimeException(NESTED_MODEL_NOT_LOCATED + modelName);
-		}
-		return dataModel;
-	}
-
-	public DataModelPropertyDescriptor[] getValidPropertyDescriptors(String propertyName) {
-		DataModelImpl dataModel = getOwningDataModel(propertyName);
-		DataModelPropertyDescriptor[] descriptors = dataModel.provider.getValidPropertyDescriptors(propertyName);
-		return descriptors == null ? NO_DESCRIPTORS : descriptors;
-	}
-
-	public DataModelPropertyDescriptor getPropertyDescriptor(String propertyName) {
-		DataModelImpl dataModel = getOwningDataModel(propertyName);
-		DataModelPropertyDescriptor descriptor = dataModel.provider.getPropertyDescriptor(propertyName);
-		return descriptor == null ? new DataModelPropertyDescriptor(getProperty(propertyName)) : descriptor;
-	}
-
-	public void notifyPropertyChange(String propertyName, int flag) {
-		if (flag == DEFAULT_CHG) {
-			if (isPropertySet(propertyName)) {
-				return;
-			}
-			flag = VALUE_CHG;
-		}
-		notifyListeners(new DataModelEvent(this, propertyName, flag));
-	}
-
-	private void notifyListeners(DataModelEvent event) {
-		if (listeners != null && !listeners.isEmpty()) {
-			IDataModelListener listener;
-			for (int i = 0; i < listeners.size(); i++) {
-				listener = (IDataModelListener) listeners.get(i);
-				if (listener != event.getDataModel()) {
-					listener.propertyChanged(event);
-				}
-			}
-		}
-	}
-
-	public void propertyChanged(DataModelEvent event) {
-		notifyListeners(event);
-	}
-
-	public IStatus validate() {
-		return validate(true);
-	}
-
-	public IStatus validate(boolean stopOnFirstFailure) {
-		IStatus status = null;
-		IStatus propStatus;
-		String propName;
-		Iterator it;
-		for (int i = 0; i < 2; i++) {
-			switch (i) {
-				case 0 :
-					it = basePropertyNames.iterator();
-					break;
-				case 1 :
-				default :
-					it = getNestedModelNames().iterator();
-			}
-			while (it.hasNext()) {
-				propName = (String) it.next();
-				propStatus = provider.validate(propName);
-				if (propStatus != null) {
-					if (status == null || status.isOK())
-						status = propStatus;
-					else {
-						if (status.isMultiStatus())
-							((MultiStatus) status).merge(propStatus);
-						else {
-							MultiStatus multi = new MultiStatus("org.eclipse.wst.common.frameworks.internal", 0, "", null); //$NON-NLS-1$ //$NON-NLS-2$
-							multi.merge(status);
-							multi.merge(propStatus);
-							status = multi;
-						}
-					}
-					if (stopOnFirstFailure && status != null && !status.isOK() && status.getSeverity() == IStatus.ERROR)
-						return status;
-				}
-			}
-		}
-
-		if (status == null)
-			return IDataModelProvider.OK_STATUS;
-		return status;
-	}
-
-	public void addListener(IDataModelListener listener) {
-		if (listener != null) {
-			if (listeners == null) {
-				listeners = new ArrayList();
-				listeners.add(listener);
-			} else if (!listeners.contains(listener))
-				listeners.add(listener);
-		}
-	}
-
-	public void removeListener(IDataModelListener listener) {
-		if (listeners != null && listener != null)
-			listeners.remove(listener);
-	}
-
-	/**
-	 * Return true if the model doesn't have any errors.
-	 * 
-	 * @return boolean
-	 */
-	public boolean isValid() {
-		return validate(true).getSeverity() != IStatus.ERROR;
-	}
-
-	public boolean isPropertyValid(String propertyName) {
-		return validateProperty(propertyName).getSeverity() != IStatus.ERROR;
-	}
-
-	public IStatus validateProperty(String propertyName) {
-		DataModelImpl dataModel = getOwningDataModel(propertyName);
-		IStatus status = dataModel.provider.validate(propertyName);
-		return status == null ? IDataModelProvider.OK_STATUS : status;
-	}
-
-	public List getExtendedContext() {
-		List extendedContext = provider.getExtendedContext();
-		return extendedContext == null ? Collections.EMPTY_LIST : extendedContext;
-	}
-
-	public void dispose() {
-		provider.dispose();
-	}
-
-	public IDataModelOperation getDefaultOperation() {
-		IDataModelOperation providerOp = provider.getDefaultOperation();
-		if (null == providerOp) {
-			providerOp = new AbstractDataModelOperation(this) {
-				public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-					return OK_STATUS;
-				}
-			};
-		}
-		return new ExtendableOperationImpl(providerOp);
-	}
-
-	public String toString() {
-		return "IDataModel, provider=" + provider.toString(); //$NON-NLS-1$
-	}
-
-	public String getID() {
-		String id = provider.getID();
-		return null != id ? id : ""; //$NON-NLS-1$
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/datamodel/ExtendableOperationImpl.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/datamodel/ExtendableOperationImpl.java
deleted file mode 100644
index 38391aa..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/datamodel/ExtendableOperationImpl.java
+++ /dev/null
@@ -1,333 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.datamodel;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Set;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.IUndoContext;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-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.core.runtime.SubProgressMonitor;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.environment.IEnvironment;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelProperties;
-import org.eclipse.wst.common.frameworks.internal.AdaptabilityUtility;
-import org.eclipse.wst.common.frameworks.internal.WTPResourceHandler;
-import org.eclipse.wst.common.frameworks.internal.enablement.IEnablementManager;
-import org.eclipse.wst.common.frameworks.internal.operations.ComposedExtendedOperationHolder;
-import org.eclipse.wst.common.frameworks.internal.operations.OperationStatus;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
-
-public final class ExtendableOperationImpl implements IDataModelOperation {
-
-	private IDataModelOperation rootOperation;
-	private List appendedOperations;
-	private IEnvironment environment;
-
-	private OperationStatus opStatus;
-
-	private static Hashtable threadToExtendedOpControl;
-
-	private class ExtendedOpControl {
-		private boolean allowExtensions;
-		List restrictedExtensions;
-
-		public ExtendedOpControl(boolean allowExtensions, List restrictedExtensions) {
-			this.allowExtensions = allowExtensions;
-			this.restrictedExtensions = restrictedExtensions;
-		}
-
-		public boolean shouldExecute(String operationID) {
-			return allowExtensions && !restrictedExtensions.contains(operationID);
-		}
-	}
-
-	public ExtendableOperationImpl(IDataModelOperation rootOperation) {
-		this.rootOperation = rootOperation;
-		if (null == rootOperation) {
-			throw new NullPointerException();
-		}
-	}
-
-	public IStatus redo(IProgressMonitor monitor, IAdaptable info) {
-		return null;
-	}
-
-	public Set getDataModelIDs() {
-		return new HashSet();
-	}
-
-	/**
-	 * @return
-	 */
-	public ISchedulingRule getSchedulingRule() {
-		return rootOperation.getSchedulingRule();
-	}
-
-	public IStatus undo(IProgressMonitor monitor, IAdaptable info) {
-		return null;
-	}
-
-	public final void addStatus(IStatus aStatus) {
-		if (opStatus == null) {
-			opStatus = new OperationStatus(aStatus.getMessage(), aStatus.getException());
-			opStatus.setSeverity(aStatus.getSeverity());
-			opStatus.add(aStatus);
-		} else {
-			opStatus.add(aStatus);
-		}
-	}
-
-	private void addExtendedStatus(IStatus aStatus) {
-		if (opStatus == null) {
-			opStatus = new OperationStatus(new IStatus[]{WTPCommonPlugin.OK_STATUS});
-		}
-		opStatus.addExtendedStatus(aStatus);
-	}
-
-	public void appendOperation(IDataModelOperation appendedOperation) {
-		if (appendedOperations == null) {
-			appendedOperations = new ArrayList(3);
-		}
-		appendedOperations.add(appendedOperation);
-	}
-
-	/**
-	 * Initiates a batch of changes, by invoking the execute() method as a workspace runnable.
-	 * 
-	 * @param monitor
-	 *            the progress monitor to use to display progress
-	 * @exception InvocationTargetException
-	 *                wraps any CoreException, runtime exception or error thrown by the execute()
-	 *                method
-	 * @see WorkspaceModifyOperation - this class was directly copied from it
-	 */
-	public IStatus execute(IProgressMonitor monitor, IAdaptable info) {
-		// final InvocationTargetException[] iteHolder = new InvocationTargetException[1];
-		IWorkspaceRunnableWithStatus workspaceRunnable = new IWorkspaceRunnableWithStatus(info) {
-			public void run(IProgressMonitor pm) throws CoreException {
-				setStatus(doExecute(pm, getInfo()));
-			}
-		};
-		ISchedulingRule rule = getSchedulingRule();
-		try {
-			if (rule == null)
-				ResourcesPlugin.getWorkspace().run(workspaceRunnable, monitor);
-			else
-				ResourcesPlugin.getWorkspace().run(workspaceRunnable, rule, getOperationExecutionFlags(), monitor);
-		} catch (CoreException e) {
-			Logger.getLogger().logError(e);
-		}
-		return workspaceRunnable.getStatus();
-	}
-
-	public IStatus doExecute(IProgressMonitor monitor, IAdaptable info) {
-		if (null == threadToExtendedOpControl) {
-			threadToExtendedOpControl = new Hashtable();
-		}
-		final Thread currentThread = Thread.currentThread();
-		final boolean isTopLevelOperation = !threadToExtendedOpControl.containsKey(currentThread);
-		try {
-			if (isTopLevelOperation) {
-				boolean allowExtensions = getDataModel() == null ? true : getDataModel().getBooleanProperty(IDataModelProperties.ALLOW_EXTENSIONS);
-				List restrictedExtensions = getDataModel() == null ? Collections.EMPTY_LIST : (List) getDataModel().getProperty(IDataModelProperties.RESTRICT_EXTENSIONS);
-				ExtendedOpControl extendedOpControl = new ExtendedOpControl(allowExtensions, restrictedExtensions);
-				threadToExtendedOpControl.put(currentThread, extendedOpControl);
-			}
-
-			ComposedExtendedOperationHolder extOpHolder = ComposedExtendedOperationHolder.createExtendedOperationHolder(rootOperation.getID());
-			IStatus preOpStatus = runPreOps(monitor, extOpHolder, info);
-			try {
-				addStatus(rootOperation.execute(monitor, info));
-			} catch (ExecutionException e1) {
-				addStatus(new Status(IStatus.ERROR, "org.eclipse.wst.common.frameworks.internal", 0, e1.getMessage(), e1)); //$NON-NLS-1$
-			}
-
-			IStatus postOpStatus = runPostOps(monitor, extOpHolder, info);
-			if (null != preOpStatus) {
-				addExtendedStatus(preOpStatus);
-			}
-			if (null != postOpStatus) {
-				addExtendedStatus(postOpStatus);
-			}
-			if (appendedOperations != null) {
-				OperationStatus composedStatus = null;
-				for (int i = 0; i < appendedOperations.size(); i++) {
-					try {
-						ExtendableOperationImpl op = new ExtendableOperationImpl((IDataModelOperation) appendedOperations.get(i));
-						IStatus status = op.execute(new SubProgressMonitor(monitor, 1, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK), info);
-						if (composedStatus == null)
-							composedStatus = new OperationStatus(new IStatus[]{status});
-						else
-							composedStatus.add(status);
-					} catch (Exception e) {
-						Logger.getLogger().logError(e);
-					}
-				}
-				if (null != composedStatus) {
-					addStatus(composedStatus);
-				}
-			}
-		} finally {
-			if (isTopLevelOperation) {
-				threadToExtendedOpControl.remove(currentThread);
-			}
-		}
-
-		return opStatus;
-	}
-
-	private IStatus runPreOps(IProgressMonitor pm, ComposedExtendedOperationHolder extOpHolder, IAdaptable info) {
-		IStatus preOpStatus = null;
-		if ((extOpHolder != null) && extOpHolder.hasPreOps()) {
-			preOpStatus = runExtendedOps(extOpHolder.getPreOps(), pm, info);
-		}
-		return preOpStatus;
-	}
-
-	private IStatus runPostOps(IProgressMonitor pm, ComposedExtendedOperationHolder extOpHolder, IAdaptable info) {
-		IStatus postOpStatus = null;
-		if ((extOpHolder != null) && extOpHolder.hasPostOps()) {
-			postOpStatus = runExtendedOps(extOpHolder.getPostOps(), pm, info);
-		}
-
-		return postOpStatus;
-	}
-
-	private IStatus runExtendedOps(List opList, IProgressMonitor pm, IAdaptable info) {
-		IDataModel rootDataModel = rootOperation.getDataModel();
-		IDataModelOperation nestedOp = null;
-		OperationStatus returnStatus = null;
-		IStatus localStatus;
-		String opId = null;
-		ExtendedOpControl opControl = (ExtendedOpControl) threadToExtendedOpControl.get(Thread.currentThread());
-		for (int i = 0; i < opList.size(); i++) {
-			nestedOp = (IDataModelOperation) opList.get(i);
-			opId = nestedOp.getID();
-			if (opControl.shouldExecute(nestedOp.getClass().getName()) && opControl.shouldExecute(opId)) {
-				try {
-					boolean shouldExtendedRun = true;
-
-					List extendedContext = rootDataModel.getExtendedContext();
-					for (int contextCount = 0; shouldExtendedRun && contextCount < extendedContext.size(); contextCount++) {
-						IProject project = (IProject) AdaptabilityUtility.getAdapter(extendedContext.get(contextCount), IProject.class);
-						if (null != project && !IEnablementManager.INSTANCE.getIdentifier(opId, project).isEnabled()) {
-							shouldExtendedRun = false;
-						}
-					}
-					if (shouldExtendedRun) {
-						nestedOp.setDataModel(rootDataModel);
-						ExtendableOperationImpl extendedOp = new ExtendableOperationImpl(nestedOp);
-						localStatus = extendedOp.doExecute(new SubProgressMonitor(pm, IProgressMonitor.UNKNOWN), info);
-					} else
-						localStatus = null;
-				} catch (Exception e) {
-					localStatus = new Status(IStatus.ERROR, WTPCommonPlugin.PLUGIN_ID, 0, WTPResourceHandler.getString("25", new Object[]{nestedOp.getClass().getName()}), e); //$NON-NLS-1$
-				}
-				if (localStatus != null) {
-					if (returnStatus == null) {
-						returnStatus = new OperationStatus(new IStatus[]{localStatus});
-					} else {
-						returnStatus.add(localStatus);
-					}
-				}
-			}
-		}
-		return returnStatus;
-	}
-
-	public void dispose() {
-	}
-
-	public boolean canExecute() {
-		return rootOperation.canExecute();
-	}
-
-	public boolean canRedo() {
-		return rootOperation.canRedo();
-	}
-
-	public boolean canUndo() {
-		return rootOperation.canUndo();
-	}
-
-	public int getOperationExecutionFlags() {
-		return rootOperation.getOperationExecutionFlags();
-	}
-
-	public String getLabel() {
-		return rootOperation.getLabel();
-	}
-
-	public IUndoContext[] getContexts() {
-		return rootOperation.getContexts();
-	}
-
-	public boolean hasContext(IUndoContext context) {
-		return rootOperation.hasContext(context);
-	}
-
-	public void addContext(IUndoContext context) {
-		rootOperation.addContext(context);
-	}
-
-	public void removeContext(IUndoContext context) {
-		rootOperation.removeContext(context);
-	}
-
-	public void setID(String id) {
-		rootOperation.setID(id);
-	}
-
-	public String getID() {
-		return rootOperation.getID();
-	}
-
-	public void setDataModel(IDataModel model) {
-		rootOperation.setDataModel(model);
-	}
-
-	public IDataModel getDataModel() {
-		return rootOperation.getDataModel();
-	}
-
-	public void setEnvironment(IEnvironment env) {
-		environment = env;
-	}
-
-	public IEnvironment getEnvironment() {
-		return environment;
-	}
-
-  public List getPreOperations()
-  {
-    return null;
-  }
-
-  public List getPostOperations()
-  {
-    return null;
-  }
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/datamodel/IWorkspaceRunnableWithStatus.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/datamodel/IWorkspaceRunnableWithStatus.java
deleted file mode 100644
index 2214bd0..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/datamodel/IWorkspaceRunnableWithStatus.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.datamodel;
-
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-
-public class IWorkspaceRunnableWithStatus implements IWorkspaceRunnable {
-	private IAdaptable info;
-	private IStatus status;
-
-public IWorkspaceRunnableWithStatus(IAdaptable info) {
-		super();
-		this.info = info;
-	}
-public IAdaptable getInfo() {
-	// TODO Auto-generated method stub
-	return info;
-}
-public void setStatus(IStatus aStatus) {
-	status = aStatus;
-}
-
-public void run(IProgressMonitor monitor) throws CoreException {
-		
-	}
-public IStatus getStatus() {
-	return status;
-}
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/AbstractIdentifiable.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/AbstractIdentifiable.java
deleted file mode 100644
index f7d143e..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/AbstractIdentifiable.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.enablement;
-
-public class AbstractIdentifiable implements Identifiable {
-
-	protected String id;
-
-	public AbstractIdentifiable(String id) {
-		this.id = id;
-	}
-
-	public String getID() {
-		return id;
-	}
-
-	public int getLoadOrder() {
-		return 0;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/AscendingGroupComparator.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/AscendingGroupComparator.java
deleted file mode 100644
index 39afa0c..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/AscendingGroupComparator.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Dec 2, 2003
- *
- * To change the template for this generated file go to
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal.enablement;
-
-import java.util.Comparator;
-
-/**
- * @author blancett
- * 
- * To change the template for this generated type comment go to Window>Preferences>Java>Code
- * Generation>Code and Comments
- */
-public class AscendingGroupComparator implements Comparator {
-	private static AscendingGroupComparator singleton;
-
-	public int compare(Object o1, Object o2) {
-		if (o2 == null && o1 != null)
-			return -1;
-		if (o1 == null && o2 != null)
-			return 1;
-		if (o1 == null && o2 == null)
-			return 0;
-
-		FunctionGroup group1 = (FunctionGroup) o1;
-		FunctionGroup group2 = (FunctionGroup) o2;
-
-		if (group1.getPriority() > group2.getPriority())
-			return 1;
-		if (group1.getPriority() == group2.getPriority())
-			return 0;
-		if (group1.getPriority() < group2.getPriority())
-			return -1;
-		return 0;
-	}
-
-	public static Comparator singleton() {
-		if (singleton == null)
-			singleton = new AscendingGroupComparator();
-		return singleton;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/DataModelEnablementFactory.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/DataModelEnablementFactory.java
deleted file mode 100644
index 9de1253..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/DataModelEnablementFactory.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.enablement;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-
-public class DataModelEnablementFactory {
-	/**
-	 * Looks up the appropriate IDataModelProvider by the specified providerKind String and a
-	 * context of the containing Project. The method gets an array of DataModelProviderDescriptor
-	 * from the base DataModelFactory then filters out Providers based on function group enablement.
-	 * Finally the Provider with the highest priority is returned. If the IDataModelProvider is not
-	 * found then a RuntimeException is logged and null is returned.
-	 * 
-	 * @param providerKind
-	 *            the String id of the provider kind
-	 * @param curProject
-	 *            the containing IProject
-	 * 
-	 * @return a new IDataModel
-	 */
-	public static IDataModel createDataModel(String providerKind, IProject curProject) {
-		String[] providerIDs = DataModelFactory.getDataModelProviderIDsForKind(providerKind);
-		if (providerIDs == null || providerIDs.length == 0)
-			return null;
-		String topProvider = getHighestPriorityEnabledProviderDesc(providerIDs, curProject);
-		if (topProvider == null)
-			return null;
-		return DataModelFactory.createDataModel(topProvider);
-	}
-
-	private static String getHighestPriorityEnabledProviderDesc(String[] providerIDs, IProject curProject) {
-		String defaultID = providerIDs[0];
-		IEnablementIdentifier enablementIdentifier;
-		Identifiable tempIdentifiable;
-		Identifiable topPriorityIdentifiable = null;
-
-		for (int i = 1; i < providerIDs.length; i++) {
-			tempIdentifiable = new AbstractIdentifiable(providerIDs[i]);
-			enablementIdentifier = EnablementManager.INSTANCE.getIdentifier(tempIdentifiable.getID(), curProject);
-			if (enablementIdentifier.isEnabled()) {
-				if (topPriorityIdentifiable == null)
-					topPriorityIdentifiable = tempIdentifiable;
-				else if (IdentifiableComparator.instance.compare(tempIdentifiable, topPriorityIdentifiable) == IdentifiableComparator.GREATER_THAN)
-					topPriorityIdentifiable = tempIdentifiable;
-			}
-		}
-		if (topPriorityIdentifiable == null)
-			return defaultID;
-		return topPriorityIdentifiable.getID();
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/DescendingGroupComparator.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/DescendingGroupComparator.java
deleted file mode 100644
index 0720856..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/DescendingGroupComparator.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Dec 2, 2003
- *
- * To change the template for this generated file go to
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal.enablement;
-
-import java.util.Comparator;
-
-/**
- * @author blancett
- * 
- * To change the template for this generated type comment go to Window>Preferences>Java>Code
- * Generation>Code and Comments
- */
-public class DescendingGroupComparator implements Comparator {
-
-	private static DescendingGroupComparator singleton;
-
-	public int compare(Object o1, Object o2) {
-		if (o1 == null && o2 != null)
-			return -1;
-		if (o2 == null && o1 != null)
-			return 1;
-		if (o1 == null && o2 == null)
-			return 0;
-
-		FunctionGroup group1 = (FunctionGroup) o1;
-		FunctionGroup group2 = (FunctionGroup) o2;
-
-		if (group1.getPriority() > group2.getPriority())
-			return -1;
-		if (group1.getPriority() == group2.getPriority())
-			return 0;
-		if (group1.getPriority() < group2.getPriority())
-			return 1;
-		return 0;
-
-	}
-
-	public static Comparator singleton() {
-		if (singleton == null)
-			singleton = new DescendingGroupComparator();
-		return singleton;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/EnablementIdentifier.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/EnablementIdentifier.java
deleted file mode 100644
index a6dbbd9..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/EnablementIdentifier.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Feb 10, 2004
- * 
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal.enablement;
-
-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;
-
-
-/**
- * @author schacher
- * 
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public class EnablementIdentifier implements IEnablementIdentifier {
-
-	private final static int HASH_FACTOR = 89;
-
-	private final static int HASH_INITIAL = EnablementIdentifier.class.getName().hashCode();
-
-	private final static Set strongReferences = new HashSet();
-
-	private Set functionGroupIds;
-
-	private transient String[] functionGroupIdsAsArray;
-
-	private boolean enabled;
-
-	private transient int hashCode;
-
-	private transient boolean hashCodeComputed;
-
-	private String id;
-
-	private List identifierListeners;
-
-	private transient String string;
-
-	private IProject project;
-
-	protected EnablementIdentifier(String id) {
-		this(id, null);
-	}
-
-	protected EnablementIdentifier(String id, IProject project) {
-		if (id == null)
-			throw new NullPointerException();
-		this.id = id;
-		this.project = project;
-	}
-
-	public void addIdentifierListener(IEnablementIdentifierListener identifierListener) {
-		if (identifierListener == null)
-			throw new NullPointerException();
-
-		if (identifierListeners == null)
-			identifierListeners = new ArrayList();
-
-		if (!identifierListeners.contains(identifierListener))
-			identifierListeners.add(identifierListener);
-
-		strongReferences.add(this);
-	}
-
-	public int compareTo(Object object) {
-		EnablementIdentifier castedObject = (EnablementIdentifier) object;
-		return Util.compare(id, castedObject.id);
-
-	}
-
-	public boolean equals(Object object) {
-		if (!(object instanceof EnablementIdentifier))
-			return false;
-
-		EnablementIdentifier castedObject = (EnablementIdentifier) object;
-		boolean equals = Util.equals(id, castedObject.id);
-		return equals;
-	}
-
-	protected void fireIdentifierChanged(EnablementIdentifierEvent functionIdentifierEvent) {
-		if (functionIdentifierEvent == null)
-			throw new NullPointerException();
-
-		if (identifierListeners != null) {
-			synchronized (identifierListeners) {
-				for (int i = 0; i < identifierListeners.size(); i++)
-					((IEnablementIdentifierListener) identifierListeners.get(i)).identifierChanged(functionIdentifierEvent);
-			}
-		}
-	}
-
-	public Set getFunctionGroupIds() {
-		return functionGroupIds;
-	}
-
-	public String getId() {
-		return id;
-	}
-
-	public int hashCode() {
-		if (!hashCodeComputed) {
-			hashCode = HASH_INITIAL;
-			hashCode = hashCode * HASH_FACTOR + Util.hashCode(id);
-			hashCodeComputed = true;
-		}
-
-		return hashCode;
-	}
-
-	public boolean isEnabled() {
-		return enabled;
-	}
-
-	public void removeIdentifierListener(IEnablementIdentifierListener identifierListener) {
-		if (identifierListener == null)
-			throw new NullPointerException();
-
-		if (identifierListeners != null)
-			identifierListeners.remove(identifierListener);
-
-		if (identifierListeners.isEmpty())
-			strongReferences.remove(this);
-	}
-
-	protected boolean setFunctionGroupIds(Set functionGroupIds) {
-		functionGroupIds = Util.safeCopy(functionGroupIds, String.class);
-
-		if (!Util.equals(functionGroupIds, this.functionGroupIds)) {
-			this.functionGroupIds = functionGroupIds;
-			this.functionGroupIdsAsArray = (String[]) this.functionGroupIds.toArray(new String[this.functionGroupIds.size()]);
-
-			hashCodeComputed = false;
-			hashCode = 0;
-			string = null;
-			return true;
-		}
-
-		return false;
-	}
-
-	protected boolean setEnabled(boolean enabled) {
-		if (enabled != this.enabled) {
-			this.enabled = enabled;
-			hashCodeComputed = false;
-			hashCode = 0;
-			string = null;
-			return true;
-		}
-
-		return false;
-	}
-
-	/**
-	 * Recompute the enabled state and return whether the state changed
-	 */
-	protected boolean resetEnabled() {
-		return setEnabled(getNewEnabled());
-	}
-
-	protected boolean getNewEnabled() {
-		if (project == null)
-			return true;
-		if (functionGroupIdsAsArray.length == 0)
-			return true;
-		for (int i = 0; i < functionGroupIdsAsArray.length; i++) {
-			FunctionGroup group = FunctionGroupRegistry.getInstance().getGroupByID(functionGroupIdsAsArray[i]);
-			if (group != null && group.isEnabled(project))
-				return true;
-		}
-		return false;
-	}
-
-	public String toString() {
-		if (string == null) {
-			final StringBuffer stringBuffer = new StringBuffer();
-			stringBuffer.append('[');
-			stringBuffer.append(functionGroupIds);
-			stringBuffer.append(',');
-			stringBuffer.append(enabled);
-			stringBuffer.append(',');
-			stringBuffer.append(id);
-			stringBuffer.append(']');
-			string = stringBuffer.toString();
-		}
-
-		return string;
-	}
-
-	/**
-	 * The associated Project may be null
-	 * 
-	 * @return Returns the project.
-	 */
-	public IProject getProject() {
-		return project;
-	}
-
-	public String getPrimaryFunctionGroupId() {
-		int selectedPriority = Integer.MAX_VALUE;
-		int priority = 0;
-		String selectedFunctionGroupId = null;
-		String functionGroupId = null;
-		for (Iterator iterator = getFunctionGroupIds().iterator(); iterator.hasNext();) {
-			functionGroupId = iterator.next().toString();
-			priority = FunctionGroupRegistry.getInstance().getGroupPriority(functionGroupId);
-			if (priority < selectedPriority)
-				selectedFunctionGroupId = functionGroupId;
-			if (priority == 0)
-				return selectedFunctionGroupId;
-		}
-		return selectedFunctionGroupId;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/EnablementIdentifierEvent.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/EnablementIdentifierEvent.java
deleted file mode 100644
index d90b19c..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/EnablementIdentifierEvent.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Feb 10, 2004
- * 
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal.enablement;
-
-
-
-/**
- * @author schacher
- * 
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public class EnablementIdentifierEvent {
-
-	private boolean functionGroupIdsChanged;
-	private boolean enabledChanged;
-	private IEnablementIdentifier identifier;
-
-	public EnablementIdentifierEvent(IEnablementIdentifier identifier, boolean functionGroupIdsChanged, boolean enabledChanged) {
-		if (identifier == null)
-			throw new NullPointerException();
-
-		this.identifier = identifier;
-		this.functionGroupIdsChanged = functionGroupIdsChanged;
-		this.enabledChanged = enabledChanged;
-	}
-
-	/**
-	 * Returns the instance of the interface that changed.
-	 * 
-	 * @return the instance of the interface that changed. Guaranteed not to be <code>null</code>.
-	 */
-	public IEnablementIdentifier getIdentifier() {
-		return identifier;
-	}
-
-	/**
-	 * Returns whether or not the functionGroupIds property changed.
-	 * 
-	 * @return true, iff the functionGroupIds property changed.
-	 */
-	public boolean hasFunctionGroupIdsChanged() {
-		return functionGroupIdsChanged;
-	}
-
-	/**
-	 * Returns whether or not the enabled property changed.
-	 * 
-	 * @return true, iff the enabled property changed.
-	 */
-	public boolean hasEnabledChanged() {
-		return enabledChanged;
-	}
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return "EnablementIdentifierEvent [identifier=" + identifier.toString() + ", functionGroupIdsChanged=" + hasFunctionGroupIdsChanged() + ", enabledChanged=" + hasEnabledChanged() + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/EnablementManager.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/EnablementManager.java
deleted file mode 100644
index 5494844..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/EnablementManager.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Feb 3, 2004
- * 
- * To change the template for this generated file go to Window - Preferences -
- * Java - Code Generation - Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal.enablement;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.WeakHashMap;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonMessages;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
-
-/**
- * @author mdelder
- */
-public class EnablementManager implements IEnablementManager {
-
-	public static final IEnablementManager INSTANCE = new EnablementManager();
-
-	private static Map identifiersByProject = new WeakHashMap();
-
-	public EnablementManager() {
-	}
-
-	/**
-	 * Returns a Map in which the keys are ids and the values are the identifiers
-	 * 
-	 * @param project
-	 * @return
-	 */
-	protected Map getIdentifiersById(IProject project) {
-		Map aMap = (Map) identifiersByProject.get(project);
-		if (aMap == null) {
-			aMap = new WeakHashMap();
-			identifiersByProject.put(project, aMap);
-		}
-		return aMap;
-	}
-
-    public IEnablementIdentifier getIdentifier(String identifierId, IProject project) {
-        if (identifierId == null) throw new NullPointerException();
-        if (project != null && !project.isAccessible()) project = null;
-        
-        EnablementIdentifier identifier = null;
-        synchronized(this) {
-	        Map identifiersById = getIdentifiersById(project);	
-	        
-	        identifier = (EnablementIdentifier) identifiersById.get(identifierId);
-	
-	        if (identifier == null) {
-	            identifier = createIdentifier(identifierId, project);
-	            updateIdentifier(identifier);
-	            identifiersById.put(identifierId, identifier);
-	        }
-        }
-
-        return identifier;
-    }
-
-	protected EnablementIdentifier createIdentifier(String identifierId, IProject project) {
-		return new EnablementIdentifier(identifierId, project);
-	}
-
-	private EnablementIdentifierEvent updateIdentifier(EnablementIdentifier identifier) {
-		String id = identifier.getId();
-		Set functionGroupIds = new HashSet();
-
-		List groups = FunctionGroupRegistry.getInstance().getKnownGroups();
-		for (Iterator iterator = groups.iterator(); iterator.hasNext();) {
-			FunctionGroup group = (FunctionGroup) iterator.next();
-
-			if (group == null)
-				throw new IllegalStateException();
-			if (group.isMatch(id))
-				functionGroupIds.add(group.getGroupID());
-		}
-
-		boolean functionGroupsChanged = identifier.setFunctionGroupIds(functionGroupIds);
-		boolean enabledChanged = identifier.resetEnabled();
-
-		if (functionGroupsChanged || enabledChanged)
-			return new EnablementIdentifierEvent(identifier, functionGroupsChanged, enabledChanged);
-		return null;
-	}
-
-	/**
-	 * Notify all identifier listeners that the state of a project has changed that affects the
-	 * enablement of a group for a project. This method is fail safe, in that if one listener throws
-	 * an exception while being notified, it will not stop the notification of other listeners.
-	 * 
-	 * @param evt
-	 * @throws CoreException
-	 *             if exceptions were caught notifying any of the listeners. Check the status of the
-	 *             core exception for the nested exceptions.
-	 */
-	public final void notifyFunctionGroupChanged(String groupID, IProject project) throws CoreException {
-
-		Map identifiers = getIdentifiersById(project);
-
-		if (identifiers == null)
-			return;
-
-		EnablementIdentifier identifier = null;
-		Iterator iter = identifiers.values().iterator();
-		IStatus errorStatus = null;
-		IStatus nextStatus = null;
-
-		while (iter.hasNext()) {
-			identifier = (EnablementIdentifier) iter.next();
-
-			EnablementIdentifierEvent evt = updateIdentifier(identifier);
-			try {
-				if (evt != null)
-					identifier.fireIdentifierChanged(evt);
-			} catch (Exception ex) {
-				//Defer the exception so others can handle it.
-				nextStatus = WTPCommonPlugin.createErrorStatus(WTPCommonMessages.INTERNAL_ERROR, ex);
-				Logger.getLogger().logError(ex);
-				if (errorStatus == null)
-					errorStatus = nextStatus;
-				else if (errorStatus.isMultiStatus())
-					((MultiStatus) errorStatus).add(nextStatus);
-				else {
-					IStatus[] children = {errorStatus, nextStatus};
-					errorStatus = new MultiStatus(errorStatus.getPlugin(), errorStatus.getCode(), children, WTPCommonMessages.INTERNAL_ERROR, null);
-				}
-			}
-
-		}
-		if (errorStatus != null)
-			throw new CoreException(errorStatus);
-
-	}
-
-	/**
-	 * Utility method for clients to dispose of listeners
-	 * 
-	 * @param enablementIdentifiers
-	 * @param listener
-	 */
-	public void removeEnablementIdentifierListener(Collection enablementIdentifiers, IEnablementIdentifierListener listener) {
-		Iterator iter = enablementIdentifiers.iterator();
-		while (iter.hasNext()) {
-			IEnablementIdentifier identifier = (IEnablementIdentifier) iter.next();
-			identifier.removeIdentifierListener(listener);
-		}
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/FunctionGroup.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/FunctionGroup.java
deleted file mode 100644
index e2fd938..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/FunctionGroup.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.enablement;
-
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.frameworks.internal.WTPResourceHandler;
-
-
-/**
- * @author mdelder/blancett
- */
-public class FunctionGroup implements Comparable {
-
-	public static final String GROUP_NAME_ATTR = "name"; //$NON-NLS-1$
-	public static final String GROUP_DESC_ATTR = "description"; //$NON-NLS-1$
-	public static final String GROUP_ENABLED_BY_DEFAULT_ATTR = "enabledByDefault"; //$NON-NLS-1$
-	public static final String GROUP_PRIORITY_ATTR = "priority"; //$NON-NLS-1$
-	public static final String GROUP_INTIALIZER_CLASS_ATTR = "initializerClassName"; //$NON-NLS-1$
-	private static final int NEGATIVE_PRIORITY = -1;
-
-	private String groupID;
-	private String name;
-	private String description;
-	private String intializerClassName;
-	private String declaringExtension;
-	private int priority = NEGATIVE_PRIORITY;
-	private IConfigurationElement element;
-	private IGroupInitializer groupInterface;
-	private Set functionGroupPatternBindings;
-//	private transient FunctionGroupPatternBinding[] functionGroupPatternBindingsAsArray;
-	private boolean errorReported = false;
-
-	public FunctionGroup(String groupID, IConfigurationElement element) {
-		this.groupID = groupID;
-		this.element = element;
-	}
-
-	public String getDescription() {
-		if (description == null)
-			description = element.getAttribute(GROUP_DESC_ATTR);
-		return description;
-	}
-
-	String getInitalizerClassName() {
-		if (intializerClassName == null)
-			intializerClassName = element.getAttribute(GROUP_INTIALIZER_CLASS_ATTR);
-		return intializerClassName;
-	}
-
-	public String getName() {
-		if (name == null)
-			name = element.getAttribute(GROUP_NAME_ATTR);
-		return name;
-	}
-
-	private String getDeclaringExtensionName() {
-		if (declaringExtension == null) {
-			if (element.getDeclaringExtension() == null)
-				return ""; //$NON-NLS-1$
-			declaringExtension = element.getDeclaringExtension().toString();
-		}
-		return declaringExtension;
-	}
-
-	public String getGroupID() {
-		return groupID;
-	}
-
-	IGroupInitializer getInitializerClass() {
-		if (groupInterface == null)
-			try {
-				groupInterface = (IGroupInitializer) element.createExecutableExtension(GROUP_INTIALIZER_CLASS_ATTR);
-			} catch (CoreException e) {
-				Logger.getLogger().logError(WTPResourceHandler.getString("29", new Object[]{GROUP_INTIALIZER_CLASS_ATTR, getInitalizerClassName(), getDeclaringExtensionName()}) + "\r\n"); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-4$
-				Logger.getLogger().logError(e);
-			}
-		return groupInterface;
-	}
-
-	public String toString() {
-		return "\"" + getName() + "\" (" + getGroupID() + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-	}
-
-	public int getPriority() {
-		if (priority == NEGATIVE_PRIORITY)
-			priority = Integer.parseInt(element.getAttribute(GROUP_PRIORITY_ATTR));
-		return priority;
-	}
-
-	public boolean isEnabled(IProject project) {
-		if (getInitializerClass() != null)
-			return getInitializerClass().isGroupEnabled(project);
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Comparable#compareTo(java.lang.Object)
-	 */
-	public int compareTo(Object o) {
-		if (this.equals(o))
-			return 0;
-		else if (!(o instanceof FunctionGroup))
-			return 1;
-
-		FunctionGroup group = (FunctionGroup) o;
-		if (getPriority() == group.getPriority())
-			return getGroupID().compareTo(group.getGroupID());
-
-		else if (getPriority() < group.getPriority())
-			return -1;
-		else
-			return 1;
-	}
-
-	public boolean isMatch(String string) {
-		if (functionGroupPatternBindings == null) {
-			if (!errorReported) {
-				Logger.getLogger().logError(WTPResourceHandler.getString("30", new Object[]{getGroupID()})); //$NON-NLS-1$
-				errorReported = true;
-			}
-			return false;
-		}
-		for (Iterator iterator = functionGroupPatternBindings.iterator(); iterator.hasNext();) {
-			FunctionGroupPatternBinding functionGroupPatternBinding = (FunctionGroupPatternBinding) iterator.next();
-
-			if (functionGroupPatternBinding.getPattern().matcher(string).matches())
-				return true;
-		}
-
-		return false;
-	}
-
-	boolean setFunctionGroupPatternBindings(Set functionGroupPatternBindings) {
-		functionGroupPatternBindings = Util.safeCopy(functionGroupPatternBindings, FunctionGroupPatternBinding.class);
-
-		if (!Util.equals(functionGroupPatternBindings, this.functionGroupPatternBindings)) {
-			this.functionGroupPatternBindings = functionGroupPatternBindings;
-//			this.functionGroupPatternBindingsAsArray = (FunctionGroupPatternBinding[]) this.functionGroupPatternBindings.toArray(new FunctionGroupPatternBinding[this.functionGroupPatternBindings.size()]);
-
-			return true;
-		}
-
-		return false;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/FunctionGroupPatternBinding.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/FunctionGroupPatternBinding.java
deleted file mode 100644
index d387771..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/FunctionGroupPatternBinding.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Feb 10, 2004
- * 
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal.enablement;
-
-import java.util.regex.Pattern;
-
-
-/**
- * @author schacher
- * 
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public class FunctionGroupPatternBinding {
-
-	private final static int HASH_FACTOR = 89;
-	private final static int HASH_INITIAL = FunctionGroupPatternBinding.class.getName().hashCode();
-	private String functionGroupId;
-	private transient int hashCode;
-	private transient boolean hashCodeComputed;
-	private Pattern pattern;
-	private transient String string;
-
-	/**
-	 *  
-	 */
-	public FunctionGroupPatternBinding(String functionGroupId, Pattern pattern) {
-		if (pattern == null)
-			throw new NullPointerException();
-
-		this.functionGroupId = functionGroupId;
-		this.pattern = pattern;
-	}
-
-	public int compareTo(Object object) {
-		FunctionGroupPatternBinding castedObject = (FunctionGroupPatternBinding) object;
-		int compareTo = Util.compare(functionGroupId, castedObject.functionGroupId);
-
-		if (compareTo == 0)
-			compareTo = Util.compare(pattern.pattern(), castedObject.pattern.pattern());
-
-		return compareTo;
-	}
-
-	public boolean equals(Object object) {
-		if (!(object instanceof FunctionGroupPatternBinding))
-			return false;
-
-		FunctionGroupPatternBinding castedObject = (FunctionGroupPatternBinding) object;
-		boolean equals = true;
-		equals &= Util.equals(functionGroupId, castedObject.functionGroupId);
-		equals &= Util.equals(pattern, castedObject.pattern);
-		return equals;
-	}
-
-	public String getActivityId() {
-		return functionGroupId;
-	}
-
-	public Pattern getPattern() {
-		return pattern;
-	}
-
-	public int hashCode() {
-		if (!hashCodeComputed) {
-			hashCode = HASH_INITIAL;
-			hashCode = hashCode * HASH_FACTOR + Util.hashCode(functionGroupId);
-			hashCode = hashCode * HASH_FACTOR + Util.hashCode(pattern);
-			hashCodeComputed = true;
-		}
-
-		return hashCode;
-	}
-
-	public String toString() {
-		if (string == null) {
-			final StringBuffer stringBuffer = new StringBuffer();
-			stringBuffer.append('[').append(functionGroupId).append(",pattern=\"").append(pattern.pattern()).append("\"]"); //$NON-NLS-1$ //$NON-NLS-2$
-			string = stringBuffer.toString();
-		}
-
-		return string;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/FunctionGroupRegistry.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/FunctionGroupRegistry.java
deleted file mode 100644
index 996c92c..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/FunctionGroupRegistry.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.enablement;
-
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.Map.Entry;
-import java.util.regex.Pattern;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jem.util.RegistryReader;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.frameworks.internal.WTPResourceHandler;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
-
-/**
- * The FunctionGroupRegistry will consume Configuration elements conforming to the FunctionGroup
- * Extension Point schema.
- * 
- * @author mdelder/blancett
- */
-public class FunctionGroupRegistry extends RegistryReader {
-
-	private static FunctionGroupRegistry INSTANCE = null;
-
-	public static final String GROUP_ELEMENT = "functionGroup"; //$NON-NLS-1$
-	public static final String GROUP_ID_ATTR = "functionGroupID"; //$NON-NLS-1$
-	public static final String FUNCTION_GROUP_PATTERN_BINDING_ELMT = "functionGroupPatternBinding"; //$NON-NLS-1$
-	public static final String PATTERN_ATTR = "pattern"; //$NON-NLS-1$
-
-	private Map groupMapById;
-	private List knownGroups;
-	private Map patternBindingsByGroupId;
-
-	private FunctionGroupRegistry() {
-		super(WTPCommonPlugin.PLUGIN_ID, WTPCommonPlugin.GROUP_REGISTRY_EXTENSION_POINT);
-		patternBindingsByGroupId = new HashMap();
-
-	}
-
-	public static FunctionGroupRegistry getInstance() {
-		if (INSTANCE == null) {
-			INSTANCE = new FunctionGroupRegistry();
-			INSTANCE.readRegistry();
-		}
-		return INSTANCE;
-	}
-
-	/*
-	 * (non-Javadoc) Read all the elements first, then set the pattern bindings on the function
-	 * groups
-	 */
-	public void readRegistry() {
-		super.readRegistry();
-		setPatternBindings();
-	}
-
-	private void setPatternBindings() {
-		Iterator iter = patternBindingsByGroupId.entrySet().iterator();
-		while (iter.hasNext()) {
-			Map.Entry entry = (Entry) iter.next();
-			String groupId = (String) entry.getKey();
-			Set value = (Set) entry.getValue();
-			FunctionGroup aGroup = getGroupByID(groupId);
-			if (aGroup != null)
-				aGroup.setFunctionGroupPatternBindings(value);
-		}
-
-	}
-
-	public boolean readElement(IConfigurationElement element) {
-		if (element.getName().equals(GROUP_ELEMENT)) {
-			readGroup(element);
-			return true;
-		} else if (element.getName().equals(FUNCTION_GROUP_PATTERN_BINDING_ELMT)) {
-			readPatternBinding(element);
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @param element
-	 */
-	private void readPatternBinding(IConfigurationElement element) {
-		String groupID = element.getAttribute(GROUP_ID_ATTR);
-		String pattern = element.getAttribute(PATTERN_ATTR);
-		if (!isNullOrEmpty(groupID) && !isNullOrEmpty(pattern)) {
-			Pattern aPattern = Pattern.compile(pattern);
-			FunctionGroupPatternBinding binding = new FunctionGroupPatternBinding(groupID, aPattern);
-			addPatternBinding(groupID, binding);
-		}
-
-	}
-
-	/**
-	 * @param binding
-	 */
-	private void addPatternBinding(String groupID, FunctionGroupPatternBinding binding) {
-		Set bindings = (Set) patternBindingsByGroupId.get(groupID);
-		if (bindings == null) {
-			bindings = new HashSet();
-			patternBindingsByGroupId.put(groupID, bindings);
-		}
-		bindings.add(binding);
-	}
-
-	private boolean isNullOrEmpty(String aString) {
-		return aString == null || aString.length() == 0;
-	}
-
-	private void readGroup(IConfigurationElement element) {
-		String groupID = element.getAttribute(GROUP_ID_ATTR);
-		if (!isNullOrEmpty(groupID)) {
-			FunctionGroup group = new FunctionGroup(groupID, element);
-			getGroupMapById().put(groupID, group);
-			getKnownGroups().add(group);
-		}
-	}
-
-	private List getAscendingSortedGroups(IProject project) {
-		Comparator ascendingGrpComparator = AscendingGroupComparator.singleton();
-		List groupList = getKnownGroups(project);
-		Collections.sort(groupList, ascendingGrpComparator);
-		return groupList;
-	}
-
-	private List getDescendingSortedGroups(IProject project) {
-		Comparator descendingGrpComparator = DescendingGroupComparator.singleton();
-		List groupList = getKnownGroups(project);
-		Collections.sort(groupList, descendingGrpComparator);
-		return groupList;
-	}
-
-	public List getKnownGroups(IProject project) {
-		ArrayList groupByProjectList = new ArrayList(getKnownGroups().size());
-		List groupList = getKnownGroups();
-		for (int i = 0; i < groupList.size(); i++) {
-			FunctionGroup group = (FunctionGroup) groupList.get(i);
-			if (group.isEnabled(project))
-				groupByProjectList.add(group);
-		}
-		return groupByProjectList;
-	}
-
-	public List getAscendingPriorityGroupNames(IProject project) {
-		List sortedGroup = getAscendingSortedGroups(project);
-		return getGroupListNames(sortedGroup, new ArrayList(sortedGroup.size()));
-
-	}
-
-	public List getDescendingPriorityGroupNames(IProject project) {
-		List sortedGroup = getDescendingSortedGroups(project);
-		return getGroupListNames(sortedGroup, new ArrayList(sortedGroup.size()));
-	}
-
-	private List getGroupListNames(List sortedGroup, List sortedGroupNames) {
-		for (int i = 0; i < sortedGroup.size(); i++) {
-			FunctionGroup grp = (FunctionGroup) sortedGroup.get(i);
-			sortedGroupNames.add(grp.getGroupID());
-		}
-		return sortedGroupNames;
-	}
-
-	public Iterator getGroupIDs() {
-		return getGroupMapById().keySet().iterator();
-	}
-
-	public FunctionGroup getGroupByID(String groupID) {
-		return (FunctionGroup) getGroupMapById().get(groupID);
-	}
-
-	public boolean isGroupEnabled(IProject project, String groupID) {
-		FunctionGroup group = getGroupByID(groupID);
-		if (group != null)
-			return group.isEnabled(project);
-		return false;
-	}
-
-	public List getKnownGroups() {
-		if (knownGroups == null)
-			knownGroups = new ArrayList();
-		return knownGroups;
-	}
-
-	/**
-	 * @return Returns the groupMapById.
-	 */
-	protected Map getGroupMapById() {
-		if (groupMapById == null)
-			groupMapById = new HashMap();
-		return groupMapById;
-	}
-
-	/**
-	 * Check the priority of the two groups referenced by
-	 * 
-	 * @groupID1 and
-	 * @groupID2
-	 * 
-	 * @param groupID1
-	 * @param groupID2
-	 * @return 0 if the two groups are equal, 1 if
-	 * @groupID1 has a higher precedence, otherwise -1
-	 */
-	public int compare(String groupID1, String groupID2) {
-		FunctionGroup group1 = getGroupByID(groupID1);
-		FunctionGroup group2 = getGroupByID(groupID2);
-		if (group1 == null) {
-			Logger.getLogger().logError(new IllegalArgumentException(WTPResourceHandler.getString("28", new Object[]{groupID1}))); //$NON-NLS-1$
-			return -1;
-		}
-		if (group2 == null) {
-			Logger.getLogger().logError(new IllegalArgumentException(WTPResourceHandler.getString("28", new Object[]{groupID2}))); //$NON-NLS-1$
-			return 1;
-		}
-
-		return group1.compareTo(group2);
-	}
-
-	public int getGroupPriority(String grpId) {
-		FunctionGroup group = getGroupByID(grpId);
-		return (group != null) ? group.getPriority() : -1;
-	}
-
-	public int getFunctionPriority(String enablementID) {
-		int priority = Integer.MAX_VALUE;
-		Iterator iter = getKnownGroups().iterator();
-		while (iter.hasNext()) {
-			FunctionGroup group = (FunctionGroup) iter.next();
-			if (group.isMatch(enablementID))
-				priority = Math.min(priority, group.getPriority());
-		}
-		return priority;
-
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/IEnablementIdentifier.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/IEnablementIdentifier.java
deleted file mode 100644
index d73d812..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/IEnablementIdentifier.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Feb 10, 2004
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal.enablement;
-
-import java.util.Set;
-
-/**
- * @author schacher
- * 
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public interface IEnablementIdentifier {
-
-
-	/**
-	 * Registers an instance of <code>IIdentifierListener</code> to listen for changes to
-	 * properties of this instance.
-	 * 
-	 * @param identifierListener
-	 *            the instance to register. Must not be <code>null</code>. If an attempt is made
-	 *            to register an instance which is already registered with this instance, no
-	 *            operation is performed.
-	 */
-	void addIdentifierListener(IEnablementIdentifierListener identifierListener);
-
-	/**
-	 * Returns the set of function group ids that this instance matches.
-	 * <p>
-	 * Notification is sent to all registered listeners if this property changes.
-	 * </p>
-	 * 
-	 * @return the set of activity ids that this instance matches. This set may be empty, but is
-	 *         guaranteed not to be <code>null</code>. If this set is not empty, it is guaranteed
-	 *         to only contain instances of <code>String</code>.
-	 */
-	Set getFunctionGroupIds();
-
-	/**
-	 * Returns the identifier of this instance.
-	 * 
-	 * @return the identifier of this instance. Guaranteed not to be <code>null</code>.
-	 */
-	String getId();
-
-	/**
-	 * Returns whether or not this instance is enabled.
-	 * <p>
-	 * Notification is sent to all registered listeners if this property changes.
-	 * </p>
-	 * 
-	 * @return true, iff this instance is enabled.
-	 */
-	boolean isEnabled();
-
-	/**
-	 * Unregisters an instance of <code>IEnablementIdentifierListener</code> listening for changes
-	 * to properties of this instance.
-	 * 
-	 * @param identifierListener
-	 *            the instance to unregister. Must not be <code>null</code>. If an attempt is
-	 *            made to unregister an instance which is not already registered with this instance,
-	 *            no operation is performed.
-	 */
-	void removeIdentifierListener(IEnablementIdentifierListener identifierListener);
-
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/IEnablementIdentifierListener.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/IEnablementIdentifierListener.java
deleted file mode 100644
index 90cf938..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/IEnablementIdentifierListener.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Feb 10, 2004
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal.enablement;
-
-/**
- * @author schacher
- * 
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public interface IEnablementIdentifierListener {
-	/**
-	 * Notifies that one or more properties of an instance of <code>IIdentifier</code> have
-	 * changed. Specific details are described in the <code>IdentifierEvent</code>.
-	 * 
-	 * @param identifierEvent
-	 *            the identifier event. Guaranteed not to be <code>null</code>.
-	 */
-	void identifierChanged(EnablementIdentifierEvent identifierEvent);
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/IEnablementManager.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/IEnablementManager.java
deleted file mode 100644
index 454c94c..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/IEnablementManager.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Feb 12, 2004
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal.enablement;
-
-import java.util.Collection;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jem.util.UIContextDetermination;
-
-/**
- * @author schacher
- * 
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public interface IEnablementManager {
-	String INTERNAL_ENABLEMENT_DETERMINATION_ID = "org.eclipse.wst.common.frameworks.internal.EnablementDetermination"; //$NON-NLS-1$
-
-	IEnablementManager INSTANCE = (IEnablementManager) UIContextDetermination.createInstance(INTERNAL_ENABLEMENT_DETERMINATION_ID);
-
-	IEnablementIdentifier getIdentifier(String identifierId, IProject project);
-
-	/**
-	 * Notify all identifier listeners that the state of a project has changed that affects the
-	 * enablement of a group for a project. This method is fail safe, in that if one listener throws
-	 * an exception while being notified, it will not stop the notification of other listeners.
-	 * 
-	 * @param evt
-	 * @throws CoreException
-	 *             if exceptions were caught notifying any of the listeners. Check the status of the
-	 *             core exception for the nested exceptions.
-	 */
-	void notifyFunctionGroupChanged(String groupID, IProject project) throws CoreException;
-
-	/**
-	 * Utility method for clients to dispose of listeners
-	 * 
-	 * @param enablementIdentifiers
-	 * @param listener
-	 */
-	void removeEnablementIdentifierListener(Collection enablementIdentifiers, IEnablementIdentifierListener listener);
-
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/IGroupInitializer.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/IGroupInitializer.java
deleted file mode 100644
index c1cdc9c..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/IGroupInitializer.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Dec 2, 2003
- *
- * To change the template for this generated file go to
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal.enablement;
-
-import org.eclipse.core.resources.IProject;
-
-/**
- * @author blancett
- * 
- * To change the template for this generated type comment go to Window>Preferences>Java>Code
- * Generation>Code and Comments
- */
-public interface IGroupInitializer {
-
-	public boolean isGroupEnabled(IProject project);
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/Identifiable.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/Identifiable.java
deleted file mode 100644
index bd364b9..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/Identifiable.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.enablement;
-
-
-/**
- * @author mdelder
- *  
- */
-public interface Identifiable {
-
-	/**
-	 * return id that uniquely identifies this instance of an extension point. It is up to each
-	 * individual extension point provider to decide what that might be (e.g., "editorID", "pageID",
-	 * etc.
-	 */
-	String getID();
-
-	/**
-	 * 
-	 * @return the order the Identifiable element was loaded
-	 */
-	int getLoadOrder();
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/IdentifiableComparator.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/IdentifiableComparator.java
deleted file mode 100644
index 0df26cf..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/IdentifiableComparator.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.enablement;
-
-
-/**
- * @author mdelder
- *  
- */
-public class IdentifiableComparator implements java.util.Comparator {
-
-	protected static final int GREATER_THAN = 1;
-
-	protected static final int LESS_THAN = -1;
-
-	protected static final int EQUAL = 0;
-
-	protected static final IdentifiableComparator instance = new IdentifiableComparator();
-
-	private static final int DEFAULT_PRIORITY = Integer.MAX_VALUE;
-
-	public static IdentifiableComparator getInstance() {
-		return instance;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
-	 */
-	public int compare(Object o1, Object o2) {
-		Identifiable lvalue = null;
-		Identifiable rvalue = null;
-		if (o1 instanceof Identifiable)
-			lvalue = (Identifiable) o1;
-		if (o2 instanceof Identifiable)
-			rvalue = (Identifiable) o2;
-
-		if (rvalue == null)
-			return GREATER_THAN;
-		if (lvalue == null)
-			return LESS_THAN;
-
-		if ((lvalue.getID() == null && rvalue.getID() == null) || (getPriority(lvalue) == getPriority(rvalue)))
-			return compareLoadOrder(lvalue, rvalue);
-		/* R - L implies 0 is the highest priority */
-		return getPriority(lvalue) - getPriority(rvalue);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.util.Comparator#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		return obj instanceof IdentifiableComparator;
-	}
-
-	private int compareLoadOrder(Identifiable lvalue, Identifiable rvalue) {
-		/* R - L implies 0 is the highest priority */
-		return lvalue.getLoadOrder() - rvalue.getLoadOrder();
-	}
-
-	public int getPriority(Identifiable identifiable) {
-		if (identifiable.getID() != null && identifiable.getID().length() > 0)
-			return FunctionGroupRegistry.getInstance().getFunctionPriority(identifiable.getID());
-		return DEFAULT_PRIORITY;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/Util.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/Util.java
deleted file mode 100644
index 740270a..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/Util.java
+++ /dev/null
@@ -1,354 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.enablement;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-import java.util.Set;
-import java.util.SortedMap;
-import java.util.SortedSet;
-import java.util.TreeMap;
-import java.util.TreeSet;
-
-/*
- * Rename this class to EnablementsUtil
- */
-
-public final class Util {
-	public final static SortedMap EMPTY_SORTED_MAP = Collections.unmodifiableSortedMap(new TreeMap());
-	public final static SortedSet EMPTY_SORTED_SET = Collections.unmodifiableSortedSet(new TreeSet());
-	public final static String ZERO_LENGTH_STRING = ""; //$NON-NLS-1$
-
-	public static void assertInstance(Object object, Class c) {
-		assertInstance(object, c, false);
-	}
-
-	public static void assertInstance(Object object, Class c, boolean allowNull) {
-		if (object == null && allowNull)
-			return;
-
-		if (object == null || c == null)
-			throw new NullPointerException();
-		else if (!c.isInstance(object))
-			throw new IllegalArgumentException();
-	}
-
-	public static int compare(boolean left, boolean right) {
-		return left == false ? (right == true ? -1 : 0) : 1;
-	}
-
-	public static int compare(Comparable left, Comparable right) {
-		if (left == null && right == null)
-			return 0;
-		else if (left == null)
-			return -1;
-		else if (right == null)
-			return 1;
-		else
-			return left.compareTo(right);
-	}
-
-	public static int compare(Comparable[] left, Comparable[] right) {
-		if (left == null && right == null)
-			return 0;
-		else if (left == null)
-			return -1;
-		else if (right == null)
-			return 1;
-		else {
-			int l = left.length;
-			int r = right.length;
-
-			if (l != r)
-				return l - r;
-			for (int i = 0; i < l; i++) {
-				int compareTo = compare(left[i], right[i]);
-
-				if (compareTo != 0)
-					return compareTo;
-			}
-			return 0;
-		}
-	}
-
-	public static int compare(int left, int right) {
-		return left - right;
-	}
-
-	public static int compare(List left, List right) {
-		if (left == null && right == null)
-			return 0;
-		else if (left == null)
-			return -1;
-		else if (right == null)
-			return 1;
-		else {
-			int l = left.size();
-			int r = right.size();
-
-			if (l != r)
-				return l - r;
-			for (int i = 0; i < l; i++) {
-				int compareTo = compare((Comparable) left.get(i), (Comparable) right.get(i));
-
-				if (compareTo != 0)
-					return compareTo;
-			}
-			return 0;
-		}
-	}
-
-	public static void diff(Map left, Map right, Set leftOnly, Set different, Set rightOnly) {
-		if (left == null || right == null || leftOnly == null || different == null || rightOnly == null)
-			throw new NullPointerException();
-
-		Iterator iterator = left.keySet().iterator();
-
-		while (iterator.hasNext()) {
-			Object key = iterator.next();
-
-			if (!right.containsKey(key))
-				leftOnly.add(key);
-			else if (!Util.equals(left.get(key), right.get(key)))
-				different.add(key);
-		}
-
-		iterator = right.keySet().iterator();
-
-		while (iterator.hasNext()) {
-			Object key = iterator.next();
-
-			if (!left.containsKey(key))
-				rightOnly.add(key);
-		}
-	}
-
-	public static void diff(Set left, Set right, Set leftOnly, Set rightOnly) {
-		if (left == null || right == null || leftOnly == null || rightOnly == null)
-			throw new NullPointerException();
-
-		Iterator iterator = left.iterator();
-
-		while (iterator.hasNext()) {
-			Object object = iterator.next();
-
-			if (!right.contains(object))
-				leftOnly.add(object);
-		}
-
-		iterator = right.iterator();
-
-		while (iterator.hasNext()) {
-			Object object = iterator.next();
-
-			if (!left.contains(object))
-				rightOnly.add(object);
-		}
-	}
-
-	public static boolean endsWith(List left, List right, boolean equals) {
-		if (left == null || right == null)
-			return false;
-		int l = left.size();
-		int r = right.size();
-		if (r > l || !equals && r == l)
-			return false;
-
-		for (int i = 0; i < r; i++)
-			if (!equals(left.get(l - i - 1), right.get(r - i - 1)))
-				return false;
-		return true;
-	}
-
-	public static boolean endsWith(Object[] left, Object[] right, boolean equals) {
-		if (left == null || right == null)
-			return false;
-		int l = left.length;
-		int r = right.length;
-		if (r > l || !equals && r == l)
-			return false;
-		for (int i = 0; i < r; i++)
-			if (!equals(left[l - i - 1], right[r - i - 1]))
-				return false;
-		return true;
-	}
-
-	public static boolean equals(boolean left, boolean right) {
-		return left == right;
-	}
-
-	public static boolean equals(int left, int right) {
-		return left == right;
-	}
-
-	public static boolean equals(Object left, Object right) {
-		return left == null ? right == null : left.equals(right);
-	}
-
-	public static int hashCode(boolean b) {
-		return b ? Boolean.TRUE.hashCode() : Boolean.FALSE.hashCode();
-	}
-
-	public static int hashCode(int i) {
-		return i;
-	}
-
-	public static int hashCode(Object object) {
-		return object != null ? object.hashCode() : 0;
-	}
-
-	public static List safeCopy(List list, Class c) {
-		return safeCopy(list, c, false);
-	}
-
-	public static List safeCopy(List list, Class c, boolean allowNullElements) {
-		if (list == null || c == null)
-			throw new NullPointerException();
-
-		list = Collections.unmodifiableList(new ArrayList(list));
-		Iterator iterator = list.iterator();
-
-		while (iterator.hasNext())
-			assertInstance(iterator.next(), c, allowNullElements);
-
-		return list;
-	}
-
-	public static Map safeCopy(Map map, Class keyClass, Class valueClass) {
-		return safeCopy(map, keyClass, valueClass, false, false);
-	}
-
-	public static Map safeCopy(Map map, Class keyClass, Class valueClass, boolean allowNullKeys, boolean allowNullValues) {
-		if (map == null || keyClass == null || valueClass == null)
-			throw new NullPointerException();
-
-		map = Collections.unmodifiableMap(new HashMap(map));
-		Iterator iterator = map.entrySet().iterator();
-
-		while (iterator.hasNext()) {
-			Map.Entry entry = (Map.Entry) iterator.next();
-			assertInstance(entry.getKey(), keyClass, allowNullKeys);
-			assertInstance(entry.getValue(), valueClass, allowNullValues);
-		}
-
-		return map;
-	}
-
-	public static Set safeCopy(Set set, Class c) {
-		return safeCopy(set, c, false);
-	}
-
-	public static Set safeCopy(Set set, Class c, boolean allowNullElements) {
-		if (set == null || c == null)
-			throw new NullPointerException();
-
-		set = Collections.unmodifiableSet(new HashSet(set));
-		Iterator iterator = set.iterator();
-
-		while (iterator.hasNext())
-			assertInstance(iterator.next(), c, allowNullElements);
-
-		return set;
-	}
-
-	public static SortedMap safeCopy(SortedMap sortedMap, Class keyClass, Class valueClass) {
-		return safeCopy(sortedMap, keyClass, valueClass, false, false);
-	}
-
-	public static SortedMap safeCopy(SortedMap sortedMap, Class keyClass, Class valueClass, boolean allowNullKeys, boolean allowNullValues) {
-		if (sortedMap == null || keyClass == null || valueClass == null)
-			throw new NullPointerException();
-
-		sortedMap = Collections.unmodifiableSortedMap(new TreeMap(sortedMap));
-		Iterator iterator = sortedMap.entrySet().iterator();
-
-		while (iterator.hasNext()) {
-			Map.Entry entry = (Map.Entry) iterator.next();
-			assertInstance(entry.getKey(), keyClass, allowNullKeys);
-			assertInstance(entry.getValue(), valueClass, allowNullValues);
-		}
-
-		return sortedMap;
-	}
-
-	public static SortedSet safeCopy(SortedSet sortedSet, Class c) {
-		return safeCopy(sortedSet, c, false);
-	}
-
-	public static SortedSet safeCopy(SortedSet sortedSet, Class c, boolean allowNullElements) {
-		if (sortedSet == null || c == null)
-			throw new NullPointerException();
-
-		sortedSet = Collections.unmodifiableSortedSet(new TreeSet(sortedSet));
-		Iterator iterator = sortedSet.iterator();
-
-		while (iterator.hasNext())
-			assertInstance(iterator.next(), c, allowNullElements);
-
-		return sortedSet;
-	}
-
-	public static boolean startsWith(List left, List right, boolean equals) {
-		if (left == null || right == null)
-			return false;
-		int l = left.size();
-		int r = right.size();
-		if (r > l || !equals && r == l)
-			return false;
-		for (int i = 0; i < r; i++)
-			if (!equals(left.get(i), right.get(i)))
-				return false;
-		return true;
-	}
-
-	public static boolean startsWith(Object[] left, Object[] right, boolean equals) {
-		if (left == null || right == null)
-			return false;
-		int l = left.length;
-		int r = right.length;
-		if (r > l || !equals && r == l)
-			return false;
-
-		for (int i = 0; i < r; i++)
-			if (!equals(left[i], right[i]))
-				return false;
-		return true;
-	}
-
-	public static String translateString(ResourceBundle resourceBundle, String key) {
-		return Util.translateString(resourceBundle, key, key, true, true);
-	}
-
-	public static String translateString(ResourceBundle resourceBundle, String key, String string, boolean signal, boolean trim) {
-		if (resourceBundle != null && key != null)
-			try {
-				final String translatedString = resourceBundle.getString(key);
-
-				if (translatedString != null)
-					return trim ? translatedString.trim() : translatedString;
-			} catch (MissingResourceException eMissingResource) {
-				if (signal)
-					System.err.println(eMissingResource);
-			}
-
-		return trim ? string.trim() : string;
-	}
-
-	private Util() {
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ComposedExtendedOperationHolder.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ComposedExtendedOperationHolder.java
deleted file mode 100644
index 8b754b5..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ComposedExtendedOperationHolder.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.operations;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.frameworks.internal.enablement.EnablementManager;
-
-public class ComposedExtendedOperationHolder {
-
-	private ArrayList preOps = null;
-	private ArrayList postOps = null;
-
-	protected ComposedExtendedOperationHolder() {
-		super();
-	}
-
-	public static ComposedExtendedOperationHolder createExtendedOperationHolder(String operationID) {
-		Collection extensions = (Collection) OperationExtensionReader.getExtensionPoints().get(operationID);
-		if (extensions == null) {
-			return null;
-		}
-
-		ComposedExtendedOperationHolder extOperationHolder = new ComposedExtendedOperationHolder();
-		Object preOp = null;
-		Object postOp = null;
-		OperationExtension currentExt = null;
-		for (Iterator iterator = extensions.iterator(); iterator.hasNext();) {
-			currentExt = (OperationExtension) iterator.next();
-			if (EnablementManager.INSTANCE.getIdentifier(currentExt.getExtensionId(), null).isEnabled()) {
-				try {
-					preOp = currentExt.getPreOperation();
-					if (preOp != null) {
-						extOperationHolder.addPreOperation(preOp);
-					}
-				} catch (CoreException e) {
-					Logger.getLogger().logError(e);
-				}
-				try {
-					postOp = currentExt.getPostOperation();
-					if (postOp != null) {
-						extOperationHolder.addPostOperation(postOp);
-					}
-				} catch (CoreException e) {
-					Logger.getLogger().logError(e);
-				}
-			}
-		}
-		return extOperationHolder;
-	}
-
-	protected void addPreOperation(Object preOperation) {
-		if (preOps == null) {
-			preOps = new ArrayList();
-		}
-		preOps.add(preOperation);
-	}
-
-	protected void addPostOperation(Object postOperation) {
-		if (postOps == null) {
-			postOps = new ArrayList();
-		}
-		postOps.add(postOperation);
-	}
-
-	public boolean hasPreOps() {
-		return preOps != null;
-	}
-
-	public boolean hasPostOps() {
-		return postOps != null;
-	}
-
-	public ArrayList getPostOps() {
-		return postOps;
-	}
-
-	public ArrayList getPreOps() {
-		return preOps;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/IHeadlessRunnableWithProgress.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/IHeadlessRunnableWithProgress.java
deleted file mode 100644
index 35db85c..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/IHeadlessRunnableWithProgress.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.operations;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-
-/**
- * Simialar to org.eclipse.jface.operation.IRunnableWithProgress, however without UI dependencies.
- * 
- * This class is EXPERIMENTAL and is subject to substantial changes.
- */
-public interface IHeadlessRunnableWithProgress {
-	/**
-	 * Runs this operation without forcing a UI dependency.
-	 * 
-	 * @param monitor
-	 *            the progress monitor to use to display progress and receive requests for
-	 *            cancelation
-	 * @exception InvocationTargetException
-	 *                if the run method must propagate a checked exception, it should wrap it inside
-	 *                an <code>InvocationTargetException</code>; runtime exceptions are
-	 *                automatically wrapped in an <code>InvocationTargetException</code> by the
-	 *                calling context
-	 * @exception InterruptedException
-	 *                if the operation detects a request to cancel, using
-	 *                <code>IProgressMonitor.isCanceled()</code>, it should exit by throwing
-	 *                <code>InterruptedException</code>
-	 * 
-	 * @see IRunnableWithProgress
-	 */
-	public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException;
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/IOperationHandler.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/IOperationHandler.java
deleted file mode 100644
index 633e4c1..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/IOperationHandler.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-
-package org.eclipse.wst.common.frameworks.internal.operations;
-
-/**
- * Passed to complex methods that may require reporting of messages, or interactions from the user;
- * Defined as an interface because the actions may run in headless environments
- */
-public interface IOperationHandler {
-	int YES = 0;
-	int YES_TO_ALL = 1;
-	int NO = 2;
-	int CANCEL = 3;
-
-	/**
-	 * A decision needs to made as to whether an action/operation can continue
-	 */
-	public boolean canContinue(String message);
-
-	/**
-	 * A decision needs to made as to whether an action/operation can continue. <code>items</code>
-	 * is an array of details that accompany the <code>message</code>.
-	 */
-	public boolean canContinue(String message, String[] items);
-
-	/**
-	 * A decision needs to made as to whether an action/operation can continue. The boolean array
-	 * will return two booleans. The first indicates their response to the original question and the
-	 * second indicates if they selected the apply to all check box.
-	 * 
-	 * Return the return code for the dialog. 0 = Yes, 1 = Yes to all, 2 = No
-	 */
-	int canContinueWithAllCheck(String message);
-
-	int canContinueWithAllCheckAllowCancel(String message);
-
-	/**
-	 * An error has occurred
-	 */
-	public void error(String message);
-
-	/**
-	 * An informational message needs to be presented
-	 */
-	public void inform(String message);
-
-	public Object getContext();
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/IProjectCreationProperties.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/IProjectCreationProperties.java
deleted file mode 100644
index 214e6e5..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/IProjectCreationProperties.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.operations;
-
-
-/**
- * @deprecated use IProjectCreationPropertiesNew
- */
-public interface IProjectCreationProperties {
-
-	/**
-	 * A required dataModel propertyName for a <code>java.lang.String</code> type. This is used to
-	 * specify the project name.
-	 */
-	public static final String PROJECT_NAME = "IProjectCreationProperties.PROJECT_NAME"; //$NON-NLS-1$
-
-	/**
-	 * An optonal dataModel propertyName for a <code>java.lang.String</code> type. Sets the local
-	 * file system location for the described project. The path must be either an absolute file
-	 * system path, or a relative path whose first segment is the name of a defined workspace path
-	 * variable. The default value is the workspace's default location.
-	 */
-	public static final String PROJECT_LOCATION = "IProjectCreationProperties.PROJECT_LOCATION"; //$NON-NLS-1$
-
-
-	/**
-	 * An optional dataModel propertyName for a <code>java.lang.String[]</code> type. This is a
-	 * list of all natures to add to the project. There is no default value.
-	 */
-	public static final String PROJECT_NATURES = "IProjectCreationProperties.PROJECT_NATURES"; //$NON-NLS-1$
-
-	/**
-	 * IProject. An non settable property. This is a conveniece for constructiong getting the
-	 * IProject
-	 */
-	public static final String PROJECT = "IProjectCreationProperties.PROJECT"; //$NON-NLS-1$
-
-	/**
-	 * IProjectDescription. An non settable property. This is a conveniece for constructiong a
-	 * project description.
-	 */
-	public static final String PROJECT_DESCRIPTION = "IProjectCreationProperties.PROJECT_DESCRIPTION"; //$NON-NLS-1$
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/IProjectCreationPropertiesNew.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/IProjectCreationPropertiesNew.java
deleted file mode 100644
index 9ab6337..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/IProjectCreationPropertiesNew.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.operations;
-
-public interface IProjectCreationPropertiesNew {
-
-	/**
-	 * A required dataModel propertyName for a <code>java.lang.String</code> type. This is used to
-	 * specify the project name.
-	 */
-	public static final String PROJECT_NAME = "IProjectCreationPropertiesNew.PROJECT_NAME"; //$NON-NLS-1$
-
-	/**
-	 * A Boolean property used for determining how the PROJECT_LOCATION is computed. If this
-	 * property is true then the PROJECT_LOCATION is null. Otherwise the PROJECT_LOCATION is the
-	 * value of USER_DEFINED_LOCATION.
-	 */
-	public static final String USE_DEFAULT_LOCATION = "IProjectCreationPropertiesNew.USE_DEFAULT_LOCATION"; //$NON-NLS-1$
-
-	/**
-	 * A String property used in conjuction with USE_DEFAULT_LOCATION to override the
-	 * DEFAULT_LOCATION.
-	 */
-	public static final String USER_DEFINED_LOCATION = "IProjectCreationPropertiesNew.USER_DEFINED_LOCATION"; //$NON-NLS-1$
-
-	/**
-	 * An unsettable property which specified the default location for a newly created project. The
-	 * value is computed by appending the project name to the workspace location.
-	 */
-	public static final String DEFAULT_LOCATION = "IProjectCreationPropertiesNew.DEFAULT_LOCATION"; //$NON-NLS-1$
-
-	/**
-	 * An unsettable property used to specify the project location. If USE_DEFAULT_LOCATION this
-	 * property evaluates to USER_DEFINED_LOCATION; otherwise it i <code>null</code>.
-	 */
-	public static final String PROJECT_LOCATION = "IProjectCreationPropertiesNew.PROJECT_LOCATION"; //$NON-NLS-1$
-
-	/**
-	 * An optional dataModel propertyName for a <code>java.lang.String[]</code> type. This is a
-	 * list of all natures to add to the project. There is no default value.
-	 */
-	public static final String PROJECT_NATURES = "IProjectCreationPropertiesNew.PROJECT_NATURES"; //$NON-NLS-1$
-
-	/**
-	 * IProject. An non settable property. This is a conveniece for constructiong getting the
-	 * IProject
-	 */
-	public static final String PROJECT = "IProjectCreationPropertiesNew.PROJECT"; //$NON-NLS-1$
-
-	/**
-	 * IProjectDescription. An non settable property. This is a conveniece for constructiong a
-	 * project description.
-	 */
-	public static final String PROJECT_DESCRIPTION = "IProjectCreationPropertiesNew.PROJECT_DESCRIPTION"; //$NON-NLS-1$
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/OperationExtension.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/OperationExtension.java
deleted file mode 100644
index 2fcd16e..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/OperationExtension.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.operations;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-
-public class OperationExtension {
-
-	protected String opID = null;
-
-	protected IConfigurationElement baseElement = null;
-
-	protected String preOperationClass = null;
-
-	protected String postOperationClass = null;
-
-	protected String extensionId;
-
-	public OperationExtension(IConfigurationElement element, String id, String preOp, String postOp) {
-		super();
-		baseElement = element;
-		setUpExtension(id, preOp, postOp);
-	}
-
-	private void setUpExtension(String id, String preOp, String postOp) {
-		opID = id;
-		preOperationClass = preOp;
-		postOperationClass = postOp;
-		this.extensionId = baseElement.getDeclaringExtension().getUniqueIdentifier();
-		if (this.extensionId == null)
-			this.extensionId = baseElement.getDeclaringExtension().getNamespace();
-	}
-
-	public String getOpID() {
-		return opID;
-	}
-
-	public String getPostOperationClass() {
-		return postOperationClass;
-	}
-
-	public String getPreOperationClass() {
-		return preOperationClass;
-	}
-
-	public Object getPostOperation() throws CoreException {
-		if (postOperationClass == null)
-			return null;
-		return baseElement.createExecutableExtension(OperationExtensionReader.ATT_POST_OP);
-	}
-
-	public Object getPreOperation() throws CoreException {
-		if (preOperationClass == null)
-			return null;
-		return baseElement.createExecutableExtension(OperationExtensionReader.ATT_PRE_OP);
-	}
-
-	/**
-	 * @return Returns the extensionId.
-	 */
-	public String getExtensionId() {
-		return extensionId;
-	}
-
-	public IConfigurationElement getBaseElement() {
-		return baseElement;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/OperationExtensionReader.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/OperationExtensionReader.java
deleted file mode 100644
index 31f25db..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/OperationExtensionReader.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Nov 3, 2003
- * 
- * To change the template for this generated file go to Window&gt;Preferences&gt;Java&gt;Code
- * Generation&gt;Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal.operations;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jem.util.RegistryReader;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
-
-public class OperationExtensionReader extends RegistryReader {
-	protected static HashMap opExtensions = null;
-
-	public static final String ELEMENT_J2EEOPEXT = "operationExtension"; //$NON-NLS-1$
-	public static final String ATT_ID = "id"; //$NON-NLS-1$ 
-	public static final String ATT_PRE_OP = "preOperationClass"; //$NON-NLS-1$
-	public static final String ATT_POST_OP = "postOperationClass"; //$NON-NLS-1$
-
-	public OperationExtensionReader() {
-		super(WTPCommonPlugin.PLUGIN_ID, "OperationExtension"); //$NON-NLS-1$
-	}
-
-	/**
-	 * readElement() - parse and deal with an extension like: <operationExtension
-	 * preOperationClass="com.ibm.etools....PreDeleteOperation"
-	 * postOperationClass="com.ibm.etools....PostDeleteOperation"> </operationExtension>
-	 */
-
-	public boolean readElement(IConfigurationElement element) {
-		if (!element.getName().equals(ELEMENT_J2EEOPEXT))
-			return false;
-		String id = element.getAttribute(ATT_ID);
-		String preOp = element.getAttribute(ATT_PRE_OP);
-		String postOp = element.getAttribute(ATT_POST_OP);
-		OperationExtension extension = new OperationExtension(element, id, preOp, postOp);
-		addExtensionPoint(extension);
-		return true;
-	}
-
-	/**
-	 * Sets the extension point.
-	 * 
-	 * @param extensions
-	 *            The extensions to set
-	 */
-	private static void addExtensionPoint(OperationExtension newExtension) {
-		Collection temp = null;
-		Object holder = opExtensions.get(newExtension.getOpID());
-		if (holder == null) {
-			temp = new ArrayList();
-			temp.add(newExtension);
-			opExtensions.put(newExtension.getOpID(), temp);
-		} else {
-			temp = (Collection) holder;
-			temp.add(newExtension);
-		}
-	}
-
-	public static HashMap getExtensionPoints() {
-		if(opExtensions == null){
-			opExtensions = new HashMap();
-			OperationExtensionReader opExtensionReader = new OperationExtensionReader();
-			opExtensionReader.readRegistry();
-		}
-		return opExtensions;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/OperationStatus.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/OperationStatus.java
deleted file mode 100644
index 0acebf5..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/OperationStatus.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.operations;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
-
-public class OperationStatus extends MultiStatus {
-
-	public OperationStatus(String message, Throwable e) {
-		super(WTPCommonPlugin.PLUGIN_ID, 0, new IStatus[]{}, message, e);
-	}
-
-	public OperationStatus(IStatus[] children) {
-		this(WTPCommonPlugin.PLUGIN_ID, 0, children, "", null); //$NON-NLS-1$
-	}
-
-	public OperationStatus(String pluginId, int code, IStatus[] children, String message, Throwable exception) {
-		super(pluginId, code, children, message, exception);
-	}
-
-	public void addExtendedStatus(IStatus status) {
-		int oldSeverity = getSeverity();
-		super.add(status);
-		if (oldSeverity != IStatus.ERROR && getSeverity() == IStatus.ERROR) {
-			setSeverity(IStatus.WARNING);
-		}
-	}
-
-	public void setCode(int code) {
-		super.setCode(code);
-	}
-
-	public void setException(Throwable exception) {
-		super.setException(exception);
-	}
-
-	public void setMessage(String message) {
-		super.setMessage(message);
-	}
-
-	public void setSeverity(int severity) {
-		super.setSeverity(severity);
-	}
-
-	public void add(IStatus status) {
-		int newSev = status.getSeverity();
-		if (newSev > getSeverity()) {
-			setMessage(status.getMessage());
-			setException(status.getException());
-		}
-		super.add(status);
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ProjectCreationDataModelProvider.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ProjectCreationDataModelProvider.java
deleted file mode 100644
index ccf044c..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ProjectCreationDataModelProvider.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Oct 27, 2003
- * 
- * To change the template for this generated file go to Window&gt;Preferences&gt;Java&gt;Code
- * Generation&gt;Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal.operations;
-
-import java.io.File;
-import java.util.Set;
-
-import org.eclipse.core.internal.resources.Resource;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-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.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelProvider;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
-import org.eclipse.wst.common.frameworks.internal.WTPPlugin;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonMessages;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
-
-/**
- * @deprecated use ProjectCreationDataModelProviderNew instead.
- */
-public class ProjectCreationDataModelProvider extends AbstractDataModelProvider implements IProjectCreationProperties {
-
-	public IDataModelOperation getDefaultOperation() {
-		return new ProjectCreationOperation(model);
-	}
-
-	public void init() {
-		super.init();
-	}
-
-	public Set getPropertyNames() {
-		Set propertyNames = super.getPropertyNames();
-		propertyNames.add(PROJECT);
-		propertyNames.add(PROJECT_NAME);
-		propertyNames.add(PROJECT_LOCATION);
-		propertyNames.add(PROJECT_NATURES);
-		propertyNames.add(PROJECT_DESCRIPTION);
-		return propertyNames;
-	}
-
-	public Object getDefaultProperty(String propertyName) {
-		if (propertyName.equals(PROJECT_LOCATION))
-			return getDefaultLocation();
-		else if (propertyName.equals(PROJECT_DESCRIPTION))
-			return getProjectDescription();
-		return super.getDefaultProperty(propertyName);
-	}
-
-	public boolean propertySet(String propertyName, Object propertyValue) {
-		if (propertyValue != null && propertyName.equals(PROJECT_LOCATION)) {
-			IPath path = getRootLocation();
-			if (path.equals(new Path((String) propertyValue))) {
-				model.setProperty(propertyName, null);
-			}
-			model.setProperty(PROJECT_DESCRIPTION, getProjectDescription());
-		} else if (propertyName.equals(PROJECT_NAME)) {
-			IStatus stat = model.validateProperty(PROJECT_NAME);
-			if (stat != OK_STATUS)
-				return false;
-			model.setProperty(PROJECT, getProject());
-			model.setProperty(PROJECT_DESCRIPTION, getProjectDescription());
-		}
-		return true;
-	}
-
-	private String getDefaultLocation() {
-		IPath path = getRootLocation();
-		String projectName = (String) getProperty(PROJECT_NAME);
-		if (projectName != null)
-			path = path.append(projectName);
-		return path.toOSString();
-	}
-
-	private IPath getRootLocation() {
-		return ResourcesPlugin.getWorkspace().getRoot().getLocation();
-	}
-
-	private IProjectDescription getProjectDescription() {
-		String projectName = (String) getProperty(PROJECT_NAME);
-		IProjectDescription desc = ResourcesPlugin.getWorkspace().newProjectDescription(projectName);
-		if (getDataModel().isPropertySet(PROJECT_LOCATION)) {
-			String projectLocation = (String) getProperty(IProjectCreationProperties.PROJECT_LOCATION);
-			if (projectLocation != null)
-				desc.setLocation(new Path(projectLocation));
-			else
-				desc.setLocation(null);
-		}
-		return desc;
-	}
-
-	protected IProject getProject() {
-		String projectName = (String) getProperty(PROJECT_NAME);
-		return (null != projectName && projectName.length() > 0) ? ResourcesPlugin.getWorkspace().getRoot().getProject(projectName) : null;
-	}
-
-	public IStatus validate(String propertyName) {
-		if (propertyName.equals(PROJECT_NAME)) {
-			IStatus status = validateName();
-			if (!status.isOK())
-				return status;
-		}
-		if (propertyName.equals(PROJECT_LOCATION)) {
-			IStatus status = validateLocation();
-			if (!status.isOK())
-				return status;
-		}
-		if (propertyName.equals(PROJECT_LOCATION) || propertyName.equals(PROJECT_NAME)) {
-			String projectName = getStringProperty(PROJECT_NAME);
-			String projectLoc = getStringProperty(PROJECT_LOCATION);
-			return validateExisting(projectName, projectLoc);
-		}
-		return OK_STATUS;
-	}
-
-	/**
-	 * @param projectName
-	 * @param projectLoc
-	 * @todo Generated comment
-	 */
-	private IStatus validateExisting(String projectName, String projectLoc) {
-		if (projectName != null && !projectName.equals("")) {//$NON-NLS-1$
-			File file = new File(projectLoc);
-			if (file.exists()) {
-				if (file.isDirectory()) {
-					File dotProject = new File(file, ".project");//$NON-NLS-1$
-					if (dotProject.exists()) {
-						return WTPCommonPlugin.createErrorStatus(WTPCommonPlugin.getResourceString(WTPCommonMessages.PROJECT_EXISTS_AT_LOCATION_ERROR, new Object[]{file.toString()}));
-					}
-				}
-			}
-		}
-		return OK_STATUS;
-	}
-
-	public static IProject getProjectHandleFromProjectName(String projectName) {
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		IStatus status = workspace.validateName(projectName, IResource.PROJECT);
-		return (null != projectName && projectName.length() > 0 && status.isOK()) ? ResourcesPlugin.getWorkspace().getRoot().getProject(projectName) : null;
-	}
-
-	public static IStatus validateProjectName(String projectName) {
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		IStatus status = workspace.validateName(projectName, IResource.PROJECT);
-		if (!status.isOK())
-			return status;
-		return OK_STATUS;
-	}
-
-	private IStatus validateName() {
-		String name = getStringProperty(PROJECT_NAME);
-		IStatus status = validateProjectName(name);
-		if (!status.isOK())
-			return status;
-		if (getProject().exists())
-			return WTPCommonPlugin.createErrorStatus(WTPCommonPlugin.getResourceString(WTPCommonMessages.PROJECT_EXISTS_ERROR, new Object[]{name}));
-
-		if (!WTPPlugin.isPlatformCaseSensitive()) {
-			// now look for a matching case variant in the tree
-			IResource variant = ((Resource) getProject()).findExistingResourceVariant(getProject().getFullPath());
-			if (variant != null) {
-				// TODO Fix this string
-				return WTPCommonPlugin.createErrorStatus("Resource already exists with a different case."); //$NON-NLS-1$
-			}
-		}
-		return OK_STATUS;
-	}
-
-	private IStatus validateLocation() {
-		if (getDataModel().isPropertySet(PROJECT_LOCATION)) {
-			String loc = (String) getProperty(PROJECT_LOCATION);
-			IWorkspace workspace = ResourcesPlugin.getWorkspace();
-			IPath path = new Path(loc);
-			return workspace.validateProjectLocation(getProject(), path);
-		}
-		return OK_STATUS;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ProjectCreationDataModelProviderNew.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ProjectCreationDataModelProviderNew.java
deleted file mode 100644
index 4c683c3..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ProjectCreationDataModelProviderNew.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.operations;
-
-import java.io.File;
-import java.util.Set;
-
-import org.eclipse.core.internal.resources.Resource;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-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.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelProvider;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
-import org.eclipse.wst.common.frameworks.internal.WTPPlugin;
-import org.eclipse.wst.common.frameworks.internal.WTPResourceHandler;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonMessages;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
-
-public class ProjectCreationDataModelProviderNew extends AbstractDataModelProvider implements IProjectCreationPropertiesNew {
-
-	public IDataModelOperation getDefaultOperation() {
-		return new ProjectCreationOperation(model);
-	}
-
-	public void init() {
-		super.init();
-	}
-
-	public Set getPropertyNames() {
-		Set propertyNames = super.getPropertyNames();
-		propertyNames.add(PROJECT);
-		propertyNames.add(PROJECT_NAME);
-		propertyNames.add(PROJECT_LOCATION);
-		propertyNames.add(USE_DEFAULT_LOCATION);
-		propertyNames.add(DEFAULT_LOCATION);
-		propertyNames.add(USER_DEFINED_LOCATION);
-		propertyNames.add(PROJECT_NATURES);
-		propertyNames.add(PROJECT_DESCRIPTION);
-		return propertyNames;
-	}
-
-	public Object getDefaultProperty(String propertyName) {
-		if (propertyName.equals(PROJECT_LOCATION)) {
-			if (getBooleanProperty(USE_DEFAULT_LOCATION)) {
-				return null;
-			}
-			return getProperty(USER_DEFINED_LOCATION);
-		} else if (DEFAULT_LOCATION.equals(propertyName)) {
-			return getDefaultLocation();
-		} else if (USE_DEFAULT_LOCATION.equals(propertyName)) {
-			return Boolean.TRUE;
-		} else if (USER_DEFINED_LOCATION.equals(propertyName)) {
-			return ""; //$NON-NLS-1$
-		} else if (propertyName.equals(PROJECT_DESCRIPTION)){
-			return getProjectDescription();
-		}
-		
-		return super.getDefaultProperty(propertyName);
-	}
-
-	private String getDefaultLocation() {
-		IPath path = ResourcesPlugin.getWorkspace().getRoot().getLocation();
-		String projectName = (String) getProperty(PROJECT_NAME);
-		if (projectName != null)
-			path = path.append(projectName);
-		return path.toOSString();
-	}
-	
-	public boolean propertySet(String propertyName, Object propertyValue) {
-		if (propertyName.equals(PROJECT_LOCATION) || propertyName.equals(DEFAULT_LOCATION) || propertyName.equals(PROJECT_DESCRIPTION)) {
-			throw new RuntimeException();
-		} else if (propertyName.equals(PROJECT_NAME)) {
-			IStatus stat = model.validateProperty(PROJECT_NAME);
-			if (stat != OK_STATUS)
-				return true;
-			model.setProperty(PROJECT, getProject());
-			model.notifyPropertyChange(DEFAULT_LOCATION, IDataModel.VALUE_CHG);
-			if (getBooleanProperty(USE_DEFAULT_LOCATION)) {
-				model.notifyPropertyChange(PROJECT_LOCATION, IDataModel.VALUE_CHG);
-			}
-		} else if (propertyName.equals(USE_DEFAULT_LOCATION)) {
-			model.notifyPropertyChange(PROJECT_LOCATION, IDataModel.VALUE_CHG);
-		} else if (propertyName.equals(USER_DEFINED_LOCATION) && !getBooleanProperty(USE_DEFAULT_LOCATION)) {
-			model.notifyPropertyChange(PROJECT_LOCATION, IDataModel.VALUE_CHG);
-		}
-		return true;
-	}
-
-	private IProjectDescription getProjectDescription() {
-		String projectName = (String) getProperty(PROJECT_NAME);
-		IProjectDescription desc = ResourcesPlugin.getWorkspace().newProjectDescription(projectName);
-		String projectLocation = (String) getProperty(PROJECT_LOCATION);
-		if (projectLocation != null)
-			desc.setLocation(new Path(projectLocation));
-		else
-			desc.setLocation(null);
-		return desc;
-	}
-
-	protected IProject getProject() {
-		String projectName = (String) getProperty(PROJECT_NAME);
-		return (null != projectName && projectName.length() > 0) ? ResourcesPlugin.getWorkspace().getRoot().getProject(projectName) : null;
-	}
-
-	public IStatus validate(String propertyName) {
-		if (propertyName.equals(PROJECT_NAME)) {
-			String name = model.getStringProperty(PROJECT_NAME);
-			IStatus status = validateName( name );
-			if (!status.isOK())
-				return status;
-		}
-		if (propertyName.equals(PROJECT_LOCATION)) {
-			IStatus status = validateLocation();
-			if (!status.isOK())
-				return status;
-		}
-		if (propertyName.equals(PROJECT_LOCATION) || propertyName.equals(PROJECT_NAME)) {
-			String projectName = getStringProperty(PROJECT_NAME);
-			
-			String projectLoc = ""; //$NON-NLS-1$
-			if( getBooleanProperty(USE_DEFAULT_LOCATION )){
-				projectLoc = getDefaultLocation();
-			}else{
-				projectLoc = getStringProperty(PROJECT_LOCATION);
-			}
-			return validateExisting(projectName, projectLoc);
-		}
-		return OK_STATUS;
-	}
-
-	/**
-	 * @param projectName
-	 * @param projectLoc
-	 * @todo Generated comment
-	 */
-	private IStatus validateExisting(String projectName, String projectLoc) {
-		if (projectName != null && !projectName.equals("")) {//$NON-NLS-1$
-			File file = new File(projectLoc);
-			if (file.exists()) {
-				if (file.isDirectory()) {
-					File dotProject = new File(file, ".project");//$NON-NLS-1$
-					if (dotProject.exists()) {
-						return WTPCommonPlugin.createErrorStatus(WTPCommonPlugin.getResourceString(WTPCommonMessages.PROJECT_EXISTS_AT_LOCATION_ERROR, new Object[]{file.toString()}));
-					}
-				}
-			}
-		}
-		return OK_STATUS;
-	}
-
-	public static IProject getProjectHandleFromProjectName(String projectName) {
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		IStatus status = workspace.validateName(projectName, IResource.PROJECT);
-		return (null != projectName && projectName.length() > 0 && status.isOK()) ? ResourcesPlugin.getWorkspace().getRoot().getProject(projectName) : null;
-	}
-
-	public static IStatus validateProjectName(String projectName) {
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		IStatus status = workspace.validateName(projectName, IResource.PROJECT);
-		if (!status.isOK())
-			return status;
-		if (projectName.endsWith(" ")) //$NON-NLS-1$
-			return WTPCommonPlugin.createErrorStatus(WTPResourceHandler.getString("41")); //$NON-NLS-1$
-		return OK_STATUS;
-	}
-
-	public static IStatus validateName(String name) {
-		IStatus status = validateProjectName(name);
-		if (!status.isOK())
-			return status;
-		IProject project = ProjectUtilities.getProject( name );
-		if (project.exists())
-			return WTPCommonPlugin.createErrorStatus(WTPCommonPlugin.getResourceString(WTPCommonMessages.PROJECT_EXISTS_ERROR, new Object[]{name}));
-
-		if (!WTPPlugin.isPlatformCaseSensitive()) {
-			// now look for a matching case variant in the tree
-			IResource variant = ((Resource) project).findExistingResourceVariant(project.getFullPath());
-			if (variant != null) {
-				return WTPCommonPlugin.createErrorStatus(WTPResourceHandler.getString("42")); //$NON-NLS-1$
-			}
-		}
-		return OK_STATUS;
-	}
-	
-
-	private IStatus validateLocation() {
-		String loc = (String) getProperty(PROJECT_LOCATION);
-		if (null != loc) {
-			IWorkspace workspace = ResourcesPlugin.getWorkspace();
-			IPath path = new Path(loc);
-			return workspace.validateProjectLocation(getProject(), path);
-		}
-		return OK_STATUS;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ProjectCreationOperation.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ProjectCreationOperation.java
deleted file mode 100644
index 654f5b0..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ProjectCreationOperation.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Oct 27, 2003
- * 
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal.operations;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-
-public class ProjectCreationOperation extends AbstractDataModelOperation implements IProjectCreationProperties {
-
-	public ProjectCreationOperation(IDataModel dataModel) {
-		super(dataModel);
-	}
-
-	public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-		try {
-			IProgressMonitor subMonitor = new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN);
-			IProjectDescription desc = (IProjectDescription) model.getProperty(PROJECT_DESCRIPTION);
-			IProject project = (IProject) model.getProperty(PROJECT);
-			if (!project.exists()) {
-				project.create(desc, subMonitor);
-			}
-			if (monitor.isCanceled())
-				throw new OperationCanceledException();
-			subMonitor = new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN);
-
-			project.open(subMonitor);
-
-			String[] natureIds = (String[]) model.getProperty(PROJECT_NATURES);
-			if (null != natureIds) {
-				desc = project.getDescription();
-				desc.setNatureIds(natureIds);
-				project.setDescription(desc, monitor);
-			}
-		} catch (CoreException e) {
-			Logger.getLogger().logError(e);
-		} finally {
-			monitor.done();
-		}
-		if (monitor.isCanceled())
-			throw new OperationCanceledException();
-		return OK_STATUS;
-	}
-
-	public boolean canUndo() {
-		return false;
-	}
-
-	public boolean canRedo() {
-		return false;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/package.html b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/package.html
deleted file mode 100644
index 65a58f5..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/package.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<html>
-<head>
-<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-<link rel="stylesheet" href="../../../../../..//apistyles.css" type="text/css">
-<title>wtp operation api overview</title>
-</head>
-<body>
-<p>The WTP Operation API allows clients to do...everything!</p>
-<table width="500">
-<tr>
-<td>
-<p>Under Construction.</p>
-</td>
-</tr>
-</table>
-<table cellpadding="10" cellspacing="10">
-<tr>
-<td>
-<p>
-<img src="escape_out_to_source_folder level/overview/your_image.jpg"></p>
-</td>
-</tr>
-<tr>
-<td>
-<p>
-<i>Figure 1: Image description</i>
-</p>
-</td>
-</tr>
-</table>
-</body>
-</html>
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/package.xml b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/package.xml
deleted file mode 100644
index 9d050d4..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/package.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?> 
-<html>
-    <head>
-        <meta
-            name="root"
-            content="../../../../../../" />
-        <title>wtp operation api overview</title>
-    </head>
-
-    <body>  
-        <abstract>The WTP Operation API allows clients to do...everything!</abstract>
-
-		<!-- formatting handled by XSLT Transformation -->
-		<p>Under Construction.</p>
-		<img src="escape_out_to_source_folder level/overview/your_image.jpg" caption ="Image description" />
-    </body>
-</html>    
-    
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/plugin/WTPCommonMessages.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/plugin/WTPCommonMessages.java
deleted file mode 100644
index 80f12da..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/plugin/WTPCommonMessages.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Nov 5, 2003
- *
- * To change the template for this generated file go to
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal.plugin;
-
-/**
- * @author DABERG
- * 
- * To change the template for this generated type comment go to Window>Preferences>Java>Code
- * Generation>Code and Comments
- */
-public class WTPCommonMessages {
-	public static final String PROJECT_EXISTS_ERROR = "1"; //$NON-NLS-1$
-	public static final String PROJECT_NOT_EAR = "2"; //$NON-NLS-1$
-	public static final String INCOMPATABLE_J2EE_VERSIONS = "3"; //$NON-NLS-1$
-	public static final String SAME_MODULE_AND_EAR_NAME = "4"; //$NON-NLS-1$
-	public static final String ARCHIVE_FILE_NAME_EMPTY_ERROR = "5"; //$NON-NLS-1$
-	public static final String FILE_DOES_NOT_EXIST_ERROR = "6"; //$NON-NLS-1$
-	public static final String INTERNAL_ERROR = "7"; //$NON-NLS-1$
-	public static final String PROJECT_NAME_INVALID = "8"; //$NON-NLS-1$
-	public static final String DESTINATION_ARCHIVE_SHOULD_END_WITH = "9"; //$NON-NLS-1$
-	public static final String DESTINATION_INVALID = "10"; //$NON-NLS-1$
-	public static final String IS_READ_ONLY = "11"; //$NON-NLS-1$
-	public static final String RESOURCE_EXISTS_ERROR = "12"; //$NON-NLS-1$
-	public static final String PROJECT_NOT_EXISTS_ERROR = "13"; //$NON-NLS-1$
-	public static final String SPEC_LEVEL_NOT_FOUND = "14"; //$NON-NLS-1$
-	public static final String PROJECT_NAME_EMPTY = "15"; //$NON-NLS-1$
-	public static final String PROJECT_ClOSED = "31"; //$NON-NLS-1$
-	public static final String PROJECT_EXISTS_AT_LOCATION_ERROR = "32"; //$NON-NLS-1$
-	public static final String ERR_EMPTY_MODULE_NAME = "34"; //$NON-NLS-1$
-	public static final String ERR_INVALID_CHARS = "35"; //$NON-NLS-1$ 
-	public static final String DUPLICATE_COMPONENT_NAME="36";//$NON-NLS-1$ 
-	public static final String MODULE_NOT_SUPPORTED="37";//$NON-NLS-1$ 
-    
-    public static final String MODULE_EXISTS_ERROR = "38"; //$NON-NLS-1$
-	public static final String SOURCEFOLDER_EMPTY = "39"; //$NON-NLS-1$
-	public static final String WEBCONTENTFOLDER_EMPTY = "40"; //$NON-NLS-1$
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/plugin/WTPCommonPlugin.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/plugin/WTPCommonPlugin.java
deleted file mode 100644
index 377e7f9..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/plugin/WTPCommonPlugin.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Oct 29, 2003
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.wst.common.frameworks.internal.plugin;
-
-import java.text.MessageFormat;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.wst.common.frameworks.internal.WTPPlugin;
-
-/**
- * @author jsholl
- * 
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public class WTPCommonPlugin extends WTPPlugin {
-
-	public static final String PLUGIN_ID = "org.eclipse.wst.common.frameworks"; //$NON-NLS-1$
-	public static final String GROUP_REGISTRY_EXTENSION_POINT = "functionGroup"; //$NON-NLS-1$
-	public static final IStatus OK_STATUS = new Status(IStatus.OK, PLUGIN_ID, 0, "OK", null); //$NON-NLS-1$
-
-	//	The shared instance.
-	private static WTPCommonPlugin plugin;
-
-	public WTPCommonPlugin() {
-		super();
-		plugin = this;
-		try {
-			resourceBundle = ResourceBundle.getBundle("wtp_common"); //$NON-NLS-1$
-		} catch (MissingResourceException x) {
-			resourceBundle = null;
-		}
-	}
-
-	public static WTPCommonPlugin getDefault() {
-		return plugin;
-	}
-
-	public static IWorkspace getWorkspace() {
-		return ResourcesPlugin.getWorkspace();
-	}
-
-	/**
-	 * @param string
-	 * @return
-	 */
-	public static IStatus createErrorStatus(String message) {
-		return createErrorStatus(message, null);
-	}
-
-	/**
-	 * @param string
-	 * @return
-	 */
-	public static IStatus createWarningStatus(String message) {
-		return createWarningStatus(message, null);
-	}
-
-	/**
-	 * @param string
-	 * @return
-	 */
-	public static IStatus createWarningStatus(String message, Throwable exception) {
-		return new Status(IStatus.WARNING, PLUGIN_ID, -1, message, exception);
-	}
-
-	/**
-	 * @param string
-	 * @return
-	 */
-	public static IStatus createErrorStatus(String message, Throwable exception) {
-		return new Status(IStatus.ERROR, PLUGIN_ID, -1, message, exception);
-	}
-
-	/**
-	 * Returns the string from the plugin's resource bundle, or 'key' if not found.
-	 */
-	public static String getResourceString(String key) {
-		ResourceBundle bundle = WTPCommonPlugin.getDefault().getResourceBundle();
-		try {
-			return (bundle != null ? bundle.getString(key) : key);
-		} catch (MissingResourceException e) {
-			return "!" + key + "!"; //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	public static String getResourceString(String key, Object[] args) {
-		String pattern = getResourceString(key);
-		if (pattern != null)
-			return MessageFormat.format(pattern, args);
-		return null;
-	}
-
-	/**
-	 * Returns the plugin's resource bundle,
-	 */
-	public ResourceBundle getResourceBundle() {
-		return resourceBundle;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.WTPPlugin#getPluginID()
-	 */
-	public String getPluginID() {
-		return PLUGIN_ID;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/wtp_common.properties b/plugins/org.eclipse.wst.common.frameworks/src/wtp_common.properties
deleted file mode 100644
index f6db565..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/wtp_common.properties
+++ /dev/null
@@ -1,52 +0,0 @@
-###############################################################################
-# Copyright (c) 2003, 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
-###############################################################################
-1=A project already exists with this name and location.
-2=The specified EAR project "{0}" is not an EAR project.
-3=The EAR project "{0}" has a J2EEVersion of {1} which is not compatable with the specified module version.
-4=The EAR project name, "{0}", can not be the same as the project name.
-5={0} file name must be entered.
-6=The {0} does not exist.
-7=An internal error occurred.  View log files for details.
-8=Project name is invalid.
-9=Destination archive should end with {0}.
-10=Destination archive is invalid.
-11=Destination location is read only.
-12=Resource {0} already exists. If you wish to overwrite select the "Overwrite Existing file" option.
-13=Project {0} does not exist.
-14=The selected version is not supported by the server.
-15=Enter a project name.
-16=Save problems
-17=Save could not be completed.  Some related files may have already been saved.\n\nReason
-18={0} has been locked. Please ensure the operation is not currently executing.
-19=The extendedRoot is null. Make sure that isExtended() returns true.
-20=Property not located:
-21=Nested model not located:
-22=Cannot modify id once it has been set.
-23=The id cannot be null.
-24=ERROR:
-25=Extended Operation failure: {0}
-26=The Job completed successfully
-27=Exception occurred running job.
-28=Group cannot be resolved:
-29=Class not found for attribute {0} : {1}, Declaring plugin extension: {2}
-30=Function group {0} contains no pattern bindings
-31=Project {0} is closed.
-32=A project already exists on the file system at this location: {0}.  Either use "Import Existing Projects into Workspace" to create a project at this location or delete the contents of {0} from the file system.
-33=A model instance may only be nested once under another model instance.
-34=Module name cannot be empty.
-35=Invalid characters.
-36=The module with this name already exists.
-37=The module is not supported by this server.
-38=Module name is invalid.
-39=Enter Source Folder
-40=Enter Web content Folder
-41=Project names cannot end with white space.
-42=Resource already exists with a different case.
diff --git a/plugins/org.eclipse.wst.common.modulecore/.classpath b/plugins/org.eclipse.wst.common.modulecore/.classpath
deleted file mode 100644
index 48c8e15..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="modulecore-src/"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/plugins/org.eclipse.wst.common.modulecore/.cvsignore b/plugins/org.eclipse.wst.common.modulecore/.cvsignore
deleted file mode 100644
index 475f127..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/.cvsignore
+++ /dev/null
@@ -1,7 +0,0 @@
-bin
-temp.folder
-build.xml
-modulecore.jar
-doc
-@dot
-src.zip
diff --git a/plugins/org.eclipse.wst.common.modulecore/.options b/plugins/org.eclipse.wst.common.modulecore/.options
deleted file mode 100644
index c56819a..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/.options
+++ /dev/null
@@ -1 +0,0 @@
-org.eclipse.wst.common.modulecore/ComponentResolver=true
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.modulecore/.project b/plugins/org.eclipse.wst.common.modulecore/.project
deleted file mode 100644
index 8cdcd11..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.common.modulecore</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/plugins/org.eclipse.wst.common.modulecore/.settings/org.eclipse.core.resources.prefs b/plugins/org.eclipse.wst.common.modulecore/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index a2fa4f5..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Fri Dec 02 14:54:59 EST 2005
-eclipse.preferences.version=1
-encoding//schema/componentCore.xsd=UTF8
diff --git a/plugins/org.eclipse.wst.common.modulecore/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.common.modulecore/META-INF/MANIFEST.MF
deleted file mode 100644
index ba7acb1..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,31 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Modulecore Plug-in
-Bundle-Vendor: %provider
-Bundle-SymbolicName: org.eclipse.wst.common.modulecore; singleton:=true
-Bundle-Version: 1.0.1.qualifier
-Bundle-Activator: org.eclipse.wst.common.componentcore.internal.ModulecorePlugin
-Bundle-Localization: plugin
-Export-Package: org.eclipse.wst.common.componentcore,
- org.eclipse.wst.common.componentcore.datamodel,
- org.eclipse.wst.common.componentcore.datamodel.properties,
- org.eclipse.wst.common.componentcore.internal,
- org.eclipse.wst.common.componentcore.internal.builder,
- org.eclipse.wst.common.componentcore.internal.impl,
- org.eclipse.wst.common.componentcore.internal.operation,
- org.eclipse.wst.common.componentcore.internal.resources,
- org.eclipse.wst.common.componentcore.internal.util,
- org.eclipse.wst.common.componentcore.resources
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.wst.common.frameworks,
- org.eclipse.core.resources,
- org.eclipse.emf.ecore,
- org.eclipse.wst.common.emfworkbench.integration,
- org.eclipse.wst.common.emf,
- org.eclipse.emf.ecore.xmi,
- org.eclipse.core.commands,
- org.eclipse.emf.edit,
- org.eclipse.jem.util,
- org.eclipse.wst.common.uriresolver,
- org.eclipse.wst.common.project.facet.core
-Eclipse-AutoStart: true
diff --git a/plugins/org.eclipse.wst.common.modulecore/about.html b/plugins/org.eclipse.wst.common.modulecore/about.html
deleted file mode 100644
index 6f6b96c..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/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>February 24, 2005</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/plugins/org.eclipse.wst.common.modulecore/build.properties b/plugins/org.eclipse.wst.common.modulecore/build.properties
deleted file mode 100644
index e225d3f..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/build.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-###############################################################################
-# Copyright (c) 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
-###############################################################################
-source.. = modulecore-src/
-output.. = bin/
-bin.includes = plugin.xml,\
-               .,\
-               META-INF/,\
-               plugin.properties,\
-               about.html,\
-               schema/
-src.includes = component.xml
diff --git a/plugins/org.eclipse.wst.common.modulecore/component.xml b/plugins/org.eclipse.wst.common.modulecore/component.xml
deleted file mode 100644
index 48daa95..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/component.xml
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><component  xmlns="http://eclipse.org/wtp/releng/tools/component-model" name="org.eclipse.wst.common.componentcore"><component-depends unrestricted="true"></component-depends><plugin id="org.eclipse.wst.common.modulecore" fragment="false"/></component>
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.modulecore/javadoc-images/componentCore.xsd b/plugins/org.eclipse.wst.common.modulecore/javadoc-images/componentCore.xsd
deleted file mode 100644
index a2d8828..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/javadoc-images/componentCore.xsd
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.eclipse.org/webtools/moduleCore" xmlns:tns="http://www.eclipse.org/webtools/moduleCore">
-	<element name="project-modules">
-		<complexType>
-			<sequence minOccurs="1" maxOccurs="unbounded">
-				<element name="wb-module">
-					<complexType>
-                        <sequence minOccurs="0" maxOccurs="1">
-                        	<element name="module-type">
-                        		<complexType>
-                        			<attribute name="module-type-id"
-                        				type="string">
-                        			</attribute>
-                        		</complexType>
-                        	</element>
-                        	<sequence minOccurs="0" maxOccurs="unbounded">
-                        		<element name="wb-resource">
-                                    <complexType>
-                                    	<attribute name="source-path"
-                                    		type="string" use="required">
-                                    	</attribute>
-                                    	<attribute name="deploy-path"
-                                    		type="string" use="required">
-                                    	</attribute>
-                                    </complexType>
-                        		</element>
-                        	</sequence>
-                        	<sequence minOccurs="0" maxOccurs="unbounded">
-                        		<element name="dependent-module">
-                                    <complexType>
-                                    	<attribute name="handle"
-                                    		type="string" use="required">
-                                    	</attribute>
-                                    	<attribute name="deploy-path"
-                                    		type="string" use="required">
-                                    	</attribute>
-                                    	<attribute name="dependency-type"
-                                    		type="string">
-                                    	</attribute>
-                                    </complexType>
-                        		</element>
-                        	</sequence>
-                        </sequence>
-                        <attribute name="deploy-name" type="string" use="required"></attribute>
-					</complexType>
-				</element>
-			</sequence>
-			<attribute name="id" type="string"></attribute>
-		</complexType>
-	</element>
-
-</schema>
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.modulecore/javadoc-images/componentcore_model.jpg b/plugins/org.eclipse.wst.common.modulecore/javadoc-images/componentcore_model.jpg
deleted file mode 100644
index b48d673..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/javadoc-images/componentcore_model.jpg
+++ /dev/null
Binary files differ
diff --git a/plugins/org.eclipse.wst.common.modulecore/javadoc-images/componentcore_package.jpg b/plugins/org.eclipse.wst.common.modulecore/javadoc-images/componentcore_package.jpg
deleted file mode 100644
index b1c04b6..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/javadoc-images/componentcore_package.jpg
+++ /dev/null
Binary files differ
diff --git a/plugins/org.eclipse.wst.common.modulecore/javadoc-images/mapping.jpg b/plugins/org.eclipse.wst.common.modulecore/javadoc-images/mapping.jpg
deleted file mode 100644
index 6df6e50..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/javadoc-images/mapping.jpg
+++ /dev/null
Binary files differ
diff --git a/plugins/org.eclipse.wst.common.modulecore/javadoc-images/metamodel_components.jpg b/plugins/org.eclipse.wst.common.modulecore/javadoc-images/metamodel_components.jpg
deleted file mode 100644
index 68cb831..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/javadoc-images/metamodel_components.jpg
+++ /dev/null
Binary files differ
diff --git a/plugins/org.eclipse.wst.common.modulecore/javadoc-images/module_structural_model.jpg b/plugins/org.eclipse.wst.common.modulecore/javadoc-images/module_structural_model.jpg
deleted file mode 100644
index c2fe295..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/javadoc-images/module_structural_model.jpg
+++ /dev/null
Binary files differ
diff --git a/plugins/org.eclipse.wst.common.modulecore/javadoc-images/modulecore.jpg b/plugins/org.eclipse.wst.common.modulecore/javadoc-images/modulecore.jpg
deleted file mode 100644
index e45a99a..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/javadoc-images/modulecore.jpg
+++ /dev/null
Binary files differ
diff --git a/plugins/org.eclipse.wst.common.modulecore/javadoc-images/virtual_path_api.jpg b/plugins/org.eclipse.wst.common.modulecore/javadoc-images/virtual_path_api.jpg
deleted file mode 100644
index 5da3e99..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/javadoc-images/virtual_path_api.jpg
+++ /dev/null
Binary files differ
diff --git a/plugins/org.eclipse.wst.common.modulecore/model/Java.epx b/plugins/org.eclipse.wst.common.modulecore/model/Java.epx
deleted file mode 100644
index d2fd1cf..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/model/Java.epx
+++ /dev/null
@@ -1,6127 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--xtools2_universal_type_manager-->
-<uml:Profile xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:uml="http://www.eclipse.org/uml2/1.0.0/UML" xmi:id="_-ZoywJSkEdmjauSjG8qO2A" name="Java" metamodelReference="_-ZoywZSkEdmjauSjG8qO2A">
-  <eAnnotations xmi:id="_-ZoyxJSkEdmjauSjG8qO2A" source="roseProperties">
-    <details xmi:id="_-ZoyxZSkEdmjauSjG8qO2A" key="propertyId" value="809135966"/>
-  </eAnnotations>
-  <eAnnotations xmi:id="_-asi1ZSkEdmjauSjG8qO2A" source="attributes">
-    <details xmi:id="_-asi1pSkEdmjauSjG8qO2A" key="version" value="0"/>
-  </eAnnotations>
-  <eAnnotations xmi:id="_-asi15SkEdmjauSjG8qO2A" source="ePackages">
-    <contents xmi:type="ecore:EPackage" xmi:id="_-a4v8JSkEdmjauSjG8qO2A" name="Java_0" nsURI="http:///_-asi2JSkEdmjauSjG8qO2A.profile.uml2" nsPrefix="Java_0">
-      <eClassifiers xmi:type="ecore:EClass" xmi:id="_-a4v8ZSkEdmjauSjG8qO2A" name="Java__default__ModuleSpec">
-        <eAnnotations xmi:id="_-a4v8pSkEdmjauSjG8qO2A" source="stereotype" references="_-asix5SkEdmjauSjG8qO2A"/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4v85SkEdmjauSjG8qO2A" name="CmIdentification" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4v9JSkEdmjauSjG8qO2A" name="CopyrightNotice" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EClass" xmi:id="_-a4v9ZSkEdmjauSjG8qO2A" name="Java__default__Project">
-        <eAnnotations xmi:id="_-a4v9pSkEdmjauSjG8qO2A" source="stereotype" references="_-aB0mZSkEdmjauSjG8qO2A"/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4v95SkEdmjauSjG8qO2A" name="UserDefineTagApply3" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4v-JSkEdmjauSjG8qO2A" name="JavadocSince" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4v-ZSkEdmjauSjG8qO2A" name="GlobalImports" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4v-pSkEdmjauSjG8qO2A" name="GenerateDefaultReturnLine" lowerBound="1" defaultValueLiteral="true">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4v-5SkEdmjauSjG8qO2A" name="InstanceVariablePrefix" lowerBound="1" defaultValueLiteral="m_">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4v_JSkEdmjauSjG8qO2A" name="ShowCodegenDlg" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4v_ZSkEdmjauSjG8qO2A" name="NoClassCustomDlg" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4v_pSkEdmjauSjG8qO2A" name="SCCProjectName" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4v_5SkEdmjauSjG8qO2A" name="UseTabs" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wAJSkEdmjauSjG8qO2A" name="DefaultAttributeDataType" lowerBound="1" defaultValueLiteral="int">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wAZSkEdmjauSjG8qO2A" name="LocalPrefix" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wApSkEdmjauSjG8qO2A" name="UserDefineJavaDocTags" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wA5SkEdmjauSjG8qO2A" name="LocalHomeSuffix" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wBJSkEdmjauSjG8qO2A" name="UserDefineTagText2" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wBZSkEdmjauSjG8qO2A" name="HomeSuffix" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wBpSkEdmjauSjG8qO2A" name="VAJavaWorkingFolder" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wB5SkEdmjauSjG8qO2A" name="DefaultEJBVersion" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wCJSkEdmjauSjG8qO2A" name="MaxNumChars" lowerBound="1" defaultValueLiteral="80">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wCZSkEdmjauSjG8qO2A" name="UserDefineTagName2" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wCpSkEdmjauSjG8qO2A" name="ServletDTDLocation" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wC5SkEdmjauSjG8qO2A" name="UserDefineTagApply1" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wDJSkEdmjauSjG8qO2A" name="GenerateRoseID" lowerBound="1" defaultValueLiteral="true">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wDZSkEdmjauSjG8qO2A" name="StopOnError" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wDpSkEdmjauSjG8qO2A" name="JavadocVersion" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wD5SkEdmjauSjG8qO2A" name="JavadocDefaultAuthor" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wEJSkEdmjauSjG8qO2A" name="OpenBraceMethodStyle" lowerBound="1" defaultValueLiteral="true">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wEZSkEdmjauSjG8qO2A" name="AsteriskCommentStyle" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wEpSkEdmjauSjG8qO2A" name="PrimaryKeySuffix" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wE5SkEdmjauSjG8qO2A" name="Editor" lowerBound="1" eType="_-a4wO5SkEdmjauSjG8qO2A" defaultValueLiteral="BuiltIn"/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wFJSkEdmjauSjG8qO2A" name="UserDefineTagApply2" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wFZSkEdmjauSjG8qO2A" name="GenerateDefaultJ2EEJavadoc" lowerBound="1" defaultValueLiteral="true">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wFpSkEdmjauSjG8qO2A" name="SpacingItems" lowerBound="1" defaultValueLiteral="3">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wF5SkEdmjauSjG8qO2A" name="EJBDTDLocation" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wGJSkEdmjauSjG8qO2A" name="CreateMissingDirectories" lowerBound="1" defaultValueLiteral="true">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wGZSkEdmjauSjG8qO2A" name="UserDefineTagText3" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wGpSkEdmjauSjG8qO2A" name="RemoteSuffix" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wG5SkEdmjauSjG8qO2A" name="ReferenceClasspath" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wHJSkEdmjauSjG8qO2A" name="OpenBraceClassStyle" lowerBound="1" defaultValueLiteral="true">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wHZSkEdmjauSjG8qO2A" name="LocalSuffix" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wHpSkEdmjauSjG8qO2A" name="VM" lowerBound="1" eType="_-a4wQJSkEdmjauSjG8qO2A" defaultValueLiteral="Sun"/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wH5SkEdmjauSjG8qO2A" name="DefaultServletVersion" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wIJSkEdmjauSjG8qO2A" name="UsePrefixes" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wIZSkEdmjauSjG8qO2A" name="BeanSuffix" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wIpSkEdmjauSjG8qO2A" name="BeanPrefix" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wI5SkEdmjauSjG8qO2A" name="SCCComment" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wJJSkEdmjauSjG8qO2A" name="RootDir" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wJZSkEdmjauSjG8qO2A" name="UserDefineTagText1" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wJpSkEdmjauSjG8qO2A" name="UserDefineTagName1" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wJ5SkEdmjauSjG8qO2A" name="AutoSync" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wKJSkEdmjauSjG8qO2A" name="JavadocAuthor" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wKZSkEdmjauSjG8qO2A" name="RoseDefaultCommentStyle" lowerBound="1" defaultValueLiteral="true">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wKpSkEdmjauSjG8qO2A" name="SCCProjectSourceRoot" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wK5SkEdmjauSjG8qO2A" name="JavaCommentStyle" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wLJSkEdmjauSjG8qO2A" name="DefaultOperationReturnType" lowerBound="1" defaultValueLiteral="void">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wLZSkEdmjauSjG8qO2A" name="UserDefineTagName3" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wLpSkEdmjauSjG8qO2A" name="JavadocDefaultVersion" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wL5SkEdmjauSjG8qO2A" name="NotShowRoseIDDlg" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wMJSkEdmjauSjG8qO2A" name="RemotePrefix" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wMZSkEdmjauSjG8qO2A" name="UseSpaces" lowerBound="1" defaultValueLiteral="true">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wMpSkEdmjauSjG8qO2A" name="ClassVariablePrefix" lowerBound="1" defaultValueLiteral="s_">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wM5SkEdmjauSjG8qO2A" name="JavadocDefaultSince" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wNJSkEdmjauSjG8qO2A" name="SCCSelected" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wNZSkEdmjauSjG8qO2A" name="HomePrefix" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wNpSkEdmjauSjG8qO2A" name="LocalHomePrefix" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wN5SkEdmjauSjG8qO2A" name="ClassPath" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wOJSkEdmjauSjG8qO2A" name="SourceControl" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wOZSkEdmjauSjG8qO2A" name="JavadocNumAsterisks" lowerBound="1" defaultValueLiteral="0">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wOpSkEdmjauSjG8qO2A" name="PrimaryKeyPrefix" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EEnum" xmi:id="_-a4wO5SkEdmjauSjG8qO2A" name="Java__default__ProjectEditorType">
-        <eLiterals xmi:id="_-a4wPJSkEdmjauSjG8qO2A" name="BuiltIn">
-          <eAnnotations xmi:id="_-a4wPZSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-aH685SkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4wPpSkEdmjauSjG8qO2A" name="WindowsShell" value="1">
-          <eAnnotations xmi:id="_-a4wP5SkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-aH69pSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EEnum" xmi:id="_-a4wQJSkEdmjauSjG8qO2A" name="Java__default__ProjectVMType">
-        <eLiterals xmi:id="_-a4wQZSkEdmjauSjG8qO2A" name="Sun">
-          <eAnnotations xmi:id="_-a4wQpSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-aB0pJSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4wQ5SkEdmjauSjG8qO2A" name="Microsoft" value="1">
-          <eAnnotations xmi:id="_-a4wRJSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-aB0p5SkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4wRZSkEdmjauSjG8qO2A" name="IBM" value="2">
-          <eAnnotations xmi:id="_-a4wRpSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-aB0qpSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EClass" xmi:id="_-a4wR5SkEdmjauSjG8qO2A" name="Java__default__Class">
-        <eAnnotations xmi:id="_-a4wSJSkEdmjauSjG8qO2A" source="stereotype" references="_-Z1nbZSkEdmjauSjG8qO2A"/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wSZSkEdmjauSjG8qO2A" name="EJBNameInJAR" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wSpSkEdmjauSjG8qO2A" name="ServletgetInfo" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wS5SkEdmjauSjG8qO2A" name="GenerateInstanceInitializer" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wTJSkEdmjauSjG8qO2A" name="Final" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wTZSkEdmjauSjG8qO2A" name="ServletIntHeader" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wTpSkEdmjauSjG8qO2A" name="GenerateStaticInitializer" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wT5SkEdmjauSjG8qO2A" name="EJBCmpField" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wUJSkEdmjauSjG8qO2A" name="MethodForHeaders" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wUZSkEdmjauSjG8qO2A" name="ServletContentType" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wUpSkEdmjauSjG8qO2A" name="Static" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wU5SkEdmjauSjG8qO2A" name="MethodForRequestAttributes" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wVJSkEdmjauSjG8qO2A" name="ServletSecurityRoles" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wVZSkEdmjauSjG8qO2A" name="ServletInitParameter" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wVpSkEdmjauSjG8qO2A" name="DispatcherForward" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wV5SkEdmjauSjG8qO2A" name="ServletRequestParameterNames" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wWJSkEdmjauSjG8qO2A" name="ServletCookie" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wWZSkEdmjauSjG8qO2A" name="EJBReferences" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wWpSkEdmjauSjG8qO2A" name="ServletContextRef" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wW5SkEdmjauSjG8qO2A" name="GenerateDefaultConstructor" lowerBound="1" defaultValueLiteral="true">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wXJSkEdmjauSjG8qO2A" name="ServletIsSecure" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wXZSkEdmjauSjG8qO2A" name="GenerateFinalizer" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wXpSkEdmjauSjG8qO2A" name="EJBSessionType" lowerBound="1" eType="_-a4wf5SkEdmjauSjG8qO2A" defaultValueLiteral=""/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wX5SkEdmjauSjG8qO2A" name="ServletInitParameterNames" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wYJSkEdmjauSjG8qO2A" name="DisableAutoSync" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wYZSkEdmjauSjG8qO2A" name="BMP_Extend_CMP" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wYpSkEdmjauSjG8qO2A" name="EJBTransactionType" lowerBound="1" eType="_-a4whpSkEdmjauSjG8qO2A" defaultValueLiteral="Container"/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wY5SkEdmjauSjG8qO2A" name="DispatcherInclude" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wZJSkEdmjauSjG8qO2A" name="ServletXMLFilePath" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wZZSkEdmjauSjG8qO2A" name="ServletHeader" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wZpSkEdmjauSjG8qO2A" name="ServletDateHeader" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wZ5SkEdmjauSjG8qO2A" name="Strictfp" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4waJSkEdmjauSjG8qO2A" name="EJBSessionSync" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4waZSkEdmjauSjG8qO2A" name="EJBSecurityRoles" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wapSkEdmjauSjG8qO2A" name="IsSingleThread" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wa5SkEdmjauSjG8qO2A" name="ServletRequestAttributesNames" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wbJSkEdmjauSjG8qO2A" name="ServletRequestDispatcherPath" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wbZSkEdmjauSjG8qO2A" name="ServletHeaderNames" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wbpSkEdmjauSjG8qO2A" name="MethodForCookie" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wb5SkEdmjauSjG8qO2A" name="EJBVersion" lowerBound="1" eType="_-a4wi5SkEdmjauSjG8qO2A" defaultValueLiteral="2.0"/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wcJSkEdmjauSjG8qO2A" name="EJBPersistenceType" lowerBound="1" eType="_-a4wkJSkEdmjauSjG8qO2A" defaultValueLiteral=""/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wcZSkEdmjauSjG8qO2A" name="ConstructorIs" lowerBound="1" eType="_-a4wl5SkEdmjauSjG8qO2A" defaultValueLiteral="public"/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wcpSkEdmjauSjG8qO2A" name="ReadOnly" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wc5SkEdmjauSjG8qO2A" name="Generate_XML_DD" lowerBound="1" defaultValueLiteral="true">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wdJSkEdmjauSjG8qO2A" name="ServletName" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wdZSkEdmjauSjG8qO2A" name="EJBXMLFilePath" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wdpSkEdmjauSjG8qO2A" name="EJBCnxFactory" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wd5SkEdmjauSjG8qO2A" name="ServletRequestDispatcher" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4weJSkEdmjauSjG8qO2A" name="EJBReentrant" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4weZSkEdmjauSjG8qO2A" name="MethodForRequestParameters" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wepSkEdmjauSjG8qO2A" name="EJBEnvironmentProperties" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4we5SkEdmjauSjG8qO2A" name="GenerateCode" lowerBound="1" defaultValueLiteral="true">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wfJSkEdmjauSjG8qO2A" name="ServletRequestParameter" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wfZSkEdmjauSjG8qO2A" name="GenerateHTML" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wfpSkEdmjauSjG8qO2A" name="ServletRequestAttribute" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EEnum" xmi:id="_-a4wf5SkEdmjauSjG8qO2A" name="Java__default__ClassEJBSessionType_Set">
-        <eLiterals xmi:id="_-a4wgJSkEdmjauSjG8qO2A" name="">
-          <eAnnotations xmi:id="_-a4wgZSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Z7tw5SkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4wgpSkEdmjauSjG8qO2A" name="Stateless" value="1">
-          <eAnnotations xmi:id="_-a4wg5SkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Z7txpSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4whJSkEdmjauSjG8qO2A" name="Stateful" value="2">
-          <eAnnotations xmi:id="_-a4whZSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Z7tyZSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EEnum" xmi:id="_-a4whpSkEdmjauSjG8qO2A" name="Java__default__ClassEJBTransactionType_Set">
-        <eLiterals xmi:id="_-a4wh5SkEdmjauSjG8qO2A" name="Container">
-          <eAnnotations xmi:id="_-a4wiJSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Z7t5JSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4wiZSkEdmjauSjG8qO2A" name="Bean" value="1">
-          <eAnnotations xmi:id="_-a4wipSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Z7t55SkEdmjauSjG8qO2A"/>
-        </eLiterals>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EEnum" xmi:id="_-a4wi5SkEdmjauSjG8qO2A" name="Java__default__ClassEJBVersion_Set">
-        <eLiterals xmi:id="_-a4wjJSkEdmjauSjG8qO2A" name="2.0">
-          <eAnnotations xmi:id="_-a4wjZSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Z7t65SkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4wjpSkEdmjauSjG8qO2A" name="1.x" value="1">
-          <eAnnotations xmi:id="_-a4wj5SkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Z7t7pSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EEnum" xmi:id="_-a4wkJSkEdmjauSjG8qO2A" name="Java__default__ClassEJBPersistenceType_Set">
-        <eLiterals xmi:id="_-a4wkZSkEdmjauSjG8qO2A" name="">
-          <eAnnotations xmi:id="_-a4wkpSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Z7tzZSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4wk5SkEdmjauSjG8qO2A" name="Bean" value="1">
-          <eAnnotations xmi:id="_-a4wlJSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Z7t0JSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4wlZSkEdmjauSjG8qO2A" name="Container" value="2">
-          <eAnnotations xmi:id="_-a4wlpSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Z7t05SkEdmjauSjG8qO2A"/>
-        </eLiterals>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EEnum" xmi:id="_-a4wl5SkEdmjauSjG8qO2A" name="Java__default__ClassCtor_Set">
-        <eLiterals xmi:id="_-a4wmJSkEdmjauSjG8qO2A" name="public">
-          <eAnnotations xmi:id="_-a4wmZSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Z7t15SkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4wmpSkEdmjauSjG8qO2A" name="protected" value="1">
-          <eAnnotations xmi:id="_-a4wm5SkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Z7t2pSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4wnJSkEdmjauSjG8qO2A" name="private" value="2">
-          <eAnnotations xmi:id="_-a4wnZSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Z7t3ZSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4wnpSkEdmjauSjG8qO2A" name="package" value="3">
-          <eAnnotations xmi:id="_-a4wn5SkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Z7t4JSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EClass" xmi:id="_-a4woJSkEdmjauSjG8qO2A" name="Java__default__ModuleBody">
-        <eAnnotations xmi:id="_-a4woZSkEdmjauSjG8qO2A" source="stereotype" references="_-ZoyxpSkEdmjauSjG8qO2A"/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wopSkEdmjauSjG8qO2A" name="CmIdentification" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wo5SkEdmjauSjG8qO2A" name="CopyrightNotice" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EClass" xmi:id="_-a4wpJSkEdmjauSjG8qO2A" name="Java__default__Operation">
-        <eAnnotations xmi:id="_-a4wpZSkEdmjauSjG8qO2A" source="stereotype" references="_-aaO7pSkEdmjauSjG8qO2A"/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wppSkEdmjauSjG8qO2A" name="ReplaceExistingCode" lowerBound="1" defaultValueLiteral="true">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wp5SkEdmjauSjG8qO2A" name="Final" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wqJSkEdmjauSjG8qO2A" name="GenerateFullyQualifiedReturn" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wqZSkEdmjauSjG8qO2A" name="Strictfp" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wqpSkEdmjauSjG8qO2A" name="Native" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wq5SkEdmjauSjG8qO2A" name="Abstract" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wrJSkEdmjauSjG8qO2A" name="Synchronized" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wrZSkEdmjauSjG8qO2A" name="Static" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EClass" xmi:id="_-a4wrpSkEdmjauSjG8qO2A" name="Java__Default_EJB__Class">
-        <eAnnotations xmi:id="_-a4wr5SkEdmjauSjG8qO2A" source="stereotype" references="_-aOBo5SkEdmjauSjG8qO2A"/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wsJSkEdmjauSjG8qO2A" name="EJBNameInJAR" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wsZSkEdmjauSjG8qO2A" name="GenerateInstanceInitializer" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wspSkEdmjauSjG8qO2A" name="ServletgetInfo" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4ws5SkEdmjauSjG8qO2A" name="Final" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wtJSkEdmjauSjG8qO2A" name="ServletIntHeader" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wtZSkEdmjauSjG8qO2A" name="GenerateStaticInitializer" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wtpSkEdmjauSjG8qO2A" name="EJBCmpField" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wt5SkEdmjauSjG8qO2A" name="MethodForHeaders" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wuJSkEdmjauSjG8qO2A" name="ServletContentType" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wuZSkEdmjauSjG8qO2A" name="Static" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wupSkEdmjauSjG8qO2A" name="MethodForRequestAttributes" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wu5SkEdmjauSjG8qO2A" name="ServletSecurityRoles" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wvJSkEdmjauSjG8qO2A" name="ServletInitParameter" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wvZSkEdmjauSjG8qO2A" name="DispatcherForward" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wvpSkEdmjauSjG8qO2A" name="ServletRequestParameterNames" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wv5SkEdmjauSjG8qO2A" name="ServletCookie" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wwJSkEdmjauSjG8qO2A" name="EJBReferences" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wwZSkEdmjauSjG8qO2A" name="ServletContextRef" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wwpSkEdmjauSjG8qO2A" name="GenerateDefaultConstructor" lowerBound="1" defaultValueLiteral="true">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4ww5SkEdmjauSjG8qO2A" name="ServletIsSecure" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wxJSkEdmjauSjG8qO2A" name="GenerateFinalizer" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wxZSkEdmjauSjG8qO2A" name="EJBSessionType" lowerBound="1" eType="_-a4w5pSkEdmjauSjG8qO2A" defaultValueLiteral=""/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wxpSkEdmjauSjG8qO2A" name="DisableAutoSync" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wx5SkEdmjauSjG8qO2A" name="ServletInitParameterNames" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wyJSkEdmjauSjG8qO2A" name="BMP_Extend_CMP" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wyZSkEdmjauSjG8qO2A" name="EJBTransactionType" lowerBound="1" eType="_-a4w7ZSkEdmjauSjG8qO2A" defaultValueLiteral="Container"/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wypSkEdmjauSjG8qO2A" name="DispatcherInclude" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wy5SkEdmjauSjG8qO2A" name="ServletXMLFilePath" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wzJSkEdmjauSjG8qO2A" name="ServletHeader" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wzZSkEdmjauSjG8qO2A" name="ServletDateHeader" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wzpSkEdmjauSjG8qO2A" name="Strictfp" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4wz5SkEdmjauSjG8qO2A" name="EJBSessionSync" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4w0JSkEdmjauSjG8qO2A" name="EJBSecurityRoles" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4w0ZSkEdmjauSjG8qO2A" name="IsSingleThread" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4w0pSkEdmjauSjG8qO2A" name="ServletRequestDispatcherPath" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4w05SkEdmjauSjG8qO2A" name="ServletRequestAttributesNames" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4w1JSkEdmjauSjG8qO2A" name="ServletHeaderNames" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4w1ZSkEdmjauSjG8qO2A" name="MethodForCookie" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4w1pSkEdmjauSjG8qO2A" name="EJBVersion" lowerBound="1" eType="_-a4w8pSkEdmjauSjG8qO2A" defaultValueLiteral="2.0"/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4w15SkEdmjauSjG8qO2A" name="EJBPersistenceType" lowerBound="1" eType="_-a4w95SkEdmjauSjG8qO2A" defaultValueLiteral=""/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4w2JSkEdmjauSjG8qO2A" name="ConstructorIs" lowerBound="1" eType="_-a4w_pSkEdmjauSjG8qO2A" defaultValueLiteral="public"/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4w2ZSkEdmjauSjG8qO2A" name="ReadOnly" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4w2pSkEdmjauSjG8qO2A" name="Generate_XML_DD" lowerBound="1" defaultValueLiteral="true">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4w25SkEdmjauSjG8qO2A" name="ServletName" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4w3JSkEdmjauSjG8qO2A" name="EJBXMLFilePath" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4w3ZSkEdmjauSjG8qO2A" name="EJBCnxFactory" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4w3pSkEdmjauSjG8qO2A" name="ServletRequestDispatcher" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4w35SkEdmjauSjG8qO2A" name="EJBReentrant" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4w4JSkEdmjauSjG8qO2A" name="MethodForRequestParameters" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4w4ZSkEdmjauSjG8qO2A" name="EJBEnvironmentProperties" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4w4pSkEdmjauSjG8qO2A" name="GenerateCode" lowerBound="1" defaultValueLiteral="true">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4w45SkEdmjauSjG8qO2A" name="ServletRequestParameter" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4w5JSkEdmjauSjG8qO2A" name="GenerateHTML" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4w5ZSkEdmjauSjG8qO2A" name="ServletRequestAttribute" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EEnum" xmi:id="_-a4w5pSkEdmjauSjG8qO2A" name="Java__Default_EJB__ClassEJBSessionType_Set">
-        <eLiterals xmi:id="_-a4w55SkEdmjauSjG8qO2A" name="">
-          <eAnnotations xmi:id="_-a4w6JSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-aOBwpSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4w6ZSkEdmjauSjG8qO2A" name="Stateless" value="1">
-          <eAnnotations xmi:id="_-a4w6pSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-aOBxZSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4w65SkEdmjauSjG8qO2A" name="Stateful" value="2">
-          <eAnnotations xmi:id="_-a4w7JSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-aOByJSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EEnum" xmi:id="_-a4w7ZSkEdmjauSjG8qO2A" name="Java__Default_EJB__ClassEJBTransactionType_Set">
-        <eLiterals xmi:id="_-a4w7pSkEdmjauSjG8qO2A" name="Container">
-          <eAnnotations xmi:id="_-a4w75SkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-aOB45SkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4w8JSkEdmjauSjG8qO2A" name="Bean" value="1">
-          <eAnnotations xmi:id="_-a4w8ZSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-aOB5pSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EEnum" xmi:id="_-a4w8pSkEdmjauSjG8qO2A" name="Java__Default_EJB__ClassEJBVersion_Set">
-        <eLiterals xmi:id="_-a4w85SkEdmjauSjG8qO2A" name="2.0">
-          <eAnnotations xmi:id="_-a4w9JSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-aOB6pSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4w9ZSkEdmjauSjG8qO2A" name="1.x" value="1">
-          <eAnnotations xmi:id="_-a4w9pSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-aOB7ZSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EEnum" xmi:id="_-a4w95SkEdmjauSjG8qO2A" name="Java__Default_EJB__ClassEJBPersistenceType_Set">
-        <eLiterals xmi:id="_-a4w-JSkEdmjauSjG8qO2A" name="">
-          <eAnnotations xmi:id="_-a4w-ZSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-aOB2ZSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4w-pSkEdmjauSjG8qO2A" name="Bean" value="1">
-          <eAnnotations xmi:id="_-a4w-5SkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-aOB3JSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4w_JSkEdmjauSjG8qO2A" name="Container" value="2">
-          <eAnnotations xmi:id="_-a4w_ZSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-aOB35SkEdmjauSjG8qO2A"/>
-        </eLiterals>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EEnum" xmi:id="_-a4w_pSkEdmjauSjG8qO2A" name="Java__Default_EJB__ClassCtor_Set">
-        <eLiterals xmi:id="_-a4w_5SkEdmjauSjG8qO2A" name="public">
-          <eAnnotations xmi:id="_-a4xAJSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-aOBzJSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4xAZSkEdmjauSjG8qO2A" name="protected" value="1">
-          <eAnnotations xmi:id="_-a4xApSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-aOBz5SkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4xA5SkEdmjauSjG8qO2A" name="private" value="2">
-          <eAnnotations xmi:id="_-a4xBJSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-aOB0pSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4xBZSkEdmjauSjG8qO2A" name="package" value="3">
-          <eAnnotations xmi:id="_-a4xBpSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-aOB1ZSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EClass" xmi:id="_-a4xB5SkEdmjauSjG8qO2A" name="Java__Http_Servlet__Class">
-        <eAnnotations xmi:id="_-a4xCJSkEdmjauSjG8qO2A" source="stereotype" references="_-agVhpSkEdmjauSjG8qO2A"/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xCZSkEdmjauSjG8qO2A" name="EJBNameInJAR" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xCpSkEdmjauSjG8qO2A" name="GenerateInstanceInitializer" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xC5SkEdmjauSjG8qO2A" name="ServletgetInfo" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xDJSkEdmjauSjG8qO2A" name="Final" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xDZSkEdmjauSjG8qO2A" name="ServletIntHeader" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xDpSkEdmjauSjG8qO2A" name="GenerateStaticInitializer" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xD5SkEdmjauSjG8qO2A" name="EJBCmpField" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xEJSkEdmjauSjG8qO2A" name="ServletContentType" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xEZSkEdmjauSjG8qO2A" name="MethodForHeaders" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xEpSkEdmjauSjG8qO2A" name="Static" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xE5SkEdmjauSjG8qO2A" name="MethodForRequestAttributes" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xFJSkEdmjauSjG8qO2A" name="ServletSecurityRoles" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xFZSkEdmjauSjG8qO2A" name="ServletInitParameter" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xFpSkEdmjauSjG8qO2A" name="DispatcherForward" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xF5SkEdmjauSjG8qO2A" name="ServletRequestParameterNames" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xGJSkEdmjauSjG8qO2A" name="ServletCookie" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xGZSkEdmjauSjG8qO2A" name="EJBReferences" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xGpSkEdmjauSjG8qO2A" name="ServletContextRef" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xG5SkEdmjauSjG8qO2A" name="GenerateDefaultConstructor" lowerBound="1" defaultValueLiteral="true">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xHJSkEdmjauSjG8qO2A" name="ServletIsSecure" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xHZSkEdmjauSjG8qO2A" name="GenerateFinalizer" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xHpSkEdmjauSjG8qO2A" name="EJBSessionType" lowerBound="1" eType="_-a4xP5SkEdmjauSjG8qO2A" defaultValueLiteral=""/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xH5SkEdmjauSjG8qO2A" name="DisableAutoSync" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xIJSkEdmjauSjG8qO2A" name="ServletInitParameterNames" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xIZSkEdmjauSjG8qO2A" name="BMP_Extend_CMP" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xIpSkEdmjauSjG8qO2A" name="EJBTransactionType" lowerBound="1" eType="_-a4xRpSkEdmjauSjG8qO2A" defaultValueLiteral="Container"/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xI5SkEdmjauSjG8qO2A" name="DispatcherInclude" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xJJSkEdmjauSjG8qO2A" name="ServletHeader" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xJZSkEdmjauSjG8qO2A" name="ServletXMLFilePath" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xJpSkEdmjauSjG8qO2A" name="ServletDateHeader" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xJ5SkEdmjauSjG8qO2A" name="Strictfp" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xKJSkEdmjauSjG8qO2A" name="EJBSessionSync" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xKZSkEdmjauSjG8qO2A" name="EJBSecurityRoles" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xKpSkEdmjauSjG8qO2A" name="IsSingleThread" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xK5SkEdmjauSjG8qO2A" name="ServletRequestAttributesNames" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xLJSkEdmjauSjG8qO2A" name="ServletRequestDispatcherPath" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xLZSkEdmjauSjG8qO2A" name="ServletHeaderNames" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xLpSkEdmjauSjG8qO2A" name="MethodForCookie" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xL5SkEdmjauSjG8qO2A" name="EJBVersion" lowerBound="1" eType="_-a4xS5SkEdmjauSjG8qO2A" defaultValueLiteral="2.0"/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xMJSkEdmjauSjG8qO2A" name="EJBPersistenceType" lowerBound="1" eType="_-a4xUJSkEdmjauSjG8qO2A" defaultValueLiteral=""/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xMZSkEdmjauSjG8qO2A" name="ConstructorIs" lowerBound="1" eType="_-a4xV5SkEdmjauSjG8qO2A" defaultValueLiteral="public"/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xMpSkEdmjauSjG8qO2A" name="ReadOnly" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xM5SkEdmjauSjG8qO2A" name="Generate_XML_DD" lowerBound="1" defaultValueLiteral="true">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xNJSkEdmjauSjG8qO2A" name="ServletName" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xNZSkEdmjauSjG8qO2A" name="EJBXMLFilePath" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xNpSkEdmjauSjG8qO2A" name="EJBCnxFactory" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xN5SkEdmjauSjG8qO2A" name="ServletRequestDispatcher" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xOJSkEdmjauSjG8qO2A" name="EJBReentrant" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xOZSkEdmjauSjG8qO2A" name="MethodForRequestParameters" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xOpSkEdmjauSjG8qO2A" name="EJBEnvironmentProperties" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xO5SkEdmjauSjG8qO2A" name="GenerateCode" lowerBound="1" defaultValueLiteral="true">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xPJSkEdmjauSjG8qO2A" name="ServletRequestParameter" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xPZSkEdmjauSjG8qO2A" name="GenerateHTML" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xPpSkEdmjauSjG8qO2A" name="ServletRequestAttribute" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EEnum" xmi:id="_-a4xP5SkEdmjauSjG8qO2A" name="Java__Http_Servlet__ClassEJBSessionType_Set">
-        <eLiterals xmi:id="_-a4xQJSkEdmjauSjG8qO2A" name="">
-          <eAnnotations xmi:id="_-a4xQZSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-agVpZSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4xQpSkEdmjauSjG8qO2A" name="Stateless" value="1">
-          <eAnnotations xmi:id="_-a4xQ5SkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-agVqJSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4xRJSkEdmjauSjG8qO2A" name="Stateful" value="2">
-          <eAnnotations xmi:id="_-a4xRZSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-agVq5SkEdmjauSjG8qO2A"/>
-        </eLiterals>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EEnum" xmi:id="_-a4xRpSkEdmjauSjG8qO2A" name="Java__Http_Servlet__ClassEJBTransactionType_Set">
-        <eLiterals xmi:id="_-a4xR5SkEdmjauSjG8qO2A" name="Container">
-          <eAnnotations xmi:id="_-a4xSJSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-agVxpSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4xSZSkEdmjauSjG8qO2A" name="Bean" value="1">
-          <eAnnotations xmi:id="_-a4xSpSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-agVyZSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EEnum" xmi:id="_-a4xS5SkEdmjauSjG8qO2A" name="Java__Http_Servlet__ClassEJBVersion_Set">
-        <eLiterals xmi:id="_-a4xTJSkEdmjauSjG8qO2A" name="2.0">
-          <eAnnotations xmi:id="_-a4xTZSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-agVzZSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4xTpSkEdmjauSjG8qO2A" name="1.x" value="1">
-          <eAnnotations xmi:id="_-a4xT5SkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-agV0JSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EEnum" xmi:id="_-a4xUJSkEdmjauSjG8qO2A" name="Java__Http_Servlet__ClassEJBPersistenceType_Set">
-        <eLiterals xmi:id="_-a4xUZSkEdmjauSjG8qO2A" name="">
-          <eAnnotations xmi:id="_-a4xUpSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-agVr5SkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4xU5SkEdmjauSjG8qO2A" name="Bean" value="1">
-          <eAnnotations xmi:id="_-a4xVJSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-agVspSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4xVZSkEdmjauSjG8qO2A" name="Container" value="2">
-          <eAnnotations xmi:id="_-a4xVpSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-agVtZSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EEnum" xmi:id="_-a4xV5SkEdmjauSjG8qO2A" name="Java__Http_Servlet__ClassCtor_Set">
-        <eLiterals xmi:id="_-a4xWJSkEdmjauSjG8qO2A" name="public">
-          <eAnnotations xmi:id="_-a4xWZSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-agVuZSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4xWpSkEdmjauSjG8qO2A" name="protected" value="1">
-          <eAnnotations xmi:id="_-a4xW5SkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-agVvJSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4xXJSkEdmjauSjG8qO2A" name="private" value="2">
-          <eAnnotations xmi:id="_-a4xXZSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-agVv5SkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4xXpSkEdmjauSjG8qO2A" name="package" value="3">
-          <eAnnotations xmi:id="_-a4xX5SkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-agVwpSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EClass" xmi:id="_-a4xYJSkEdmjauSjG8qO2A" name="Java__default__Role">
-        <eAnnotations xmi:id="_-a4xYZSkEdmjauSjG8qO2A" source="stereotype" references="_-aaPCJSkEdmjauSjG8qO2A"/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xYpSkEdmjauSjG8qO2A" name="ReadWrite" lowerBound="1" eType="_-a4xbJSkEdmjauSjG8qO2A" defaultValueLiteral="Read &amp; Write"/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xY5SkEdmjauSjG8qO2A" name="InitialValue" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xZJSkEdmjauSjG8qO2A" name="PropertyType" lowerBound="1" eType="_-a4xc5SkEdmjauSjG8qO2A" defaultValueLiteral="Not A Property"/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xZZSkEdmjauSjG8qO2A" name="GenerateFullyQualifiedTypes" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xZpSkEdmjauSjG8qO2A" name="Final" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xZ5SkEdmjauSjG8qO2A" name="Transient" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xaJSkEdmjauSjG8qO2A" name="Volatile" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xaZSkEdmjauSjG8qO2A" name="IsNavigable" lowerBound="1" defaultValueLiteral="true">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xapSkEdmjauSjG8qO2A" name="IndividualChangeMgt" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xa5SkEdmjauSjG8qO2A" name="ContainerClass" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EEnum" xmi:id="_-a4xbJSkEdmjauSjG8qO2A" name="Java__default__RoleReadWrite_Set">
-        <eLiterals xmi:id="_-a4xbZSkEdmjauSjG8qO2A" name="Read &amp; Write">
-          <eAnnotations xmi:id="_-a4xbpSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-aaPE5SkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4xb5SkEdmjauSjG8qO2A" name="Read Only" value="1">
-          <eAnnotations xmi:id="_-a4xcJSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-aaPFpSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4xcZSkEdmjauSjG8qO2A" name="Write Only" value="2">
-          <eAnnotations xmi:id="_-a4xcpSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-aaPGZSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EEnum" xmi:id="_-a4xc5SkEdmjauSjG8qO2A" name="Java__default__RoleBeanProperty_Set">
-        <eLiterals xmi:id="_-a4xdJSkEdmjauSjG8qO2A" name="Not A Property">
-          <eAnnotations xmi:id="_-a4xdZSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-aaPHZSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4xdpSkEdmjauSjG8qO2A" name="Simple" value="1">
-          <eAnnotations xmi:id="_-a4xd5SkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-aaPIJSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4xeJSkEdmjauSjG8qO2A" name="Bound" value="2">
-          <eAnnotations xmi:id="_-a4xeZSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-aaPI5SkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4xepSkEdmjauSjG8qO2A" name="Constrained" value="3">
-          <eAnnotations xmi:id="_-a4xe5SkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-aaPJpSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EClass" xmi:id="_-a4xfJSkEdmjauSjG8qO2A" name="Java__Default_Servlet__Class">
-        <eAnnotations xmi:id="_-a4xfZSkEdmjauSjG8qO2A" source="stereotype" references="_-Zu5lJSkEdmjauSjG8qO2A"/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xfpSkEdmjauSjG8qO2A" name="EJBNameInJAR" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xf5SkEdmjauSjG8qO2A" name="GenerateInstanceInitializer" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xgJSkEdmjauSjG8qO2A" name="ServletgetInfo" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xgZSkEdmjauSjG8qO2A" name="Final" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xgpSkEdmjauSjG8qO2A" name="ServletIntHeader" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xg5SkEdmjauSjG8qO2A" name="GenerateStaticInitializer" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xhJSkEdmjauSjG8qO2A" name="EJBCmpField" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xhZSkEdmjauSjG8qO2A" name="MethodForHeaders" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xhpSkEdmjauSjG8qO2A" name="ServletContentType" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xh5SkEdmjauSjG8qO2A" name="Static" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xiJSkEdmjauSjG8qO2A" name="MethodForRequestAttributes" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xiZSkEdmjauSjG8qO2A" name="ServletSecurityRoles" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xipSkEdmjauSjG8qO2A" name="ServletInitParameter" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xi5SkEdmjauSjG8qO2A" name="DispatcherForward" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xjJSkEdmjauSjG8qO2A" name="ServletRequestParameterNames" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xjZSkEdmjauSjG8qO2A" name="ServletCookie" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xjpSkEdmjauSjG8qO2A" name="EJBReferences" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xj5SkEdmjauSjG8qO2A" name="ServletContextRef" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xkJSkEdmjauSjG8qO2A" name="GenerateDefaultConstructor" lowerBound="1" defaultValueLiteral="true">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xkZSkEdmjauSjG8qO2A" name="ServletIsSecure" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xkpSkEdmjauSjG8qO2A" name="GenerateFinalizer" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xk5SkEdmjauSjG8qO2A" name="EJBSessionType" lowerBound="1" eType="_-a4xtJSkEdmjauSjG8qO2A" defaultValueLiteral=""/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xlJSkEdmjauSjG8qO2A" name="DisableAutoSync" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xlZSkEdmjauSjG8qO2A" name="ServletInitParameterNames" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xlpSkEdmjauSjG8qO2A" name="BMP_Extend_CMP" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xl5SkEdmjauSjG8qO2A" name="EJBTransactionType" lowerBound="1" eType="_-a4xu5SkEdmjauSjG8qO2A" defaultValueLiteral="Container"/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xmJSkEdmjauSjG8qO2A" name="DispatcherInclude" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xmZSkEdmjauSjG8qO2A" name="ServletXMLFilePath" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xmpSkEdmjauSjG8qO2A" name="ServletHeader" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xm5SkEdmjauSjG8qO2A" name="ServletDateHeader" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xnJSkEdmjauSjG8qO2A" name="Strictfp" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xnZSkEdmjauSjG8qO2A" name="EJBSessionSync" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xnpSkEdmjauSjG8qO2A" name="EJBSecurityRoles" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xn5SkEdmjauSjG8qO2A" name="IsSingleThread" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xoJSkEdmjauSjG8qO2A" name="ServletRequestAttributesNames" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xoZSkEdmjauSjG8qO2A" name="ServletRequestDispatcherPath" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xopSkEdmjauSjG8qO2A" name="ServletHeaderNames" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xo5SkEdmjauSjG8qO2A" name="MethodForCookie" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xpJSkEdmjauSjG8qO2A" name="EJBVersion" lowerBound="1" eType="_-a4xwJSkEdmjauSjG8qO2A" defaultValueLiteral="2.0"/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xpZSkEdmjauSjG8qO2A" name="EJBPersistenceType" lowerBound="1" eType="_-a4xxZSkEdmjauSjG8qO2A" defaultValueLiteral=""/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xppSkEdmjauSjG8qO2A" name="ConstructorIs" lowerBound="1" eType="_-a4xzJSkEdmjauSjG8qO2A" defaultValueLiteral="public"/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xp5SkEdmjauSjG8qO2A" name="ReadOnly" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xqJSkEdmjauSjG8qO2A" name="Generate_XML_DD" lowerBound="1" defaultValueLiteral="true">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xqZSkEdmjauSjG8qO2A" name="ServletName" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xqpSkEdmjauSjG8qO2A" name="EJBXMLFilePath" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xq5SkEdmjauSjG8qO2A" name="EJBCnxFactory" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xrJSkEdmjauSjG8qO2A" name="ServletRequestDispatcher" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xrZSkEdmjauSjG8qO2A" name="EJBReentrant" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xrpSkEdmjauSjG8qO2A" name="MethodForRequestParameters" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xr5SkEdmjauSjG8qO2A" name="EJBEnvironmentProperties" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xsJSkEdmjauSjG8qO2A" name="GenerateCode" lowerBound="1" defaultValueLiteral="true">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xsZSkEdmjauSjG8qO2A" name="ServletRequestParameter" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xspSkEdmjauSjG8qO2A" name="GenerateHTML" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4xs5SkEdmjauSjG8qO2A" name="ServletRequestAttribute" lowerBound="1" defaultValueLiteral="">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-        </eStructuralFeatures>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EEnum" xmi:id="_-a4xtJSkEdmjauSjG8qO2A" name="Java__Default_Servlet__ClassEJBSessionType_Set">
-        <eLiterals xmi:id="_-a4xtZSkEdmjauSjG8qO2A" name="">
-          <eAnnotations xmi:id="_-a4xtpSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Zu5s5SkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4xt5SkEdmjauSjG8qO2A" name="Stateless" value="1">
-          <eAnnotations xmi:id="_-a4xuJSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Zu5tpSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4xuZSkEdmjauSjG8qO2A" name="Stateful" value="2">
-          <eAnnotations xmi:id="_-a4xupSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Zu5uZSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EEnum" xmi:id="_-a4xu5SkEdmjauSjG8qO2A" name="Java__Default_Servlet__ClassEJBTransactionType_Set">
-        <eLiterals xmi:id="_-a4xvJSkEdmjauSjG8qO2A" name="Container">
-          <eAnnotations xmi:id="_-a4xvZSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Zu51JSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4xvpSkEdmjauSjG8qO2A" name="Bean" value="1">
-          <eAnnotations xmi:id="_-a4xv5SkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Zu515SkEdmjauSjG8qO2A"/>
-        </eLiterals>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EEnum" xmi:id="_-a4xwJSkEdmjauSjG8qO2A" name="Java__Default_Servlet__ClassEJBVersion_Set">
-        <eLiterals xmi:id="_-a4xwZSkEdmjauSjG8qO2A" name="2.0">
-          <eAnnotations xmi:id="_-a4xwpSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Zu525SkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4xw5SkEdmjauSjG8qO2A" name="1.x" value="1">
-          <eAnnotations xmi:id="_-a4xxJSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Zu53pSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EEnum" xmi:id="_-a4xxZSkEdmjauSjG8qO2A" name="Java__Default_Servlet__ClassEJBPersistenceType_Set">
-        <eLiterals xmi:id="_-a4xxpSkEdmjauSjG8qO2A" name="">
-          <eAnnotations xmi:id="_-a4xx5SkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Zu5vZSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4xyJSkEdmjauSjG8qO2A" name="Bean" value="1">
-          <eAnnotations xmi:id="_-a4xyZSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Zu5wJSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4xypSkEdmjauSjG8qO2A" name="Container" value="2">
-          <eAnnotations xmi:id="_-a4xy5SkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Zu5w5SkEdmjauSjG8qO2A"/>
-        </eLiterals>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EEnum" xmi:id="_-a4xzJSkEdmjauSjG8qO2A" name="Java__Default_Servlet__ClassCtor_Set">
-        <eLiterals xmi:id="_-a4xzZSkEdmjauSjG8qO2A" name="public">
-          <eAnnotations xmi:id="_-a4xzpSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Zu5x5SkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4xz5SkEdmjauSjG8qO2A" name="protected" value="1">
-          <eAnnotations xmi:id="_-a4x0JSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Zu5ypSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4x0ZSkEdmjauSjG8qO2A" name="private" value="2">
-          <eAnnotations xmi:id="_-a4x0pSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Zu5zZSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4x05SkEdmjauSjG8qO2A" name="package" value="3">
-          <eAnnotations xmi:id="_-a4x1JSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Zu50JSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EClass" xmi:id="_-a4x1ZSkEdmjauSjG8qO2A" name="Java__default__Attribute">
-        <eAnnotations xmi:id="_-a4x1pSkEdmjauSjG8qO2A" source="stereotype" references="_-Zu5YZSkEdmjauSjG8qO2A"/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4x15SkEdmjauSjG8qO2A" name="ReadWrite" lowerBound="1" eType="_-a4x3pSkEdmjauSjG8qO2A" defaultValueLiteral="Read &amp; Write"/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4x2JSkEdmjauSjG8qO2A" name="PropertyType" lowerBound="1" eType="_-a4x5ZSkEdmjauSjG8qO2A" defaultValueLiteral="Not A Property"/>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4x2ZSkEdmjauSjG8qO2A" name="GenerateFullyQualifiedTypes" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4x2pSkEdmjauSjG8qO2A" name="Final" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4x25SkEdmjauSjG8qO2A" name="Transient" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4x3JSkEdmjauSjG8qO2A" name="Volatile" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-        <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_-a4x3ZSkEdmjauSjG8qO2A" name="IndividualChangeMgt" lowerBound="1" defaultValueLiteral="false">
-          <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-        </eStructuralFeatures>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EEnum" xmi:id="_-a4x3pSkEdmjauSjG8qO2A" name="Java__default__AttributeReadWrite_Set">
-        <eLiterals xmi:id="_-a4x35SkEdmjauSjG8qO2A" name="Read &amp; Write">
-          <eAnnotations xmi:id="_-a4x4JSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Zu5cJSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4x4ZSkEdmjauSjG8qO2A" name="Read Only" value="1">
-          <eAnnotations xmi:id="_-a4x4pSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Zu5c5SkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4x45SkEdmjauSjG8qO2A" name="Write Only" value="2">
-          <eAnnotations xmi:id="_-a4x5JSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Zu5dpSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-      </eClassifiers>
-      <eClassifiers xmi:type="ecore:EEnum" xmi:id="_-a4x5ZSkEdmjauSjG8qO2A" name="Java__default__AttributeBeanProperty_Set">
-        <eLiterals xmi:id="_-a4x5pSkEdmjauSjG8qO2A" name="Not A Property">
-          <eAnnotations xmi:id="_-a4x55SkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Zu5epSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4x6JSkEdmjauSjG8qO2A" name="Simple" value="1">
-          <eAnnotations xmi:id="_-a4x6ZSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Zu5fZSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4x6pSkEdmjauSjG8qO2A" name="Bound" value="2">
-          <eAnnotations xmi:id="_-a4x65SkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Zu5gJSkEdmjauSjG8qO2A"/>
-        </eLiterals>
-        <eLiterals xmi:id="_-a4x7JSkEdmjauSjG8qO2A" name="Constrained" value="3">
-          <eAnnotations xmi:id="_-a4x7ZSkEdmjauSjG8qO2A" source="enumerationLiteral" references="_-Zu5g5SkEdmjauSjG8qO2A"/>
-        </eLiterals>
-      </eClassifiers>
-    </contents>
-  </eAnnotations>
-  <eAnnotations xmi:id="_-bjeq5SkEdmjauSjG8qO2A" source="uml2.versions">
-    <details xmi:id="_-bjerJSkEdmjauSjG8qO2A" key="0" value="1.0"/>
-  </eAnnotations>
-  <packageImport xmi:id="_-ZoywZSkEdmjauSjG8qO2A" visibility="private">
-    <eAnnotations xmi:id="_-bE9MJSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bE9MZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <importedPackage xmi:type="uml:Model" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m8qbA686EdiEh75YJ_3n8g"/>
-  </packageImport>
-  <packageImport xmi:id="_-ZoywpSkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bE9MpSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bE9M5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <importedPackage xmi:type="uml:Model" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_EfRZoK86EdieaYgxtVWN8Q"/>
-  </packageImport>
-  <packageImport xmi:id="_-Zoyw5SkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bE9NJSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bE9NZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <importedPackage xmi:type="uml:Model" href="pathmap://UML2_LIBRARIES/JavaPrimitiveTypes.library.uml2#_RjmyoK86EdieaYgxtVWN8Q"/>
-  </packageImport>
-  <ownedMember xmi:type="uml:Stereotype" xmi:id="_-ZoyxpSkEdmjauSjG8qO2A" name="default__ModuleBody">
-    <eAnnotations xmi:id="_-Zoyx5SkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-ZoyyJSkEdmjauSjG8qO2A" key="categoryName" value="Java"/>
-      <details xmi:id="_-ZoyyZSkEdmjauSjG8qO2A" key="suppressed" value="true"/>
-      <details xmi:id="_-bE9NpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <eAnnotations xmi:id="_-ZoyypSkEdmjauSjG8qO2A" source="keywords">
-      <details xmi:id="_-Zoyy5SkEdmjauSjG8qO2A" key="taggedValueSet"/>
-    </eAnnotations>
-    <ownedAttribute xmi:id="_-Zoyz5SkEdmjauSjG8qO2A" name="base$Component" association="_-ZoyzJSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bE9N5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bE9OJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:Class" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m9VJjK86EdiEh75YJ_3n8g"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Zoy0JSkEdmjauSjG8qO2A" name="CmIdentification">
-      <eAnnotations xmi:id="_-bE9OZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bE9OpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Zoy0ZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bE9O5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bE9PJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Zoy0pSkEdmjauSjG8qO2A" name="CopyrightNotice">
-      <eAnnotations xmi:id="_-bE9PZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bE9PpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Zu5YJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bE9P5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bE9QJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Extension" xmi:id="_-ZoyzJSkEdmjauSjG8qO2A" name="Component_default__ModuleBody" memberEnd="_-ZoyzZSkEdmjauSjG8qO2A _-Zoyz5SkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bE9QZSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bE9QpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_-ZoyzZSkEdmjauSjG8qO2A" name="extension$default__ModuleBody" type="_-ZoyxpSkEdmjauSjG8qO2A" association="_-ZoyzJSkEdmjauSjG8qO2A" aggregation="composite">
-      <eAnnotations xmi:id="_-bE9Q5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bE9RJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-ZoyzpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bE9RZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bE9RpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </lowerValue>
-    </ownedEnd>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Stereotype" xmi:id="_-Zu5YZSkEdmjauSjG8qO2A" name="default__Attribute">
-    <eAnnotations xmi:id="_-Zu5YpSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-Zu5Y5SkEdmjauSjG8qO2A" key="categoryName" value="Java"/>
-      <details xmi:id="_-Zu5ZJSkEdmjauSjG8qO2A" key="suppressed" value="true"/>
-      <details xmi:id="_-bE9R5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <eAnnotations xmi:id="_-Zu5ZZSkEdmjauSjG8qO2A" source="keywords">
-      <details xmi:id="_-Zu5ZpSkEdmjauSjG8qO2A" key="taggedValueSet"/>
-    </eAnnotations>
-    <ownedAttribute xmi:id="_-Zu5apSkEdmjauSjG8qO2A" name="base$EnumerationLiteral" association="_-Zu5Z5SkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bE9SJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bE9SZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:Class" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m9bRga86EdiEh75YJ_3n8g"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Zu5bpSkEdmjauSjG8qO2A" name="base$Property" association="_-Zu5a5SkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bE9SpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bE9S5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:Class" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m9C1la86EdiEh75YJ_3n8g"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Zu5hpSkEdmjauSjG8qO2A" name="ReadWrite" type="_-Zu5b5SkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bE9TJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bE9TZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <defaultValue xmi:type="uml:InstanceValue" xmi:id="_-Zu5h5SkEdmjauSjG8qO2A" instance="_-Zu5cJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bE9TpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bE9T5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Zu5iJSkEdmjauSjG8qO2A" name="PropertyType" type="_-Zu5eZSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bE9UJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bE9UZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <defaultValue xmi:type="uml:InstanceValue" xmi:id="_-Zu5iZSkEdmjauSjG8qO2A" instance="_-Zu5epSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bE9UpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bE9U5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Zu5ipSkEdmjauSjG8qO2A" name="GenerateFullyQualifiedTypes">
-      <eAnnotations xmi:id="_-bE9VJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bE9VZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Zu5i5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bE9VpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bE9V5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Zu5jJSkEdmjauSjG8qO2A" name="Final">
-      <eAnnotations xmi:id="_-bE9WJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bE9WZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Zu5jZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bE9WpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bE9W5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Zu5jpSkEdmjauSjG8qO2A" name="Transient">
-      <eAnnotations xmi:id="_-bE9XJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bE9XZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Zu5j5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bE9XpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bE9X5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Zu5kJSkEdmjauSjG8qO2A" name="Volatile">
-      <eAnnotations xmi:id="_-bE9YJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bE9YZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Zu5kZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bE9YpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bE9Y5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Zu5kpSkEdmjauSjG8qO2A" name="IndividualChangeMgt">
-      <eAnnotations xmi:id="_-bE9ZJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bE9ZZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Zu5k5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bE9ZpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bE9Z5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Extension" xmi:id="_-Zu5Z5SkEdmjauSjG8qO2A" name="EnumerationLiteral_default__Attribute" memberEnd="_-Zu5aJSkEdmjauSjG8qO2A _-Zu5apSkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bE9aJSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bE9aZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_-Zu5aJSkEdmjauSjG8qO2A" name="extension$default__Attribute" type="_-Zu5YZSkEdmjauSjG8qO2A" association="_-Zu5Z5SkEdmjauSjG8qO2A" aggregation="composite">
-      <eAnnotations xmi:id="_-bE9apSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bE9a5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-Zu5aZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bE9bJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bE9bZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </lowerValue>
-    </ownedEnd>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Extension" xmi:id="_-Zu5a5SkEdmjauSjG8qO2A" name="Property_default__Attribute" memberEnd="_-Zu5bJSkEdmjauSjG8qO2A _-Zu5bpSkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bE9bpSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bE9b5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_-Zu5bJSkEdmjauSjG8qO2A" name="extension$default__Attribute" type="_-Zu5YZSkEdmjauSjG8qO2A" association="_-Zu5a5SkEdmjauSjG8qO2A" aggregation="composite">
-      <eAnnotations xmi:id="_-bE9cJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bE9cZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-Zu5bZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bE9cpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bE9c5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </lowerValue>
-    </ownedEnd>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Enumeration" xmi:id="_-Zu5b5SkEdmjauSjG8qO2A" name="default__AttributeReadWrite_Set">
-    <eAnnotations xmi:id="_-bE9dJSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bE9dZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedLiteral xmi:id="_-Zu5cJSkEdmjauSjG8qO2A" name="Read &amp; Write">
-      <eAnnotations xmi:id="_-Zu5cZSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Zu5cpSkEdmjauSjG8qO2A" key="cardinal" value="81"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bE9dpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bE9d5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-Zu5c5SkEdmjauSjG8qO2A" name="Read Only">
-      <eAnnotations xmi:id="_-Zu5dJSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Zu5dZSkEdmjauSjG8qO2A" key="cardinal" value="82"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bE9eJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLD0JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-Zu5dpSkEdmjauSjG8qO2A" name="Write Only">
-      <eAnnotations xmi:id="_-Zu5d5SkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Zu5eJSkEdmjauSjG8qO2A" key="cardinal" value="83"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bLD0ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLD0pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Enumeration" xmi:id="_-Zu5eZSkEdmjauSjG8qO2A" name="default__AttributeBeanProperty_Set">
-    <eAnnotations xmi:id="_-bLD05SkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bLD1JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedLiteral xmi:id="_-Zu5epSkEdmjauSjG8qO2A" name="Not A Property">
-      <eAnnotations xmi:id="_-Zu5e5SkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Zu5fJSkEdmjauSjG8qO2A" key="cardinal" value="71"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bLD1ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLD1pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-Zu5fZSkEdmjauSjG8qO2A" name="Simple">
-      <eAnnotations xmi:id="_-Zu5fpSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Zu5f5SkEdmjauSjG8qO2A" key="cardinal" value="72"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bLD15SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLD2JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-Zu5gJSkEdmjauSjG8qO2A" name="Bound">
-      <eAnnotations xmi:id="_-Zu5gZSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Zu5gpSkEdmjauSjG8qO2A" key="cardinal" value="73"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bLD2ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLD2pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-Zu5g5SkEdmjauSjG8qO2A" name="Constrained">
-      <eAnnotations xmi:id="_-Zu5hJSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Zu5hZSkEdmjauSjG8qO2A" key="cardinal" value="74"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bLD25SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLD3JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Stereotype" xmi:id="_-Zu5lJSkEdmjauSjG8qO2A" name="Default_Servlet__Class">
-    <eAnnotations xmi:id="_-Zu5lZSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-Zu5lpSkEdmjauSjG8qO2A" key="categoryName" value="Java"/>
-      <details xmi:id="_-Zu5l5SkEdmjauSjG8qO2A" key="suppressed" value="true"/>
-      <details xmi:id="_-bLD3ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <eAnnotations xmi:id="_-Zu5mJSkEdmjauSjG8qO2A" source="keywords">
-      <details xmi:id="_-Zu5mZSkEdmjauSjG8qO2A" key="taggedValueSet"/>
-    </eAnnotations>
-    <ownedAttribute xmi:id="_-Zu5nZSkEdmjauSjG8qO2A" name="base$Actor" association="_-Zu5mpSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bLD3pSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLD35SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:Class" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m9ndca86EdiEh75YJ_3n8g"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Zu5oZSkEdmjauSjG8qO2A" name="base$Class" association="_-Zu5npSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bLD4JSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLD4ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:Class" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m88uxq86EdiEh75YJ_3n8g"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Zu5pZSkEdmjauSjG8qO2A" name="base$Enumeration" association="_-Zu5opSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bLD4pSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLD45SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:Class" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m9bRea86EdiEh75YJ_3n8g"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Zu5qZSkEdmjauSjG8qO2A" name="base$Interface" association="_-Zu5ppSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bLD5JSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLD5ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:Class" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m9VJoq86EdiEh75YJ_3n8g"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Zu5rZSkEdmjauSjG8qO2A" name="base$Signal" association="_-Zu5qpSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bLD5pSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLD55SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:Class" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m9VJza86EdiEh75YJ_3n8g"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Zu5sZSkEdmjauSjG8qO2A" name="base$PrimitiveType" association="_-Zu5rpSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bLD6JSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLD6ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:Class" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m9bRsa86EdiEh75YJ_3n8g"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Zu54ZSkEdmjauSjG8qO2A" name="EJBNameInJAR">
-      <eAnnotations xmi:id="_-bLD6pSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLD65SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Zu54pSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLD7JSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLD7ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Zu545SkEdmjauSjG8qO2A" name="GenerateInstanceInitializer">
-      <eAnnotations xmi:id="_-bLD7pSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLD75SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Zu55JSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLD8JSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLD8ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Zu55ZSkEdmjauSjG8qO2A" name="ServletgetInfo">
-      <eAnnotations xmi:id="_-bLD8pSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLD85SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Zu55pSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLD9JSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLD9ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Zu555SkEdmjauSjG8qO2A" name="Final">
-      <eAnnotations xmi:id="_-bLD9pSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLD95SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Zu56JSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLD-JSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLD-ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Zu56ZSkEdmjauSjG8qO2A" name="ServletIntHeader">
-      <eAnnotations xmi:id="_-bLD-pSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLD-5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Zu56pSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLD_JSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLD_ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Zu565SkEdmjauSjG8qO2A" name="GenerateStaticInitializer">
-      <eAnnotations xmi:id="_-bLD_pSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLD_5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Zu57JSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEAJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEAZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Zu57ZSkEdmjauSjG8qO2A" name="EJBCmpField">
-      <eAnnotations xmi:id="_-bLEApSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEA5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Zu57pSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEBJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEBZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Zu575SkEdmjauSjG8qO2A" name="MethodForHeaders">
-      <eAnnotations xmi:id="_-bLEBpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEB5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Z1nEJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLECJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLECZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nEZSkEdmjauSjG8qO2A" name="ServletContentType">
-      <eAnnotations xmi:id="_-bLECpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEC5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Z1nEpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEDJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEDZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nE5SkEdmjauSjG8qO2A" name="Static">
-      <eAnnotations xmi:id="_-bLEDpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLED5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z1nFJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEEJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEEZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nFZSkEdmjauSjG8qO2A" name="MethodForRequestAttributes">
-      <eAnnotations xmi:id="_-bLEEpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEE5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Z1nFpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEFJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEFZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nF5SkEdmjauSjG8qO2A" name="ServletSecurityRoles">
-      <eAnnotations xmi:id="_-bLEFpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEF5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Z1nGJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEGJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEGZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nGZSkEdmjauSjG8qO2A" name="ServletInitParameter">
-      <eAnnotations xmi:id="_-bLEGpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEG5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Z1nGpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEHJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEHZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nG5SkEdmjauSjG8qO2A" name="DispatcherForward">
-      <eAnnotations xmi:id="_-bLEHpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEH5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z1nHJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEIJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEIZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nHZSkEdmjauSjG8qO2A" name="ServletRequestParameterNames">
-      <eAnnotations xmi:id="_-bLEIpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEI5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z1nHpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEJJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEJZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nH5SkEdmjauSjG8qO2A" name="ServletCookie">
-      <eAnnotations xmi:id="_-bLEJpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEJ5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z1nIJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEKJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEKZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nIZSkEdmjauSjG8qO2A" name="EJBReferences">
-      <eAnnotations xmi:id="_-bLEKpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEK5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Z1nIpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLELJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLELZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nI5SkEdmjauSjG8qO2A" name="ServletContextRef">
-      <eAnnotations xmi:id="_-bLELpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEL5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z1nJJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEMJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEMZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nJZSkEdmjauSjG8qO2A" name="GenerateDefaultConstructor">
-      <eAnnotations xmi:id="_-bLEMpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEM5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z1nJpSkEdmjauSjG8qO2A" value="true">
-        <eAnnotations xmi:id="_-bLENJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLENZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nJ5SkEdmjauSjG8qO2A" name="ServletIsSecure">
-      <eAnnotations xmi:id="_-bLENpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEN5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z1nKJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEOJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEOZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nKZSkEdmjauSjG8qO2A" name="GenerateFinalizer">
-      <eAnnotations xmi:id="_-bLEOpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEO5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z1nKpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEPJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEPZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nK5SkEdmjauSjG8qO2A" name="EJBSessionType" type="_-Zu5spSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bLEPpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEP5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <defaultValue xmi:type="uml:InstanceValue" xmi:id="_-Z1nLJSkEdmjauSjG8qO2A" instance="_-Zu5s5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEQJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEQZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nLZSkEdmjauSjG8qO2A" name="DisableAutoSync">
-      <eAnnotations xmi:id="_-bLEQpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEQ5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z1nLpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLERJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLERZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nL5SkEdmjauSjG8qO2A" name="ServletInitParameterNames">
-      <eAnnotations xmi:id="_-bLERpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLER5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z1nMJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLESJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLESZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nMZSkEdmjauSjG8qO2A" name="BMP_Extend_CMP">
-      <eAnnotations xmi:id="_-bLESpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLES5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z1nMpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLETJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLETZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nM5SkEdmjauSjG8qO2A" name="EJBTransactionType" type="_-Zu505SkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bLETpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLET5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <defaultValue xmi:type="uml:InstanceValue" xmi:id="_-Z1nNJSkEdmjauSjG8qO2A" instance="_-Zu51JSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEUJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEUZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nNZSkEdmjauSjG8qO2A" name="DispatcherInclude">
-      <eAnnotations xmi:id="_-bLEUpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEU5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z1nNpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEVJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEVZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nN5SkEdmjauSjG8qO2A" name="ServletXMLFilePath">
-      <eAnnotations xmi:id="_-bLEVpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEV5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Z1nOJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEWJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEWZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nOZSkEdmjauSjG8qO2A" name="ServletHeader">
-      <eAnnotations xmi:id="_-bLEWpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEW5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Z1nOpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEXJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEXZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nO5SkEdmjauSjG8qO2A" name="ServletDateHeader">
-      <eAnnotations xmi:id="_-bLEXpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEX5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z1nPJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEYJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEYZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nPZSkEdmjauSjG8qO2A" name="Strictfp">
-      <eAnnotations xmi:id="_-bLEYpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEY5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z1nPpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEZJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEZZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nP5SkEdmjauSjG8qO2A" name="EJBSessionSync">
-      <eAnnotations xmi:id="_-bLEZpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEZ5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z1nQJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEaJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEaZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nQZSkEdmjauSjG8qO2A" name="EJBSecurityRoles">
-      <eAnnotations xmi:id="_-bLEapSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEa5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Z1nQpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEbJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEbZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nQ5SkEdmjauSjG8qO2A" name="IsSingleThread">
-      <eAnnotations xmi:id="_-bLEbpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEb5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z1nRJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEcJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEcZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nRZSkEdmjauSjG8qO2A" name="ServletRequestAttributesNames">
-      <eAnnotations xmi:id="_-bLEcpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEc5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z1nRpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEdJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEdZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nR5SkEdmjauSjG8qO2A" name="ServletRequestDispatcherPath">
-      <eAnnotations xmi:id="_-bLEdpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEd5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Z1nSJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEeJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEeZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nSZSkEdmjauSjG8qO2A" name="ServletHeaderNames">
-      <eAnnotations xmi:id="_-bLEepSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEe5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z1nSpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEfJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEfZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nS5SkEdmjauSjG8qO2A" name="MethodForCookie">
-      <eAnnotations xmi:id="_-bLEfpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEf5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Z1nTJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEgJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEgZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nTZSkEdmjauSjG8qO2A" name="EJBVersion" type="_-Zu52pSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bLEgpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEg5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <defaultValue xmi:type="uml:InstanceValue" xmi:id="_-Z1nTpSkEdmjauSjG8qO2A" instance="_-Zu525SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEhJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEhZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nT5SkEdmjauSjG8qO2A" name="EJBPersistenceType" type="_-Zu5vJSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bLEhpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEh5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <defaultValue xmi:type="uml:InstanceValue" xmi:id="_-Z1nUJSkEdmjauSjG8qO2A" instance="_-Zu5vZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEiJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEiZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nUZSkEdmjauSjG8qO2A" name="ConstructorIs" type="_-Zu5xpSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bLEipSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEi5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <defaultValue xmi:type="uml:InstanceValue" xmi:id="_-Z1nUpSkEdmjauSjG8qO2A" instance="_-Zu5x5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEjJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEjZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nU5SkEdmjauSjG8qO2A" name="ReadOnly">
-      <eAnnotations xmi:id="_-bLEjpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEj5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z1nVJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEkJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEkZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nVZSkEdmjauSjG8qO2A" name="Generate_XML_DD">
-      <eAnnotations xmi:id="_-bLEkpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEk5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z1nVpSkEdmjauSjG8qO2A" value="true">
-        <eAnnotations xmi:id="_-bLElJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLElZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nV5SkEdmjauSjG8qO2A" name="ServletName">
-      <eAnnotations xmi:id="_-bLElpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEl5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Z1nWJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEmJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEmZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nWZSkEdmjauSjG8qO2A" name="EJBXMLFilePath">
-      <eAnnotations xmi:id="_-bLEmpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEm5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Z1nWpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEnJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEnZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nW5SkEdmjauSjG8qO2A" name="EJBCnxFactory">
-      <eAnnotations xmi:id="_-bLEnpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEn5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Z1nXJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEoJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEoZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nXZSkEdmjauSjG8qO2A" name="ServletRequestDispatcher">
-      <eAnnotations xmi:id="_-bLEopSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEo5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z1nXpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEpJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEpZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nX5SkEdmjauSjG8qO2A" name="EJBReentrant">
-      <eAnnotations xmi:id="_-bLEppSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEp5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z1nYJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEqJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEqZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nYZSkEdmjauSjG8qO2A" name="MethodForRequestParameters">
-      <eAnnotations xmi:id="_-bLEqpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEq5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Z1nYpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLErJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLErZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nY5SkEdmjauSjG8qO2A" name="EJBEnvironmentProperties">
-      <eAnnotations xmi:id="_-bLErpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEr5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Z1nZJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEsJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEsZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nZZSkEdmjauSjG8qO2A" name="GenerateCode">
-      <eAnnotations xmi:id="_-bLEspSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEs5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z1nZpSkEdmjauSjG8qO2A" value="true">
-        <eAnnotations xmi:id="_-bLEtJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEtZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1nZ5SkEdmjauSjG8qO2A" name="ServletRequestParameter">
-      <eAnnotations xmi:id="_-bLEtpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEt5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Z1naJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEuJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEuZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1naZSkEdmjauSjG8qO2A" name="GenerateHTML">
-      <eAnnotations xmi:id="_-bLEupSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEu5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z1napSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEvJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEvZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z1na5SkEdmjauSjG8qO2A" name="ServletRequestAttribute">
-      <eAnnotations xmi:id="_-bLEvpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEv5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Z1nbJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEwJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEwZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Extension" xmi:id="_-Zu5mpSkEdmjauSjG8qO2A" name="Actor_Default_Servlet__Class" memberEnd="_-Zu5m5SkEdmjauSjG8qO2A _-Zu5nZSkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bLEwpSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bLEw5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_-Zu5m5SkEdmjauSjG8qO2A" name="extension$Default_Servlet__Class" type="_-Zu5lJSkEdmjauSjG8qO2A" association="_-Zu5mpSkEdmjauSjG8qO2A" aggregation="composite">
-      <eAnnotations xmi:id="_-bLExJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLExZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-Zu5nJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLExpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEx5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </lowerValue>
-    </ownedEnd>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Extension" xmi:id="_-Zu5npSkEdmjauSjG8qO2A" name="Class_Default_Servlet__Class" memberEnd="_-Zu5n5SkEdmjauSjG8qO2A _-Zu5oZSkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bLEyJSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bLEyZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_-Zu5n5SkEdmjauSjG8qO2A" name="extension$Default_Servlet__Class" type="_-Zu5lJSkEdmjauSjG8qO2A" association="_-Zu5npSkEdmjauSjG8qO2A" aggregation="composite">
-      <eAnnotations xmi:id="_-bLEypSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLEy5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-Zu5oJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLEzJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLEzZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </lowerValue>
-    </ownedEnd>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Extension" xmi:id="_-Zu5opSkEdmjauSjG8qO2A" name="Enumeration_Default_Servlet__Class" memberEnd="_-Zu5o5SkEdmjauSjG8qO2A _-Zu5pZSkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bLEzpSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bLEz5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_-Zu5o5SkEdmjauSjG8qO2A" name="extension$Default_Servlet__Class" type="_-Zu5lJSkEdmjauSjG8qO2A" association="_-Zu5opSkEdmjauSjG8qO2A" aggregation="composite">
-      <eAnnotations xmi:id="_-bLE0JSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLE0ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-Zu5pJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLE0pSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLE05SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </lowerValue>
-    </ownedEnd>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Extension" xmi:id="_-Zu5ppSkEdmjauSjG8qO2A" name="Interface_Default_Servlet__Class" memberEnd="_-Zu5p5SkEdmjauSjG8qO2A _-Zu5qZSkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bLE1JSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bLE1ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_-Zu5p5SkEdmjauSjG8qO2A" name="extension$Default_Servlet__Class" type="_-Zu5lJSkEdmjauSjG8qO2A" association="_-Zu5ppSkEdmjauSjG8qO2A" aggregation="composite">
-      <eAnnotations xmi:id="_-bLE1pSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLE15SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-Zu5qJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLE2JSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLE2ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </lowerValue>
-    </ownedEnd>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Extension" xmi:id="_-Zu5qpSkEdmjauSjG8qO2A" name="Signal_Default_Servlet__Class" memberEnd="_-Zu5q5SkEdmjauSjG8qO2A _-Zu5rZSkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bLE2pSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bLE25SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_-Zu5q5SkEdmjauSjG8qO2A" name="extension$Default_Servlet__Class" type="_-Zu5lJSkEdmjauSjG8qO2A" association="_-Zu5qpSkEdmjauSjG8qO2A" aggregation="composite">
-      <eAnnotations xmi:id="_-bLE3JSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLE3ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-Zu5rJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLE3pSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLE35SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </lowerValue>
-    </ownedEnd>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Extension" xmi:id="_-Zu5rpSkEdmjauSjG8qO2A" name="PrimitiveType_Default_Servlet__Class" memberEnd="_-Zu5r5SkEdmjauSjG8qO2A _-Zu5sZSkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bLE4JSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bLE4ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_-Zu5r5SkEdmjauSjG8qO2A" name="extension$Default_Servlet__Class" type="_-Zu5lJSkEdmjauSjG8qO2A" association="_-Zu5rpSkEdmjauSjG8qO2A" aggregation="composite">
-      <eAnnotations xmi:id="_-bLE4pSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLE45SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-Zu5sJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLE5JSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLE5ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </lowerValue>
-    </ownedEnd>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Enumeration" xmi:id="_-Zu5spSkEdmjauSjG8qO2A" name="Default_Servlet__ClassEJBSessionType_Set">
-    <eAnnotations xmi:id="_-bLE5pSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bLE55SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedLiteral xmi:id="_-Zu5s5SkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-Zu5tJSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Zu5tZSkEdmjauSjG8qO2A" key="cardinal" value="200"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bLE6JSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLE6ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-Zu5tpSkEdmjauSjG8qO2A" name="Stateless">
-      <eAnnotations xmi:id="_-Zu5t5SkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Zu5uJSkEdmjauSjG8qO2A" key="cardinal" value="201"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bLE6pSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLE65SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-Zu5uZSkEdmjauSjG8qO2A" name="Stateful">
-      <eAnnotations xmi:id="_-Zu5upSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Zu5u5SkEdmjauSjG8qO2A" key="cardinal" value="202"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bLE7JSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLE7ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Enumeration" xmi:id="_-Zu5vJSkEdmjauSjG8qO2A" name="Default_Servlet__ClassEJBPersistenceType_Set">
-    <eAnnotations xmi:id="_-bLE7pSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bLE75SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedLiteral xmi:id="_-Zu5vZSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-Zu5vpSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Zu5v5SkEdmjauSjG8qO2A" key="cardinal" value="220"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bLE8JSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLE8ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-Zu5wJSkEdmjauSjG8qO2A" name="Bean">
-      <eAnnotations xmi:id="_-Zu5wZSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Zu5wpSkEdmjauSjG8qO2A" key="cardinal" value="221"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bLE8pSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLE85SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-Zu5w5SkEdmjauSjG8qO2A" name="Container">
-      <eAnnotations xmi:id="_-Zu5xJSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Zu5xZSkEdmjauSjG8qO2A" key="cardinal" value="222"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bLE9JSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLE9ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Enumeration" xmi:id="_-Zu5xpSkEdmjauSjG8qO2A" name="Default_Servlet__ClassCtor_Set">
-    <eAnnotations xmi:id="_-bLE9pSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bLE95SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedLiteral xmi:id="_-Zu5x5SkEdmjauSjG8qO2A" name="public">
-      <eAnnotations xmi:id="_-Zu5yJSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Zu5yZSkEdmjauSjG8qO2A" key="cardinal" value="62"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bLE-JSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLE-ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-Zu5ypSkEdmjauSjG8qO2A" name="protected">
-      <eAnnotations xmi:id="_-Zu5y5SkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Zu5zJSkEdmjauSjG8qO2A" key="cardinal" value="63"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bLE-pSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLE-5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-Zu5zZSkEdmjauSjG8qO2A" name="private">
-      <eAnnotations xmi:id="_-Zu5zpSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Zu5z5SkEdmjauSjG8qO2A" key="cardinal" value="64"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bLE_JSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLE_ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-Zu50JSkEdmjauSjG8qO2A" name="package">
-      <eAnnotations xmi:id="_-Zu50ZSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Zu50pSkEdmjauSjG8qO2A" key="cardinal" value="65"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bLE_pSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLE_5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Enumeration" xmi:id="_-Zu505SkEdmjauSjG8qO2A" name="Default_Servlet__ClassEJBTransactionType_Set">
-    <eAnnotations xmi:id="_-bLFAJSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bLFAZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedLiteral xmi:id="_-Zu51JSkEdmjauSjG8qO2A" name="Container">
-      <eAnnotations xmi:id="_-Zu51ZSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Zu51pSkEdmjauSjG8qO2A" key="cardinal" value="211"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bLFApSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFA5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-Zu515SkEdmjauSjG8qO2A" name="Bean">
-      <eAnnotations xmi:id="_-Zu52JSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Zu52ZSkEdmjauSjG8qO2A" key="cardinal" value="212"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bLFBJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFBZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Enumeration" xmi:id="_-Zu52pSkEdmjauSjG8qO2A" name="Default_Servlet__ClassEJBVersion_Set">
-    <eAnnotations xmi:id="_-bLFBpSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bLFB5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedLiteral xmi:id="_-Zu525SkEdmjauSjG8qO2A" name="2.0">
-      <eAnnotations xmi:id="_-Zu53JSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Zu53ZSkEdmjauSjG8qO2A" key="cardinal" value="230"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bLFCJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFCZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-Zu53pSkEdmjauSjG8qO2A" name="1.x">
-      <eAnnotations xmi:id="_-Zu535SkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Zu54JSkEdmjauSjG8qO2A" key="cardinal" value="231"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bLFCpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFC5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Stereotype" xmi:id="_-Z1nbZSkEdmjauSjG8qO2A" name="default__Class">
-    <eAnnotations xmi:id="_-Z1nbpSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-Z1nb5SkEdmjauSjG8qO2A" key="categoryName" value="Java"/>
-      <details xmi:id="_-Z1ncJSkEdmjauSjG8qO2A" key="suppressed" value="true"/>
-      <details xmi:id="_-bLFDJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <eAnnotations xmi:id="_-Z1ncZSkEdmjauSjG8qO2A" source="keywords">
-      <details xmi:id="_-Z1ncpSkEdmjauSjG8qO2A" key="taggedValueSet"/>
-    </eAnnotations>
-    <ownedAttribute xmi:id="_-Z1ndpSkEdmjauSjG8qO2A" name="base$Actor" association="_-Z1nc5SkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bLFDZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFDpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:Class" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m9ndca86EdiEh75YJ_3n8g"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z7tsZSkEdmjauSjG8qO2A" name="base$Class" association="_-Z1nd5SkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bLFD5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFEJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:Class" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m88uxq86EdiEh75YJ_3n8g"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z7ttZSkEdmjauSjG8qO2A" name="base$Enumeration" association="_-Z7tspSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bLFEZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFEpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:Class" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m9bRea86EdiEh75YJ_3n8g"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z7tuZSkEdmjauSjG8qO2A" name="base$Interface" association="_-Z7ttpSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bLFE5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFFJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:Class" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m9VJoq86EdiEh75YJ_3n8g"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z7tvZSkEdmjauSjG8qO2A" name="base$Signal" association="_-Z7tupSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bLFFZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFFpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:Class" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m9VJza86EdiEh75YJ_3n8g"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z7twZSkEdmjauSjG8qO2A" name="base$PrimitiveType" association="_-Z7tvpSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bLFF5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFGJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:Class" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m9bRsa86EdiEh75YJ_3n8g"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z7t8ZSkEdmjauSjG8qO2A" name="EJBNameInJAR">
-      <eAnnotations xmi:id="_-bLFGZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFGpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Z7t8pSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLFG5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLFHJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z7t85SkEdmjauSjG8qO2A" name="ServletgetInfo">
-      <eAnnotations xmi:id="_-bLFHZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFHpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Z7t9JSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLFH5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLFIJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z7t9ZSkEdmjauSjG8qO2A" name="GenerateInstanceInitializer">
-      <eAnnotations xmi:id="_-bLFIZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFIpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z7t9pSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLFI5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLFJJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z7t95SkEdmjauSjG8qO2A" name="Final">
-      <eAnnotations xmi:id="_-bLFJZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFJpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z7t-JSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLFJ5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLFKJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z7t-ZSkEdmjauSjG8qO2A" name="ServletIntHeader">
-      <eAnnotations xmi:id="_-bLFKZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFKpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z7t-pSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLFK5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLFLJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z7t-5SkEdmjauSjG8qO2A" name="GenerateStaticInitializer">
-      <eAnnotations xmi:id="_-bLFLZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFLpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z7t_JSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLFL5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLFMJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z7t_ZSkEdmjauSjG8qO2A" name="EJBCmpField">
-      <eAnnotations xmi:id="_-bLFMZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFMpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Z7t_pSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLFM5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLFNJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z7t_5SkEdmjauSjG8qO2A" name="MethodForHeaders">
-      <eAnnotations xmi:id="_-bLFNZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFNpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Z7uAJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLFN5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLFOJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z7uAZSkEdmjauSjG8qO2A" name="ServletContentType">
-      <eAnnotations xmi:id="_-bLFOZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFOpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Z7uApSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLFO5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLFPJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z7uA5SkEdmjauSjG8qO2A" name="Static">
-      <eAnnotations xmi:id="_-bLFPZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFPpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z7uBJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLFP5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLFQJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z7uBZSkEdmjauSjG8qO2A" name="MethodForRequestAttributes">
-      <eAnnotations xmi:id="_-bLFQZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFQpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Z7uBpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLFQ5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLFRJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z7uB5SkEdmjauSjG8qO2A" name="ServletSecurityRoles">
-      <eAnnotations xmi:id="_-bLFRZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFRpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Z7uCJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLFR5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLFSJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z7uCZSkEdmjauSjG8qO2A" name="ServletInitParameter">
-      <eAnnotations xmi:id="_-bLFSZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFSpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Z7uCpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLFS5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLFTJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z7uC5SkEdmjauSjG8qO2A" name="DispatcherForward">
-      <eAnnotations xmi:id="_-bLFTZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFTpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z7uDJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLFT5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLFUJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z7uDZSkEdmjauSjG8qO2A" name="ServletRequestParameterNames">
-      <eAnnotations xmi:id="_-bLFUZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFUpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z7uDpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLFU5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLFVJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z7uD5SkEdmjauSjG8qO2A" name="ServletCookie">
-      <eAnnotations xmi:id="_-bLFVZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFVpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-Z7uEJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLFV5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLFWJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z7uEZSkEdmjauSjG8qO2A" name="EJBReferences">
-      <eAnnotations xmi:id="_-bLFWZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFWpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-Z7uEpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLFW5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLFXJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-Z7uE5SkEdmjauSjG8qO2A" name="ServletContextRef">
-      <eAnnotations xmi:id="_-bLFXZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFXpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aB0UJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLFX5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLFYJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0UZSkEdmjauSjG8qO2A" name="GenerateDefaultConstructor">
-      <eAnnotations xmi:id="_-bLFYZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFYpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aB0UpSkEdmjauSjG8qO2A" value="true">
-        <eAnnotations xmi:id="_-bLFY5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLFZJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0U5SkEdmjauSjG8qO2A" name="ServletIsSecure">
-      <eAnnotations xmi:id="_-bLFZZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFZpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aB0VJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLFZ5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLFaJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0VZSkEdmjauSjG8qO2A" name="GenerateFinalizer">
-      <eAnnotations xmi:id="_-bLFaZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFapSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aB0VpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLFa5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLFbJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0V5SkEdmjauSjG8qO2A" name="EJBSessionType" type="_-Z7twpSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bLFbZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFbpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <defaultValue xmi:type="uml:InstanceValue" xmi:id="_-aB0WJSkEdmjauSjG8qO2A" instance="_-Z7tw5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLFb5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLFcJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0WZSkEdmjauSjG8qO2A" name="ServletInitParameterNames">
-      <eAnnotations xmi:id="_-bLFcZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFcpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aB0WpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLFc5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLFdJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0W5SkEdmjauSjG8qO2A" name="DisableAutoSync">
-      <eAnnotations xmi:id="_-bLFdZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFdpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aB0XJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLFd5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLFeJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0XZSkEdmjauSjG8qO2A" name="BMP_Extend_CMP">
-      <eAnnotations xmi:id="_-bLFeZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFepSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aB0XpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLFe5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLFfJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0X5SkEdmjauSjG8qO2A" name="EJBTransactionType" type="_-Z7t45SkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bLFfZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFfpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <defaultValue xmi:type="uml:InstanceValue" xmi:id="_-aB0YJSkEdmjauSjG8qO2A" instance="_-Z7t5JSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bLFf5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bLFgJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0YZSkEdmjauSjG8qO2A" name="DispatcherInclude">
-      <eAnnotations xmi:id="_-bLFgZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bLFgpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aB0YpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRKcJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRKcZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0Y5SkEdmjauSjG8qO2A" name="ServletXMLFilePath">
-      <eAnnotations xmi:id="_-bRKcpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRKc5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aB0ZJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRKdJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRKdZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0ZZSkEdmjauSjG8qO2A" name="ServletHeader">
-      <eAnnotations xmi:id="_-bRKdpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRKd5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aB0ZpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRKeJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRKeZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0Z5SkEdmjauSjG8qO2A" name="ServletDateHeader">
-      <eAnnotations xmi:id="_-bRKepSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRKe5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aB0aJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRKfJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRKfZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0aZSkEdmjauSjG8qO2A" name="Strictfp">
-      <eAnnotations xmi:id="_-bRKfpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRKf5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aB0apSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRKgJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRKgZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0a5SkEdmjauSjG8qO2A" name="EJBSessionSync">
-      <eAnnotations xmi:id="_-bRKgpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRKg5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aB0bJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRKhJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRKhZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0bZSkEdmjauSjG8qO2A" name="EJBSecurityRoles">
-      <eAnnotations xmi:id="_-bRKhpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRKh5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aB0bpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRKiJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRKiZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0b5SkEdmjauSjG8qO2A" name="IsSingleThread">
-      <eAnnotations xmi:id="_-bRKipSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRKi5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aB0cJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRKjJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRKjZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0cZSkEdmjauSjG8qO2A" name="ServletRequestAttributesNames">
-      <eAnnotations xmi:id="_-bRKjpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRKj5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aB0cpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRKkJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRKkZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0c5SkEdmjauSjG8qO2A" name="ServletRequestDispatcherPath">
-      <eAnnotations xmi:id="_-bRKkpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRKk5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aB0dJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRKlJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRKlZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0dZSkEdmjauSjG8qO2A" name="ServletHeaderNames">
-      <eAnnotations xmi:id="_-bRKlpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRKl5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aB0dpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRKmJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRKmZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0d5SkEdmjauSjG8qO2A" name="MethodForCookie">
-      <eAnnotations xmi:id="_-bRKmpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRKm5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aB0eJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRKnJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRKnZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0eZSkEdmjauSjG8qO2A" name="EJBVersion" type="_-Z7t6pSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bRKnpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRKn5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <defaultValue xmi:type="uml:InstanceValue" xmi:id="_-aB0epSkEdmjauSjG8qO2A" instance="_-Z7t65SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRKoJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRKoZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0e5SkEdmjauSjG8qO2A" name="EJBPersistenceType" type="_-Z7tzJSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bRKopSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRKo5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <defaultValue xmi:type="uml:InstanceValue" xmi:id="_-aB0fJSkEdmjauSjG8qO2A" instance="_-Z7tzZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRKpJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRKpZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0fZSkEdmjauSjG8qO2A" name="ConstructorIs" type="_-Z7t1pSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bRKppSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRKp5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <defaultValue xmi:type="uml:InstanceValue" xmi:id="_-aB0fpSkEdmjauSjG8qO2A" instance="_-Z7t15SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRKqJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRKqZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0f5SkEdmjauSjG8qO2A" name="ReadOnly">
-      <eAnnotations xmi:id="_-bRKqpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRKq5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aB0gJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRKrJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRKrZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0gZSkEdmjauSjG8qO2A" name="Generate_XML_DD">
-      <eAnnotations xmi:id="_-bRKrpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRKr5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aB0gpSkEdmjauSjG8qO2A" value="true">
-        <eAnnotations xmi:id="_-bRKsJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRKsZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0g5SkEdmjauSjG8qO2A" name="ServletName">
-      <eAnnotations xmi:id="_-bRKspSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRKs5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aB0hJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRKtJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRKtZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0hZSkEdmjauSjG8qO2A" name="EJBXMLFilePath">
-      <eAnnotations xmi:id="_-bRKtpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRKt5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aB0hpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRKuJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRKuZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0h5SkEdmjauSjG8qO2A" name="EJBCnxFactory">
-      <eAnnotations xmi:id="_-bRKupSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRKu5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aB0iJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRKvJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRKvZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0iZSkEdmjauSjG8qO2A" name="ServletRequestDispatcher">
-      <eAnnotations xmi:id="_-bRKvpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRKv5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aB0ipSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRKwJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRKwZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0i5SkEdmjauSjG8qO2A" name="EJBReentrant">
-      <eAnnotations xmi:id="_-bRKwpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRKw5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aB0jJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRKxJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRKxZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0jZSkEdmjauSjG8qO2A" name="MethodForRequestParameters">
-      <eAnnotations xmi:id="_-bRKxpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRKx5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aB0jpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRKyJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRKyZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0j5SkEdmjauSjG8qO2A" name="EJBEnvironmentProperties">
-      <eAnnotations xmi:id="_-bRKypSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRKy5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aB0kJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRKzJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRKzZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0kZSkEdmjauSjG8qO2A" name="GenerateCode">
-      <eAnnotations xmi:id="_-bRKzpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRKz5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aB0kpSkEdmjauSjG8qO2A" value="true">
-        <eAnnotations xmi:id="_-bRK0JSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRK0ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0k5SkEdmjauSjG8qO2A" name="ServletRequestParameter">
-      <eAnnotations xmi:id="_-bRK0pSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRK05SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aB0lJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRK1JSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRK1ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0lZSkEdmjauSjG8qO2A" name="GenerateHTML">
-      <eAnnotations xmi:id="_-bRK1pSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRK15SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aB0lpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRK2JSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRK2ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aB0l5SkEdmjauSjG8qO2A" name="ServletRequestAttribute">
-      <eAnnotations xmi:id="_-bRK2pSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRK25SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aB0mJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRK3JSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRK3ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Extension" xmi:id="_-Z1nc5SkEdmjauSjG8qO2A" name="Actor_default__Class" memberEnd="_-Z1ndJSkEdmjauSjG8qO2A _-Z1ndpSkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bRK3pSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bRK35SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_-Z1ndJSkEdmjauSjG8qO2A" name="extension$default__Class" type="_-Z1nbZSkEdmjauSjG8qO2A" association="_-Z1nc5SkEdmjauSjG8qO2A" aggregation="composite">
-      <eAnnotations xmi:id="_-bRK4JSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRK4ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-Z1ndZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRK4pSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRK45SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </lowerValue>
-    </ownedEnd>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Extension" xmi:id="_-Z1nd5SkEdmjauSjG8qO2A" name="Class_default__Class" memberEnd="_-Z1neJSkEdmjauSjG8qO2A _-Z7tsZSkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bRK5JSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bRK5ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_-Z1neJSkEdmjauSjG8qO2A" name="extension$default__Class" type="_-Z1nbZSkEdmjauSjG8qO2A" association="_-Z1nd5SkEdmjauSjG8qO2A" aggregation="composite">
-      <eAnnotations xmi:id="_-bRK5pSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRK55SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-Z7tsJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRK6JSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRK6ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </lowerValue>
-    </ownedEnd>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Extension" xmi:id="_-Z7tspSkEdmjauSjG8qO2A" name="Enumeration_default__Class" memberEnd="_-Z7ts5SkEdmjauSjG8qO2A _-Z7ttZSkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bRK6pSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bRK65SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_-Z7ts5SkEdmjauSjG8qO2A" name="extension$default__Class" type="_-Z1nbZSkEdmjauSjG8qO2A" association="_-Z7tspSkEdmjauSjG8qO2A" aggregation="composite">
-      <eAnnotations xmi:id="_-bRK7JSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRK7ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-Z7ttJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRK7pSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRK75SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </lowerValue>
-    </ownedEnd>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Extension" xmi:id="_-Z7ttpSkEdmjauSjG8qO2A" name="Interface_default__Class" memberEnd="_-Z7tt5SkEdmjauSjG8qO2A _-Z7tuZSkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bRK8JSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bRK8ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_-Z7tt5SkEdmjauSjG8qO2A" name="extension$default__Class" type="_-Z1nbZSkEdmjauSjG8qO2A" association="_-Z7ttpSkEdmjauSjG8qO2A" aggregation="composite">
-      <eAnnotations xmi:id="_-bRK8pSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRK85SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-Z7tuJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRK9JSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRK9ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </lowerValue>
-    </ownedEnd>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Extension" xmi:id="_-Z7tupSkEdmjauSjG8qO2A" name="Signal_default__Class" memberEnd="_-Z7tu5SkEdmjauSjG8qO2A _-Z7tvZSkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bRK9pSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bRK95SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_-Z7tu5SkEdmjauSjG8qO2A" name="extension$default__Class" type="_-Z1nbZSkEdmjauSjG8qO2A" association="_-Z7tupSkEdmjauSjG8qO2A" aggregation="composite">
-      <eAnnotations xmi:id="_-bRK-JSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRK-ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-Z7tvJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRK-pSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRK-5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </lowerValue>
-    </ownedEnd>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Extension" xmi:id="_-Z7tvpSkEdmjauSjG8qO2A" name="PrimitiveType_default__Class" memberEnd="_-Z7tv5SkEdmjauSjG8qO2A _-Z7twZSkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bRK_JSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bRK_ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_-Z7tv5SkEdmjauSjG8qO2A" name="extension$default__Class" type="_-Z1nbZSkEdmjauSjG8qO2A" association="_-Z7tvpSkEdmjauSjG8qO2A" aggregation="composite">
-      <eAnnotations xmi:id="_-bRK_pSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRK_5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-Z7twJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLAJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLAZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </lowerValue>
-    </ownedEnd>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Enumeration" xmi:id="_-Z7twpSkEdmjauSjG8qO2A" name="default__ClassEJBSessionType_Set">
-    <eAnnotations xmi:id="_-bRLApSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bRLA5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedLiteral xmi:id="_-Z7tw5SkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-Z7txJSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Z7txZSkEdmjauSjG8qO2A" key="cardinal" value="200"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bRLBJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLBZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-Z7txpSkEdmjauSjG8qO2A" name="Stateless">
-      <eAnnotations xmi:id="_-Z7tx5SkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Z7tyJSkEdmjauSjG8qO2A" key="cardinal" value="201"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bRLBpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLB5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-Z7tyZSkEdmjauSjG8qO2A" name="Stateful">
-      <eAnnotations xmi:id="_-Z7typSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Z7ty5SkEdmjauSjG8qO2A" key="cardinal" value="202"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bRLCJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLCZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Enumeration" xmi:id="_-Z7tzJSkEdmjauSjG8qO2A" name="default__ClassEJBPersistenceType_Set">
-    <eAnnotations xmi:id="_-bRLCpSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bRLC5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedLiteral xmi:id="_-Z7tzZSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-Z7tzpSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Z7tz5SkEdmjauSjG8qO2A" key="cardinal" value="220"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bRLDJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLDZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-Z7t0JSkEdmjauSjG8qO2A" name="Bean">
-      <eAnnotations xmi:id="_-Z7t0ZSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Z7t0pSkEdmjauSjG8qO2A" key="cardinal" value="221"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bRLDpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLD5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-Z7t05SkEdmjauSjG8qO2A" name="Container">
-      <eAnnotations xmi:id="_-Z7t1JSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Z7t1ZSkEdmjauSjG8qO2A" key="cardinal" value="222"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bRLEJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLEZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Enumeration" xmi:id="_-Z7t1pSkEdmjauSjG8qO2A" name="default__ClassCtor_Set">
-    <eAnnotations xmi:id="_-bRLEpSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bRLE5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedLiteral xmi:id="_-Z7t15SkEdmjauSjG8qO2A" name="public">
-      <eAnnotations xmi:id="_-Z7t2JSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Z7t2ZSkEdmjauSjG8qO2A" key="cardinal" value="62"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bRLFJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLFZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-Z7t2pSkEdmjauSjG8qO2A" name="protected">
-      <eAnnotations xmi:id="_-Z7t25SkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Z7t3JSkEdmjauSjG8qO2A" key="cardinal" value="63"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bRLFpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLF5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-Z7t3ZSkEdmjauSjG8qO2A" name="private">
-      <eAnnotations xmi:id="_-Z7t3pSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Z7t35SkEdmjauSjG8qO2A" key="cardinal" value="64"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bRLGJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLGZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-Z7t4JSkEdmjauSjG8qO2A" name="package">
-      <eAnnotations xmi:id="_-Z7t4ZSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Z7t4pSkEdmjauSjG8qO2A" key="cardinal" value="65"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bRLGpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLG5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Enumeration" xmi:id="_-Z7t45SkEdmjauSjG8qO2A" name="default__ClassEJBTransactionType_Set">
-    <eAnnotations xmi:id="_-bRLHJSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bRLHZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedLiteral xmi:id="_-Z7t5JSkEdmjauSjG8qO2A" name="Container">
-      <eAnnotations xmi:id="_-Z7t5ZSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Z7t5pSkEdmjauSjG8qO2A" key="cardinal" value="211"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bRLHpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLH5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-Z7t55SkEdmjauSjG8qO2A" name="Bean">
-      <eAnnotations xmi:id="_-Z7t6JSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Z7t6ZSkEdmjauSjG8qO2A" key="cardinal" value="212"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bRLIJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLIZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Enumeration" xmi:id="_-Z7t6pSkEdmjauSjG8qO2A" name="default__ClassEJBVersion_Set">
-    <eAnnotations xmi:id="_-bRLIpSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bRLI5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedLiteral xmi:id="_-Z7t65SkEdmjauSjG8qO2A" name="2.0">
-      <eAnnotations xmi:id="_-Z7t7JSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Z7t7ZSkEdmjauSjG8qO2A" key="cardinal" value="230"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bRLJJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLJZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-Z7t7pSkEdmjauSjG8qO2A" name="1.x">
-      <eAnnotations xmi:id="_-Z7t75SkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-Z7t8JSkEdmjauSjG8qO2A" key="cardinal" value="231"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bRLJpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLJ5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Stereotype" xmi:id="_-aB0mZSkEdmjauSjG8qO2A" name="default__Project">
-    <eAnnotations xmi:id="_-aB0mpSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-aB0m5SkEdmjauSjG8qO2A" key="categoryName" value="Java"/>
-      <details xmi:id="_-aB0nJSkEdmjauSjG8qO2A" key="suppressed" value="true"/>
-      <details xmi:id="_-bRLKJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <eAnnotations xmi:id="_-aB0nZSkEdmjauSjG8qO2A" source="keywords">
-      <details xmi:id="_-aB0npSkEdmjauSjG8qO2A" key="taggedValueSet"/>
-    </eAnnotations>
-    <ownedAttribute xmi:id="_-aB0opSkEdmjauSjG8qO2A" name="base$Model" association="_-aB0n5SkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bRLKZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLKpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:Class" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m9ndba86EdiEh75YJ_3n8g"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH6-ZSkEdmjauSjG8qO2A" name="UserDefineTagApply3">
-      <eAnnotations xmi:id="_-bRLK5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLLJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH6-pSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLLZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLLpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH6-5SkEdmjauSjG8qO2A" name="JavadocSince">
-      <eAnnotations xmi:id="_-bRLL5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLMJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aH6_JSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLMZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLMpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH6_ZSkEdmjauSjG8qO2A" name="GlobalImports">
-      <eAnnotations xmi:id="_-bRLM5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLNJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH6_pSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLNZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLNpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH6_5SkEdmjauSjG8qO2A" name="GenerateDefaultReturnLine">
-      <eAnnotations xmi:id="_-bRLN5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLOJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aH7AJSkEdmjauSjG8qO2A" value="true">
-        <eAnnotations xmi:id="_-bRLOZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLOpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7AZSkEdmjauSjG8qO2A" name="InstanceVariablePrefix">
-      <eAnnotations xmi:id="_-bRLO5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLPJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7ApSkEdmjauSjG8qO2A" value="m_">
-        <eAnnotations xmi:id="_-bRLPZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLPpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7A5SkEdmjauSjG8qO2A" name="ShowCodegenDlg">
-      <eAnnotations xmi:id="_-bRLP5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLQJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aH7BJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLQZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLQpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7BZSkEdmjauSjG8qO2A" name="NoClassCustomDlg">
-      <eAnnotations xmi:id="_-bRLQ5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLRJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aH7BpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLRZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLRpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7B5SkEdmjauSjG8qO2A" name="SCCProjectName">
-      <eAnnotations xmi:id="_-bRLR5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLSJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7CJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLSZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLSpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7CZSkEdmjauSjG8qO2A" name="UseTabs">
-      <eAnnotations xmi:id="_-bRLS5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLTJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aH7CpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLTZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLTpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7C5SkEdmjauSjG8qO2A" name="DefaultAttributeDataType">
-      <eAnnotations xmi:id="_-bRLT5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLUJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7DJSkEdmjauSjG8qO2A" value="int">
-        <eAnnotations xmi:id="_-bRLUZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLUpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7DZSkEdmjauSjG8qO2A" name="LocalPrefix">
-      <eAnnotations xmi:id="_-bRLU5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLVJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7DpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLVZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLVpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7D5SkEdmjauSjG8qO2A" name="UserDefineJavaDocTags">
-      <eAnnotations xmi:id="_-bRLV5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLWJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7EJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLWZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLWpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7EZSkEdmjauSjG8qO2A" name="LocalHomeSuffix">
-      <eAnnotations xmi:id="_-bRLW5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLXJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7EpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLXZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLXpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7E5SkEdmjauSjG8qO2A" name="UserDefineTagText2">
-      <eAnnotations xmi:id="_-bRLX5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLYJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7FJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLYZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLYpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7FZSkEdmjauSjG8qO2A" name="HomeSuffix">
-      <eAnnotations xmi:id="_-bRLY5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLZJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7FpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLZZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLZpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7F5SkEdmjauSjG8qO2A" name="VAJavaWorkingFolder">
-      <eAnnotations xmi:id="_-bRLZ5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLaJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7GJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLaZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLapSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7GZSkEdmjauSjG8qO2A" name="DefaultEJBVersion">
-      <eAnnotations xmi:id="_-bRLa5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLbJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7GpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLbZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLbpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7G5SkEdmjauSjG8qO2A" name="MaxNumChars">
-      <eAnnotations xmi:id="_-bRLb5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLcJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8K86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralInteger" xmi:id="_-aH7HJSkEdmjauSjG8qO2A" value="80">
-        <eAnnotations xmi:id="_-bRLcZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLcpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7HZSkEdmjauSjG8qO2A" name="UserDefineTagName2">
-      <eAnnotations xmi:id="_-bRLc5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLdJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7HpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLdZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLdpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7H5SkEdmjauSjG8qO2A" name="ServletDTDLocation">
-      <eAnnotations xmi:id="_-bRLd5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLeJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7IJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLeZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLepSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7IZSkEdmjauSjG8qO2A" name="UserDefineTagApply1">
-      <eAnnotations xmi:id="_-bRLe5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLfJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7IpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLfZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLfpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7I5SkEdmjauSjG8qO2A" name="GenerateRoseID">
-      <eAnnotations xmi:id="_-bRLf5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLgJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aH7JJSkEdmjauSjG8qO2A" value="true">
-        <eAnnotations xmi:id="_-bRLgZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLgpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7JZSkEdmjauSjG8qO2A" name="StopOnError">
-      <eAnnotations xmi:id="_-bRLg5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLhJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aH7JpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLhZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLhpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7J5SkEdmjauSjG8qO2A" name="JavadocVersion">
-      <eAnnotations xmi:id="_-bRLh5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLiJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aH7KJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLiZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLipSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7KZSkEdmjauSjG8qO2A" name="JavadocDefaultAuthor">
-      <eAnnotations xmi:id="_-bRLi5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLjJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7KpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLjZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLjpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7K5SkEdmjauSjG8qO2A" name="OpenBraceMethodStyle">
-      <eAnnotations xmi:id="_-bRLj5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLkJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aH7LJSkEdmjauSjG8qO2A" value="true">
-        <eAnnotations xmi:id="_-bRLkZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLkpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7LZSkEdmjauSjG8qO2A" name="AsteriskCommentStyle">
-      <eAnnotations xmi:id="_-bRLk5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLlJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aH7LpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLlZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLlpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7L5SkEdmjauSjG8qO2A" name="PrimaryKeySuffix">
-      <eAnnotations xmi:id="_-bRLl5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLmJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7MJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLmZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLmpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7MZSkEdmjauSjG8qO2A" name="Editor" type="_-aH68pSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bRLm5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLnJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <defaultValue xmi:type="uml:InstanceValue" xmi:id="_-aH7MpSkEdmjauSjG8qO2A" instance="_-aH685SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLnZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLnpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7M5SkEdmjauSjG8qO2A" name="UserDefineTagApply2">
-      <eAnnotations xmi:id="_-bRLn5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLoJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7NJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLoZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLopSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7NZSkEdmjauSjG8qO2A" name="GenerateDefaultJ2EEJavadoc">
-      <eAnnotations xmi:id="_-bRLo5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLpJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aH7NpSkEdmjauSjG8qO2A" value="true">
-        <eAnnotations xmi:id="_-bRLpZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLppSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7N5SkEdmjauSjG8qO2A" name="SpacingItems">
-      <eAnnotations xmi:id="_-bRLp5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLqJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8K86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralInteger" xmi:id="_-aH7OJSkEdmjauSjG8qO2A" value="3">
-        <eAnnotations xmi:id="_-bRLqZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLqpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7OZSkEdmjauSjG8qO2A" name="EJBDTDLocation">
-      <eAnnotations xmi:id="_-bRLq5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLrJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7OpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLrZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLrpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7O5SkEdmjauSjG8qO2A" name="CreateMissingDirectories">
-      <eAnnotations xmi:id="_-bRLr5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLsJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aH7PJSkEdmjauSjG8qO2A" value="true">
-        <eAnnotations xmi:id="_-bRLsZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLspSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7PZSkEdmjauSjG8qO2A" name="UserDefineTagText3">
-      <eAnnotations xmi:id="_-bRLs5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLtJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7PpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLtZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLtpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7P5SkEdmjauSjG8qO2A" name="RemoteSuffix">
-      <eAnnotations xmi:id="_-bRLt5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLuJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7QJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLuZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLupSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7QZSkEdmjauSjG8qO2A" name="ReferenceClasspath">
-      <eAnnotations xmi:id="_-bRLu5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLvJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7QpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLvZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLvpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7Q5SkEdmjauSjG8qO2A" name="OpenBraceClassStyle">
-      <eAnnotations xmi:id="_-bRLv5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLwJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aH7RJSkEdmjauSjG8qO2A" value="true">
-        <eAnnotations xmi:id="_-bRLwZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLwpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7RZSkEdmjauSjG8qO2A" name="LocalSuffix">
-      <eAnnotations xmi:id="_-bRLw5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLxJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7RpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLxZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLxpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7R5SkEdmjauSjG8qO2A" name="VM" type="_-aB0o5SkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bRLx5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLyJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <defaultValue xmi:type="uml:InstanceValue" xmi:id="_-aH7SJSkEdmjauSjG8qO2A" instance="_-aB0pJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLyZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLypSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7SZSkEdmjauSjG8qO2A" name="DefaultServletVersion">
-      <eAnnotations xmi:id="_-bRLy5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRLzJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7SpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRLzZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRLzpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7S5SkEdmjauSjG8qO2A" name="UsePrefixes">
-      <eAnnotations xmi:id="_-bRLz5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRL0JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aH7TJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRL0ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRL0pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7TZSkEdmjauSjG8qO2A" name="BeanSuffix">
-      <eAnnotations xmi:id="_-bRL05SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRL1JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7TpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRL1ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRL1pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7T5SkEdmjauSjG8qO2A" name="BeanPrefix">
-      <eAnnotations xmi:id="_-bRL15SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRL2JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7UJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRL2ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRL2pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7UZSkEdmjauSjG8qO2A" name="SCCComment">
-      <eAnnotations xmi:id="_-bRL25SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRL3JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aH7UpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRL3ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRL3pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7U5SkEdmjauSjG8qO2A" name="RootDir">
-      <eAnnotations xmi:id="_-bRL35SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRL4JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7VJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRL4ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRL4pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7VZSkEdmjauSjG8qO2A" name="UserDefineTagText1">
-      <eAnnotations xmi:id="_-bRL45SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRL5JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7VpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRL5ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRL5pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7V5SkEdmjauSjG8qO2A" name="UserDefineTagName1">
-      <eAnnotations xmi:id="_-bRL55SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRL6JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7WJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRL6ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRL6pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7WZSkEdmjauSjG8qO2A" name="AutoSync">
-      <eAnnotations xmi:id="_-bRL65SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRL7JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aH7WpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRL7ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRL7pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7W5SkEdmjauSjG8qO2A" name="JavadocAuthor">
-      <eAnnotations xmi:id="_-bRL75SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRL8JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aH7XJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRL8ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRL8pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7XZSkEdmjauSjG8qO2A" name="RoseDefaultCommentStyle">
-      <eAnnotations xmi:id="_-bRL85SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRL9JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aH7XpSkEdmjauSjG8qO2A" value="true">
-        <eAnnotations xmi:id="_-bRL9ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRL9pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7X5SkEdmjauSjG8qO2A" name="SCCProjectSourceRoot">
-      <eAnnotations xmi:id="_-bRL95SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRL-JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7YJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRL-ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRL-pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7YZSkEdmjauSjG8qO2A" name="JavaCommentStyle">
-      <eAnnotations xmi:id="_-bRL-5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bRL_JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aH7YpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bRL_ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bRL_pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7Y5SkEdmjauSjG8qO2A" name="DefaultOperationReturnType">
-      <eAnnotations xmi:id="_-bRL_5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXREJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7ZJSkEdmjauSjG8qO2A" value="void">
-        <eAnnotations xmi:id="_-bXREZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXREpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7ZZSkEdmjauSjG8qO2A" name="UserDefineTagName3">
-      <eAnnotations xmi:id="_-bXRE5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRFJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7ZpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRFZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRFpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7Z5SkEdmjauSjG8qO2A" name="JavadocDefaultVersion">
-      <eAnnotations xmi:id="_-bXRF5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRGJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7aJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRGZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRGpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7aZSkEdmjauSjG8qO2A" name="NotShowRoseIDDlg">
-      <eAnnotations xmi:id="_-bXRG5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRHJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aH7apSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRHZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRHpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7a5SkEdmjauSjG8qO2A" name="RemotePrefix">
-      <eAnnotations xmi:id="_-bXRH5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRIJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aH7bJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRIZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRIpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aH7bZSkEdmjauSjG8qO2A" name="UseSpaces">
-      <eAnnotations xmi:id="_-bXRI5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRJJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aOBkJSkEdmjauSjG8qO2A" value="true">
-        <eAnnotations xmi:id="_-bXRJZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRJpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOBkZSkEdmjauSjG8qO2A" name="ClassVariablePrefix">
-      <eAnnotations xmi:id="_-bXRJ5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRKJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aOBkpSkEdmjauSjG8qO2A" value="s_">
-        <eAnnotations xmi:id="_-bXRKZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRKpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOBk5SkEdmjauSjG8qO2A" name="JavadocDefaultSince">
-      <eAnnotations xmi:id="_-bXRK5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRLJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aOBlJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRLZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRLpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOBlZSkEdmjauSjG8qO2A" name="SCCSelected">
-      <eAnnotations xmi:id="_-bXRL5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRMJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aOBlpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRMZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRMpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOBl5SkEdmjauSjG8qO2A" name="HomePrefix">
-      <eAnnotations xmi:id="_-bXRM5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRNJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aOBmJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRNZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRNpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOBmZSkEdmjauSjG8qO2A" name="LocalHomePrefix">
-      <eAnnotations xmi:id="_-bXRN5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXROJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aOBmpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXROZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXROpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOBm5SkEdmjauSjG8qO2A" name="ClassPath">
-      <eAnnotations xmi:id="_-bXRO5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRPJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aOBnJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRPZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRPpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOBnZSkEdmjauSjG8qO2A" name="SourceControl">
-      <eAnnotations xmi:id="_-bXRP5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRQJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aOBnpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRQZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRQpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOBn5SkEdmjauSjG8qO2A" name="JavadocNumAsterisks">
-      <eAnnotations xmi:id="_-bXRQ5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRRJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8K86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralInteger" xmi:id="_-aOBoJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRRZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRRpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOBoZSkEdmjauSjG8qO2A" name="PrimaryKeyPrefix">
-      <eAnnotations xmi:id="_-bXRR5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRSJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aOBopSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRSZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRSpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Extension" xmi:id="_-aB0n5SkEdmjauSjG8qO2A" name="Model_default__Project" memberEnd="_-aB0oJSkEdmjauSjG8qO2A _-aB0opSkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bXRS5SkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bXRTJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_-aB0oJSkEdmjauSjG8qO2A" name="extension$default__Project" type="_-aB0mZSkEdmjauSjG8qO2A" association="_-aB0n5SkEdmjauSjG8qO2A" aggregation="composite">
-      <eAnnotations xmi:id="_-bXRTZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRTpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-aB0oZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRT5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRUJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </lowerValue>
-    </ownedEnd>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Enumeration" xmi:id="_-aB0o5SkEdmjauSjG8qO2A" name="default__ProjectVMType">
-    <eAnnotations xmi:id="_-bXRUZSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bXRUpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedLiteral xmi:id="_-aB0pJSkEdmjauSjG8qO2A" name="Sun">
-      <eAnnotations xmi:id="_-aB0pZSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-aB0ppSkEdmjauSjG8qO2A" key="cardinal" value="200"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bXRU5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRVJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-aB0p5SkEdmjauSjG8qO2A" name="Microsoft">
-      <eAnnotations xmi:id="_-aB0qJSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-aB0qZSkEdmjauSjG8qO2A" key="cardinal" value="201"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bXRVZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRVpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-aB0qpSkEdmjauSjG8qO2A" name="IBM">
-      <eAnnotations xmi:id="_-aH68JSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-aH68ZSkEdmjauSjG8qO2A" key="cardinal" value="202"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bXRV5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRWJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Enumeration" xmi:id="_-aH68pSkEdmjauSjG8qO2A" name="default__ProjectEditorType">
-    <eAnnotations xmi:id="_-bXRWZSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bXRWpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedLiteral xmi:id="_-aH685SkEdmjauSjG8qO2A" name="BuiltIn">
-      <eAnnotations xmi:id="_-aH69JSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-aH69ZSkEdmjauSjG8qO2A" key="cardinal" value="100"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bXRW5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRXJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-aH69pSkEdmjauSjG8qO2A" name="WindowsShell">
-      <eAnnotations xmi:id="_-aH695SkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-aH6-JSkEdmjauSjG8qO2A" key="cardinal" value="101"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bXRXZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRXpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Stereotype" xmi:id="_-aOBo5SkEdmjauSjG8qO2A" name="Default_EJB__Class">
-    <eAnnotations xmi:id="_-aOBpJSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-aOBpZSkEdmjauSjG8qO2A" key="categoryName" value="Java"/>
-      <details xmi:id="_-aOBppSkEdmjauSjG8qO2A" key="suppressed" value="true"/>
-      <details xmi:id="_-bXRX5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <eAnnotations xmi:id="_-aOBp5SkEdmjauSjG8qO2A" source="keywords">
-      <details xmi:id="_-aOBqJSkEdmjauSjG8qO2A" key="taggedValueSet"/>
-    </eAnnotations>
-    <ownedAttribute xmi:id="_-aOBrJSkEdmjauSjG8qO2A" name="base$Actor" association="_-aOBqZSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bXRYJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRYZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:Class" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m9ndca86EdiEh75YJ_3n8g"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOBsJSkEdmjauSjG8qO2A" name="base$Class" association="_-aOBrZSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bXRYpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRY5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:Class" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m88uxq86EdiEh75YJ_3n8g"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOBtJSkEdmjauSjG8qO2A" name="base$Enumeration" association="_-aOBsZSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bXRZJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRZZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:Class" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m9bRea86EdiEh75YJ_3n8g"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOBuJSkEdmjauSjG8qO2A" name="base$Interface" association="_-aOBtZSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bXRZpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRZ5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:Class" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m9VJoq86EdiEh75YJ_3n8g"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOBvJSkEdmjauSjG8qO2A" name="base$Signal" association="_-aOBuZSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bXRaJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRaZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:Class" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m9VJza86EdiEh75YJ_3n8g"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOBwJSkEdmjauSjG8qO2A" name="base$PrimitiveType" association="_-aOBvZSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bXRapSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRa5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:Class" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m9bRsa86EdiEh75YJ_3n8g"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOB8JSkEdmjauSjG8qO2A" name="EJBNameInJAR">
-      <eAnnotations xmi:id="_-bXRbJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRbZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aOB8ZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRbpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRb5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOB8pSkEdmjauSjG8qO2A" name="GenerateInstanceInitializer">
-      <eAnnotations xmi:id="_-bXRcJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRcZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aOB85SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRcpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRc5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOB9JSkEdmjauSjG8qO2A" name="ServletgetInfo">
-      <eAnnotations xmi:id="_-bXRdJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRdZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aOB9ZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRdpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRd5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOB9pSkEdmjauSjG8qO2A" name="Final">
-      <eAnnotations xmi:id="_-bXReJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXReZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aOB95SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRepSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRe5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOB-JSkEdmjauSjG8qO2A" name="ServletIntHeader">
-      <eAnnotations xmi:id="_-bXRfJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRfZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aOB-ZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRfpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRf5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOB-pSkEdmjauSjG8qO2A" name="GenerateStaticInitializer">
-      <eAnnotations xmi:id="_-bXRgJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRgZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aOB-5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRgpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRg5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOB_JSkEdmjauSjG8qO2A" name="EJBCmpField">
-      <eAnnotations xmi:id="_-bXRhJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRhZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aOB_ZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRhpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRh5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOB_pSkEdmjauSjG8qO2A" name="MethodForHeaders">
-      <eAnnotations xmi:id="_-bXRiJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRiZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aOB_5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRipSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRi5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOCAJSkEdmjauSjG8qO2A" name="ServletContentType">
-      <eAnnotations xmi:id="_-bXRjJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRjZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aOCAZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRjpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRj5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOCApSkEdmjauSjG8qO2A" name="Static">
-      <eAnnotations xmi:id="_-bXRkJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRkZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aOCA5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRkpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRk5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOCBJSkEdmjauSjG8qO2A" name="MethodForRequestAttributes">
-      <eAnnotations xmi:id="_-bXRlJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRlZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aOCBZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRlpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRl5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOCBpSkEdmjauSjG8qO2A" name="ServletSecurityRoles">
-      <eAnnotations xmi:id="_-bXRmJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRmZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aOCB5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRmpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRm5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOCCJSkEdmjauSjG8qO2A" name="ServletInitParameter">
-      <eAnnotations xmi:id="_-bXRnJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRnZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aOCCZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRnpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRn5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOCCpSkEdmjauSjG8qO2A" name="DispatcherForward">
-      <eAnnotations xmi:id="_-bXRoJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRoZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aOCC5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRopSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRo5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOCDJSkEdmjauSjG8qO2A" name="ServletRequestParameterNames">
-      <eAnnotations xmi:id="_-bXRpJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRpZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aOCDZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRppSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRp5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOCDpSkEdmjauSjG8qO2A" name="ServletCookie">
-      <eAnnotations xmi:id="_-bXRqJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRqZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aOCD5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRqpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRq5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOCEJSkEdmjauSjG8qO2A" name="EJBReferences">
-      <eAnnotations xmi:id="_-bXRrJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRrZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aOCEZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRrpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRr5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOCEpSkEdmjauSjG8qO2A" name="ServletContextRef">
-      <eAnnotations xmi:id="_-bXRsJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRsZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aOCE5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRspSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRs5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOCFJSkEdmjauSjG8qO2A" name="GenerateDefaultConstructor">
-      <eAnnotations xmi:id="_-bXRtJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRtZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aOCFZSkEdmjauSjG8qO2A" value="true">
-        <eAnnotations xmi:id="_-bXRtpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRt5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOCFpSkEdmjauSjG8qO2A" name="ServletIsSecure">
-      <eAnnotations xmi:id="_-bXRuJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRuZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aOCF5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRupSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRu5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOCGJSkEdmjauSjG8qO2A" name="GenerateFinalizer">
-      <eAnnotations xmi:id="_-bXRvJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRvZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aOCGZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRvpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRv5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOCGpSkEdmjauSjG8qO2A" name="EJBSessionType" type="_-aOBwZSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bXRwJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRwZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <defaultValue xmi:type="uml:InstanceValue" xmi:id="_-aOCG5SkEdmjauSjG8qO2A" instance="_-aOBwpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRwpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRw5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aOCHJSkEdmjauSjG8qO2A" name="DisableAutoSync">
-      <eAnnotations xmi:id="_-bXRxJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRxZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aOCHZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRxpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRx5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aUIMJSkEdmjauSjG8qO2A" name="ServletInitParameterNames">
-      <eAnnotations xmi:id="_-bXRyJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRyZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aUIMZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRypSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRy5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aUIMpSkEdmjauSjG8qO2A" name="BMP_Extend_CMP">
-      <eAnnotations xmi:id="_-bXRzJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXRzZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aUIM5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXRzpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXRz5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aUINJSkEdmjauSjG8qO2A" name="EJBTransactionType" type="_-aOB4pSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bXR0JSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXR0ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <defaultValue xmi:type="uml:InstanceValue" xmi:id="_-aUINZSkEdmjauSjG8qO2A" instance="_-aOB45SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXR0pSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXR05SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aUINpSkEdmjauSjG8qO2A" name="DispatcherInclude">
-      <eAnnotations xmi:id="_-bXR1JSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXR1ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aUIN5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXR1pSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXR15SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aUIOJSkEdmjauSjG8qO2A" name="ServletXMLFilePath">
-      <eAnnotations xmi:id="_-bXR2JSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXR2ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aUIOZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXR2pSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXR25SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aUIOpSkEdmjauSjG8qO2A" name="ServletHeader">
-      <eAnnotations xmi:id="_-bXR3JSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXR3ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aUIO5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXR3pSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXR35SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aUIPJSkEdmjauSjG8qO2A" name="ServletDateHeader">
-      <eAnnotations xmi:id="_-bXR4JSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXR4ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aUIPZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXR4pSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXR45SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aUIPpSkEdmjauSjG8qO2A" name="Strictfp">
-      <eAnnotations xmi:id="_-bXR5JSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXR5ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aUIP5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXR5pSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXR55SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aUIQJSkEdmjauSjG8qO2A" name="EJBSessionSync">
-      <eAnnotations xmi:id="_-bXR6JSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXR6ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aUIQZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXR6pSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXR65SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aUIQpSkEdmjauSjG8qO2A" name="EJBSecurityRoles">
-      <eAnnotations xmi:id="_-bXR7JSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXR7ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aUIQ5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXR7pSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXR75SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aUIRJSkEdmjauSjG8qO2A" name="IsSingleThread">
-      <eAnnotations xmi:id="_-bXR8JSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXR8ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aUIRZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXR8pSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXR85SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aUIRpSkEdmjauSjG8qO2A" name="ServletRequestDispatcherPath">
-      <eAnnotations xmi:id="_-bXR9JSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXR9ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aUIR5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXR9pSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXR95SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aUISJSkEdmjauSjG8qO2A" name="ServletRequestAttributesNames">
-      <eAnnotations xmi:id="_-bXR-JSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXR-ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aUISZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXR-pSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXR-5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aUISpSkEdmjauSjG8qO2A" name="ServletHeaderNames">
-      <eAnnotations xmi:id="_-bXR_JSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXR_ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aUIS5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXR_pSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXR_5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aUITJSkEdmjauSjG8qO2A" name="MethodForCookie">
-      <eAnnotations xmi:id="_-bXSAJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXSAZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aUITZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXSApSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXSA5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aUITpSkEdmjauSjG8qO2A" name="EJBVersion" type="_-aOB6ZSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bXSBJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXSBZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <defaultValue xmi:type="uml:InstanceValue" xmi:id="_-aUIT5SkEdmjauSjG8qO2A" instance="_-aOB6pSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXSBpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXSB5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aaO0JSkEdmjauSjG8qO2A" name="EJBPersistenceType" type="_-aOB2JSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bXSCJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXSCZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <defaultValue xmi:type="uml:InstanceValue" xmi:id="_-aaO0ZSkEdmjauSjG8qO2A" instance="_-aOB2ZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXSCpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXSC5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aaO0pSkEdmjauSjG8qO2A" name="ConstructorIs" type="_-aOBy5SkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bXSDJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXSDZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <defaultValue xmi:type="uml:InstanceValue" xmi:id="_-aaO05SkEdmjauSjG8qO2A" instance="_-aOBzJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXSDpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXSD5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aaO1JSkEdmjauSjG8qO2A" name="ReadOnly">
-      <eAnnotations xmi:id="_-bXSEJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXSEZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aaO1ZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXSEpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXSE5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aaO1pSkEdmjauSjG8qO2A" name="Generate_XML_DD">
-      <eAnnotations xmi:id="_-bXSFJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXSFZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aaO15SkEdmjauSjG8qO2A" value="true">
-        <eAnnotations xmi:id="_-bXSFpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXSF5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aaO2JSkEdmjauSjG8qO2A" name="ServletName">
-      <eAnnotations xmi:id="_-bXSGJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXSGZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aaO2ZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXSGpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXSG5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aaO2pSkEdmjauSjG8qO2A" name="EJBXMLFilePath">
-      <eAnnotations xmi:id="_-bXSHJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXSHZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aaO25SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXSHpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXSH5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aaO3JSkEdmjauSjG8qO2A" name="EJBCnxFactory">
-      <eAnnotations xmi:id="_-bXSIJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXSIZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aaO3ZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXSIpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXSI5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aaO3pSkEdmjauSjG8qO2A" name="ServletRequestDispatcher">
-      <eAnnotations xmi:id="_-bXSJJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXSJZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aaO35SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXSJpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXSJ5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aaO4JSkEdmjauSjG8qO2A" name="EJBReentrant">
-      <eAnnotations xmi:id="_-bXSKJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXSKZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aaO4ZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXSKpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXSK5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aaO4pSkEdmjauSjG8qO2A" name="MethodForRequestParameters">
-      <eAnnotations xmi:id="_-bXSLJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXSLZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aaO45SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXSLpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXSL5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aaO5JSkEdmjauSjG8qO2A" name="EJBEnvironmentProperties">
-      <eAnnotations xmi:id="_-bXSMJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXSMZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aaO5ZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXSMpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXSM5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aaO5pSkEdmjauSjG8qO2A" name="GenerateCode">
-      <eAnnotations xmi:id="_-bXSNJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXSNZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aaO55SkEdmjauSjG8qO2A" value="true">
-        <eAnnotations xmi:id="_-bXSNpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXSN5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aaO6JSkEdmjauSjG8qO2A" name="ServletRequestParameter">
-      <eAnnotations xmi:id="_-bXSOJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXSOZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aaO6ZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXSOpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXSO5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aaO6pSkEdmjauSjG8qO2A" name="GenerateHTML">
-      <eAnnotations xmi:id="_-bXSPJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXSPZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aaO65SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXSPpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXSP5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aaO7JSkEdmjauSjG8qO2A" name="ServletRequestAttribute">
-      <eAnnotations xmi:id="_-bXSQJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXSQZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aaO7ZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXSQpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXSQ5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Extension" xmi:id="_-aOBqZSkEdmjauSjG8qO2A" name="Actor_Default_EJB__Class" memberEnd="_-aOBqpSkEdmjauSjG8qO2A _-aOBrJSkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bXSRJSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bXSRZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_-aOBqpSkEdmjauSjG8qO2A" name="extension$Default_EJB__Class" type="_-aOBo5SkEdmjauSjG8qO2A" association="_-aOBqZSkEdmjauSjG8qO2A" aggregation="composite">
-      <eAnnotations xmi:id="_-bXSRpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXSR5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-aOBq5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXSSJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXSSZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </lowerValue>
-    </ownedEnd>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Extension" xmi:id="_-aOBrZSkEdmjauSjG8qO2A" name="Class_Default_EJB__Class" memberEnd="_-aOBrpSkEdmjauSjG8qO2A _-aOBsJSkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bXSSpSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bXSS5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_-aOBrpSkEdmjauSjG8qO2A" name="extension$Default_EJB__Class" type="_-aOBo5SkEdmjauSjG8qO2A" association="_-aOBrZSkEdmjauSjG8qO2A" aggregation="composite">
-      <eAnnotations xmi:id="_-bXSTJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXSTZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-aOBr5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXSTpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXST5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </lowerValue>
-    </ownedEnd>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Extension" xmi:id="_-aOBsZSkEdmjauSjG8qO2A" name="Enumeration_Default_EJB__Class" memberEnd="_-aOBspSkEdmjauSjG8qO2A _-aOBtJSkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bXSUJSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bXSUZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_-aOBspSkEdmjauSjG8qO2A" name="extension$Default_EJB__Class" type="_-aOBo5SkEdmjauSjG8qO2A" association="_-aOBsZSkEdmjauSjG8qO2A" aggregation="composite">
-      <eAnnotations xmi:id="_-bXSUpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXSU5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-aOBs5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXSVJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXSVZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </lowerValue>
-    </ownedEnd>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Extension" xmi:id="_-aOBtZSkEdmjauSjG8qO2A" name="Interface_Default_EJB__Class" memberEnd="_-aOBtpSkEdmjauSjG8qO2A _-aOBuJSkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bXSVpSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bXSV5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_-aOBtpSkEdmjauSjG8qO2A" name="extension$Default_EJB__Class" type="_-aOBo5SkEdmjauSjG8qO2A" association="_-aOBtZSkEdmjauSjG8qO2A" aggregation="composite">
-      <eAnnotations xmi:id="_-bXSWJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXSWZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-aOBt5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXSWpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXSW5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </lowerValue>
-    </ownedEnd>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Extension" xmi:id="_-aOBuZSkEdmjauSjG8qO2A" name="Signal_Default_EJB__Class" memberEnd="_-aOBupSkEdmjauSjG8qO2A _-aOBvJSkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bXSXJSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bXSXZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_-aOBupSkEdmjauSjG8qO2A" name="extension$Default_EJB__Class" type="_-aOBo5SkEdmjauSjG8qO2A" association="_-aOBuZSkEdmjauSjG8qO2A" aggregation="composite">
-      <eAnnotations xmi:id="_-bXSXpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXSX5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-aOBu5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXSYJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXSYZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </lowerValue>
-    </ownedEnd>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Extension" xmi:id="_-aOBvZSkEdmjauSjG8qO2A" name="PrimitiveType_Default_EJB__Class" memberEnd="_-aOBvpSkEdmjauSjG8qO2A _-aOBwJSkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bXSYpSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bXSY5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_-aOBvpSkEdmjauSjG8qO2A" name="extension$Default_EJB__Class" type="_-aOBo5SkEdmjauSjG8qO2A" association="_-aOBvZSkEdmjauSjG8qO2A" aggregation="composite">
-      <eAnnotations xmi:id="_-bXSZJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXSZZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-aOBv5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bXSZpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bXSZ5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </lowerValue>
-    </ownedEnd>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Enumeration" xmi:id="_-aOBwZSkEdmjauSjG8qO2A" name="Default_EJB__ClassEJBSessionType_Set">
-    <eAnnotations xmi:id="_-bXSaJSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bXSaZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedLiteral xmi:id="_-aOBwpSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-aOBw5SkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-aOBxJSkEdmjauSjG8qO2A" key="cardinal" value="200"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bXSapSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXSa5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-aOBxZSkEdmjauSjG8qO2A" name="Stateless">
-      <eAnnotations xmi:id="_-aOBxpSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-aOBx5SkEdmjauSjG8qO2A" key="cardinal" value="201"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bXSbJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXSbZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-aOByJSkEdmjauSjG8qO2A" name="Stateful">
-      <eAnnotations xmi:id="_-aOByZSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-aOBypSkEdmjauSjG8qO2A" key="cardinal" value="202"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bXSbpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXSb5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Enumeration" xmi:id="_-aOBy5SkEdmjauSjG8qO2A" name="Default_EJB__ClassCtor_Set">
-    <eAnnotations xmi:id="_-bXScJSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bXScZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedLiteral xmi:id="_-aOBzJSkEdmjauSjG8qO2A" name="public">
-      <eAnnotations xmi:id="_-aOBzZSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-aOBzpSkEdmjauSjG8qO2A" key="cardinal" value="62"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bXScpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXSc5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-aOBz5SkEdmjauSjG8qO2A" name="protected">
-      <eAnnotations xmi:id="_-aOB0JSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-aOB0ZSkEdmjauSjG8qO2A" key="cardinal" value="63"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bXSdJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXSdZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-aOB0pSkEdmjauSjG8qO2A" name="private">
-      <eAnnotations xmi:id="_-aOB05SkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-aOB1JSkEdmjauSjG8qO2A" key="cardinal" value="64"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bXSdpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXSd5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-aOB1ZSkEdmjauSjG8qO2A" name="package">
-      <eAnnotations xmi:id="_-aOB1pSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-aOB15SkEdmjauSjG8qO2A" key="cardinal" value="65"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bXSeJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bXSeZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Enumeration" xmi:id="_-aOB2JSkEdmjauSjG8qO2A" name="Default_EJB__ClassEJBPersistenceType_Set">
-    <eAnnotations xmi:id="_-bXSepSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bXSe5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedLiteral xmi:id="_-aOB2ZSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-aOB2pSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-aOB25SkEdmjauSjG8qO2A" key="cardinal" value="220"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bdXsJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdXsZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-aOB3JSkEdmjauSjG8qO2A" name="Bean">
-      <eAnnotations xmi:id="_-aOB3ZSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-aOB3pSkEdmjauSjG8qO2A" key="cardinal" value="221"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bdXspSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdXs5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-aOB35SkEdmjauSjG8qO2A" name="Container">
-      <eAnnotations xmi:id="_-aOB4JSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-aOB4ZSkEdmjauSjG8qO2A" key="cardinal" value="222"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bdXtJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdXtZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Enumeration" xmi:id="_-aOB4pSkEdmjauSjG8qO2A" name="Default_EJB__ClassEJBTransactionType_Set">
-    <eAnnotations xmi:id="_-bdXtpSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bdXt5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedLiteral xmi:id="_-aOB45SkEdmjauSjG8qO2A" name="Container">
-      <eAnnotations xmi:id="_-aOB5JSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-aOB5ZSkEdmjauSjG8qO2A" key="cardinal" value="211"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bdXuJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdXuZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-aOB5pSkEdmjauSjG8qO2A" name="Bean">
-      <eAnnotations xmi:id="_-aOB55SkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-aOB6JSkEdmjauSjG8qO2A" key="cardinal" value="212"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bdXupSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdXu5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Enumeration" xmi:id="_-aOB6ZSkEdmjauSjG8qO2A" name="Default_EJB__ClassEJBVersion_Set">
-    <eAnnotations xmi:id="_-bdXvJSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bdXvZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedLiteral xmi:id="_-aOB6pSkEdmjauSjG8qO2A" name="2.0">
-      <eAnnotations xmi:id="_-aOB65SkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-aOB7JSkEdmjauSjG8qO2A" key="cardinal" value="230"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bdXvpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdXv5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-aOB7ZSkEdmjauSjG8qO2A" name="1.x">
-      <eAnnotations xmi:id="_-aOB7pSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-aOB75SkEdmjauSjG8qO2A" key="cardinal" value="231"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bdXwJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdXwZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Stereotype" xmi:id="_-aaO7pSkEdmjauSjG8qO2A" name="default__Operation">
-    <eAnnotations xmi:id="_-aaO75SkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-aaO8JSkEdmjauSjG8qO2A" key="categoryName" value="Java"/>
-      <details xmi:id="_-aaO8ZSkEdmjauSjG8qO2A" key="suppressed" value="true"/>
-      <details xmi:id="_-bdXwpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <eAnnotations xmi:id="_-aaO8pSkEdmjauSjG8qO2A" source="keywords">
-      <details xmi:id="_-aaO85SkEdmjauSjG8qO2A" key="taggedValueSet"/>
-    </eAnnotations>
-    <ownedAttribute xmi:id="_-aaO95SkEdmjauSjG8qO2A" name="base$Operation" association="_-aaO9JSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bdXw5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdXxJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:Class" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m9C2ja86EdiEh75YJ_3n8g"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aaO-JSkEdmjauSjG8qO2A" name="ReplaceExistingCode">
-      <eAnnotations xmi:id="_-bdXxZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdXxpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aaO-ZSkEdmjauSjG8qO2A" value="true">
-        <eAnnotations xmi:id="_-bdXx5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdXyJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aaO-pSkEdmjauSjG8qO2A" name="Final">
-      <eAnnotations xmi:id="_-bdXyZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdXypSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aaO-5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdXy5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdXzJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aaO_JSkEdmjauSjG8qO2A" name="GenerateFullyQualifiedReturn">
-      <eAnnotations xmi:id="_-bdXzZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdXzpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aaO_ZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdXz5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdX0JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aaO_pSkEdmjauSjG8qO2A" name="Strictfp">
-      <eAnnotations xmi:id="_-bdX0ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdX0pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aaO_5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdX05SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdX1JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aaPAJSkEdmjauSjG8qO2A" name="Native">
-      <eAnnotations xmi:id="_-bdX1ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdX1pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aaPAZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdX15SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdX2JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aaPApSkEdmjauSjG8qO2A" name="Abstract">
-      <eAnnotations xmi:id="_-bdX2ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdX2pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aaPA5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdX25SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdX3JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aaPBJSkEdmjauSjG8qO2A" name="Synchronized">
-      <eAnnotations xmi:id="_-bdX3ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdX3pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aaPBZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdX35SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdX4JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-aaPBpSkEdmjauSjG8qO2A" name="Static">
-      <eAnnotations xmi:id="_-bdX4ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdX4pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-aaPB5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdX45SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdX5JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Extension" xmi:id="_-aaO9JSkEdmjauSjG8qO2A" name="Operation_default__Operation" memberEnd="_-aaO9ZSkEdmjauSjG8qO2A _-aaO95SkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bdX5ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bdX5pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_-aaO9ZSkEdmjauSjG8qO2A" name="extension$default__Operation" type="_-aaO7pSkEdmjauSjG8qO2A" association="_-aaO9JSkEdmjauSjG8qO2A" aggregation="composite">
-      <eAnnotations xmi:id="_-bdX55SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdX6JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-aaO9pSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdX6ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdX6pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </lowerValue>
-    </ownedEnd>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Stereotype" xmi:id="_-aaPCJSkEdmjauSjG8qO2A" name="default__Role">
-    <eAnnotations xmi:id="_-aaPCZSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-aaPCpSkEdmjauSjG8qO2A" key="categoryName" value="Java"/>
-      <details xmi:id="_-aaPC5SkEdmjauSjG8qO2A" key="suppressed" value="true"/>
-      <details xmi:id="_-bdX65SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <eAnnotations xmi:id="_-aaPDJSkEdmjauSjG8qO2A" source="keywords">
-      <details xmi:id="_-aaPDZSkEdmjauSjG8qO2A" key="taggedValueSet"/>
-    </eAnnotations>
-    <ownedAttribute xmi:id="_-aaPEZSkEdmjauSjG8qO2A" name="base$Property" association="_-aaPDpSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bdX7JSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdX7ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:Class" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m9C1la86EdiEh75YJ_3n8g"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agVcpSkEdmjauSjG8qO2A" name="ReadWrite" type="_-aaPEpSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bdX7pSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdX75SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <defaultValue xmi:type="uml:InstanceValue" xmi:id="_-agVc5SkEdmjauSjG8qO2A" instance="_-aaPE5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdX8JSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdX8ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agVdJSkEdmjauSjG8qO2A" name="InitialValue">
-      <eAnnotations xmi:id="_-bdX8pSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdX85SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-agVdZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdX9JSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdX9ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agVdpSkEdmjauSjG8qO2A" name="PropertyType" type="_-aaPHJSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bdX9pSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdX95SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <defaultValue xmi:type="uml:InstanceValue" xmi:id="_-agVd5SkEdmjauSjG8qO2A" instance="_-aaPHZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdX-JSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdX-ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agVeJSkEdmjauSjG8qO2A" name="GenerateFullyQualifiedTypes">
-      <eAnnotations xmi:id="_-bdX-pSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdX-5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-agVeZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdX_JSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdX_ZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agVepSkEdmjauSjG8qO2A" name="Final">
-      <eAnnotations xmi:id="_-bdX_pSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdX_5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-agVe5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYAJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYAZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agVfJSkEdmjauSjG8qO2A" name="Transient">
-      <eAnnotations xmi:id="_-bdYApSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYA5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-agVfZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYBJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYBZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agVfpSkEdmjauSjG8qO2A" name="Volatile">
-      <eAnnotations xmi:id="_-bdYBpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYB5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-agVf5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYCJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYCZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agVgJSkEdmjauSjG8qO2A" name="IsNavigable">
-      <eAnnotations xmi:id="_-bdYCpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYC5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-agVgZSkEdmjauSjG8qO2A" value="true">
-        <eAnnotations xmi:id="_-bdYDJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYDZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agVgpSkEdmjauSjG8qO2A" name="IndividualChangeMgt">
-      <eAnnotations xmi:id="_-bdYDpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYD5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-agVg5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYEJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYEZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agVhJSkEdmjauSjG8qO2A" name="ContainerClass">
-      <eAnnotations xmi:id="_-bdYEpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYE5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-agVhZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYFJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYFZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Extension" xmi:id="_-aaPDpSkEdmjauSjG8qO2A" name="Property_default__Role" memberEnd="_-aaPD5SkEdmjauSjG8qO2A _-aaPEZSkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bdYFpSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bdYF5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_-aaPD5SkEdmjauSjG8qO2A" name="extension$default__Role" type="_-aaPCJSkEdmjauSjG8qO2A" association="_-aaPDpSkEdmjauSjG8qO2A" aggregation="composite">
-      <eAnnotations xmi:id="_-bdYGJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYGZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-aaPEJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYGpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYG5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </lowerValue>
-    </ownedEnd>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Enumeration" xmi:id="_-aaPEpSkEdmjauSjG8qO2A" name="default__RoleReadWrite_Set">
-    <eAnnotations xmi:id="_-bdYHJSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bdYHZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedLiteral xmi:id="_-aaPE5SkEdmjauSjG8qO2A" name="Read &amp; Write">
-      <eAnnotations xmi:id="_-aaPFJSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-aaPFZSkEdmjauSjG8qO2A" key="cardinal" value="81"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bdYHpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYH5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-aaPFpSkEdmjauSjG8qO2A" name="Read Only">
-      <eAnnotations xmi:id="_-aaPF5SkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-aaPGJSkEdmjauSjG8qO2A" key="cardinal" value="82"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bdYIJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYIZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-aaPGZSkEdmjauSjG8qO2A" name="Write Only">
-      <eAnnotations xmi:id="_-aaPGpSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-aaPG5SkEdmjauSjG8qO2A" key="cardinal" value="83"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bdYIpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYI5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Enumeration" xmi:id="_-aaPHJSkEdmjauSjG8qO2A" name="default__RoleBeanProperty_Set">
-    <eAnnotations xmi:id="_-bdYJJSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bdYJZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedLiteral xmi:id="_-aaPHZSkEdmjauSjG8qO2A" name="Not A Property">
-      <eAnnotations xmi:id="_-aaPHpSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-aaPH5SkEdmjauSjG8qO2A" key="cardinal" value="71"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bdYJpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYJ5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-aaPIJSkEdmjauSjG8qO2A" name="Simple">
-      <eAnnotations xmi:id="_-aaPIZSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-aaPIpSkEdmjauSjG8qO2A" key="cardinal" value="72"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bdYKJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYKZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-aaPI5SkEdmjauSjG8qO2A" name="Bound">
-      <eAnnotations xmi:id="_-aaPJJSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-aaPJZSkEdmjauSjG8qO2A" key="cardinal" value="73"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bdYKpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYK5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-aaPJpSkEdmjauSjG8qO2A" name="Constrained">
-      <eAnnotations xmi:id="_-agVcJSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-agVcZSkEdmjauSjG8qO2A" key="cardinal" value="74"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bdYLJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYLZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Stereotype" xmi:id="_-agVhpSkEdmjauSjG8qO2A" name="Http_Servlet__Class">
-    <eAnnotations xmi:id="_-agVh5SkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-agViJSkEdmjauSjG8qO2A" key="categoryName" value="Java"/>
-      <details xmi:id="_-agViZSkEdmjauSjG8qO2A" key="suppressed" value="true"/>
-      <details xmi:id="_-bdYLpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <eAnnotations xmi:id="_-agVipSkEdmjauSjG8qO2A" source="keywords">
-      <details xmi:id="_-agVi5SkEdmjauSjG8qO2A" key="taggedValueSet"/>
-    </eAnnotations>
-    <ownedAttribute xmi:id="_-agVj5SkEdmjauSjG8qO2A" name="base$Actor" association="_-agVjJSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bdYL5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYMJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:Class" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m9ndca86EdiEh75YJ_3n8g"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agVk5SkEdmjauSjG8qO2A" name="base$Class" association="_-agVkJSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bdYMZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYMpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:Class" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m88uxq86EdiEh75YJ_3n8g"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agVl5SkEdmjauSjG8qO2A" name="base$Enumeration" association="_-agVlJSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bdYM5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYNJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:Class" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m9bRea86EdiEh75YJ_3n8g"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agVm5SkEdmjauSjG8qO2A" name="base$Interface" association="_-agVmJSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bdYNZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYNpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:Class" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m9VJoq86EdiEh75YJ_3n8g"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agVn5SkEdmjauSjG8qO2A" name="base$Signal" association="_-agVnJSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bdYN5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYOJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:Class" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m9VJza86EdiEh75YJ_3n8g"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agVo5SkEdmjauSjG8qO2A" name="base$PrimitiveType" association="_-agVoJSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bdYOZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYOpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:Class" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m9bRsa86EdiEh75YJ_3n8g"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agV05SkEdmjauSjG8qO2A" name="EJBNameInJAR">
-      <eAnnotations xmi:id="_-bdYO5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYPJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-agV1JSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYPZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYPpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agV1ZSkEdmjauSjG8qO2A" name="GenerateInstanceInitializer">
-      <eAnnotations xmi:id="_-bdYP5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYQJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-agV1pSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYQZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYQpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agV15SkEdmjauSjG8qO2A" name="ServletgetInfo">
-      <eAnnotations xmi:id="_-bdYQ5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYRJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-agV2JSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYRZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYRpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agV2ZSkEdmjauSjG8qO2A" name="Final">
-      <eAnnotations xmi:id="_-bdYR5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYSJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-agV2pSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYSZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYSpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agV25SkEdmjauSjG8qO2A" name="ServletIntHeader">
-      <eAnnotations xmi:id="_-bdYS5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYTJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-agV3JSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYTZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYTpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agV3ZSkEdmjauSjG8qO2A" name="GenerateStaticInitializer">
-      <eAnnotations xmi:id="_-bdYT5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYUJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-agV3pSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYUZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYUpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agV35SkEdmjauSjG8qO2A" name="EJBCmpField">
-      <eAnnotations xmi:id="_-bdYU5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYVJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-agV4JSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYVZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYVpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agV4ZSkEdmjauSjG8qO2A" name="ServletContentType">
-      <eAnnotations xmi:id="_-bdYV5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYWJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-agV4pSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYWZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYWpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agV45SkEdmjauSjG8qO2A" name="MethodForHeaders">
-      <eAnnotations xmi:id="_-bdYW5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYXJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-agV5JSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYXZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYXpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agV5ZSkEdmjauSjG8qO2A" name="Static">
-      <eAnnotations xmi:id="_-bdYX5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYYJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-agV5pSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYYZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYYpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agV55SkEdmjauSjG8qO2A" name="MethodForRequestAttributes">
-      <eAnnotations xmi:id="_-bdYY5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYZJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-agV6JSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYZZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYZpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agV6ZSkEdmjauSjG8qO2A" name="ServletSecurityRoles">
-      <eAnnotations xmi:id="_-bdYZ5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYaJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-agV6pSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYaZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYapSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agV65SkEdmjauSjG8qO2A" name="ServletInitParameter">
-      <eAnnotations xmi:id="_-bdYa5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYbJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-agV7JSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYbZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYbpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agV7ZSkEdmjauSjG8qO2A" name="DispatcherForward">
-      <eAnnotations xmi:id="_-bdYb5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYcJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-agV7pSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYcZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYcpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agV75SkEdmjauSjG8qO2A" name="ServletRequestParameterNames">
-      <eAnnotations xmi:id="_-bdYc5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYdJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-agV8JSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYdZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYdpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agV8ZSkEdmjauSjG8qO2A" name="ServletCookie">
-      <eAnnotations xmi:id="_-bdYd5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYeJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-agV8pSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYeZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYepSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-agV85SkEdmjauSjG8qO2A" name="EJBReferences">
-      <eAnnotations xmi:id="_-bdYe5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYfJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-amcEJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYfZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYfpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-amcEZSkEdmjauSjG8qO2A" name="ServletContextRef">
-      <eAnnotations xmi:id="_-bdYf5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYgJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-amcEpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYgZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYgpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-amcE5SkEdmjauSjG8qO2A" name="GenerateDefaultConstructor">
-      <eAnnotations xmi:id="_-bdYg5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYhJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-amcFJSkEdmjauSjG8qO2A" value="true">
-        <eAnnotations xmi:id="_-bdYhZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYhpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-amcFZSkEdmjauSjG8qO2A" name="ServletIsSecure">
-      <eAnnotations xmi:id="_-bdYh5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYiJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-amcFpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYiZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYipSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-amcF5SkEdmjauSjG8qO2A" name="GenerateFinalizer">
-      <eAnnotations xmi:id="_-bdYi5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYjJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-amcGJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYjZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYjpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-amcGZSkEdmjauSjG8qO2A" name="EJBSessionType" type="_-agVpJSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bdYj5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYkJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <defaultValue xmi:type="uml:InstanceValue" xmi:id="_-amcGpSkEdmjauSjG8qO2A" instance="_-agVpZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYkZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYkpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-amcG5SkEdmjauSjG8qO2A" name="DisableAutoSync">
-      <eAnnotations xmi:id="_-bdYk5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYlJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-amcHJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYlZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYlpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-amcHZSkEdmjauSjG8qO2A" name="ServletInitParameterNames">
-      <eAnnotations xmi:id="_-bdYl5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYmJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-amcHpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYmZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYmpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-amcH5SkEdmjauSjG8qO2A" name="BMP_Extend_CMP">
-      <eAnnotations xmi:id="_-bdYm5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYnJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-amcIJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYnZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYnpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-amcIZSkEdmjauSjG8qO2A" name="EJBTransactionType" type="_-agVxZSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bdYn5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYoJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <defaultValue xmi:type="uml:InstanceValue" xmi:id="_-amcIpSkEdmjauSjG8qO2A" instance="_-agVxpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYoZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYopSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-amcI5SkEdmjauSjG8qO2A" name="DispatcherInclude">
-      <eAnnotations xmi:id="_-bdYo5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYpJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-amcJJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYpZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYppSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-amcJZSkEdmjauSjG8qO2A" name="ServletHeader">
-      <eAnnotations xmi:id="_-bdYp5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYqJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-amcJpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYqZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYqpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-amcJ5SkEdmjauSjG8qO2A" name="ServletXMLFilePath">
-      <eAnnotations xmi:id="_-bdYq5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYrJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-amcKJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYrZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYrpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-amcKZSkEdmjauSjG8qO2A" name="ServletDateHeader">
-      <eAnnotations xmi:id="_-bdYr5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYsJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-amcKpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYsZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYspSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-amcK5SkEdmjauSjG8qO2A" name="Strictfp">
-      <eAnnotations xmi:id="_-bdYs5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYtJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-amcLJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYtZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYtpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-amcLZSkEdmjauSjG8qO2A" name="EJBSessionSync">
-      <eAnnotations xmi:id="_-bdYt5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYuJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-amcLpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYuZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYupSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-amcL5SkEdmjauSjG8qO2A" name="EJBSecurityRoles">
-      <eAnnotations xmi:id="_-bdYu5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYvJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-amcMJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYvZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYvpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-amcMZSkEdmjauSjG8qO2A" name="IsSingleThread">
-      <eAnnotations xmi:id="_-bdYv5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYwJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-amcMpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYwZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYwpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-amcM5SkEdmjauSjG8qO2A" name="ServletRequestAttributesNames">
-      <eAnnotations xmi:id="_-bdYw5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYxJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-amcNJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYxZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYxpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-amcNZSkEdmjauSjG8qO2A" name="ServletRequestDispatcherPath">
-      <eAnnotations xmi:id="_-bdYx5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYyJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-amcNpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYyZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYypSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-amcN5SkEdmjauSjG8qO2A" name="ServletHeaderNames">
-      <eAnnotations xmi:id="_-bdYy5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdYzJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-amcOJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdYzZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdYzpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-amcOZSkEdmjauSjG8qO2A" name="MethodForCookie">
-      <eAnnotations xmi:id="_-bdYz5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdY0JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-amcOpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdY0ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdY0pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-amcO5SkEdmjauSjG8qO2A" name="EJBVersion" type="_-agVzJSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bdY05SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdY1JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <defaultValue xmi:type="uml:InstanceValue" xmi:id="_-amcPJSkEdmjauSjG8qO2A" instance="_-agVzZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdY1ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdY1pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-amcPZSkEdmjauSjG8qO2A" name="EJBPersistenceType" type="_-agVrpSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bdY15SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdY2JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <defaultValue xmi:type="uml:InstanceValue" xmi:id="_-amcPpSkEdmjauSjG8qO2A" instance="_-agVr5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdY2ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdY2pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-amcP5SkEdmjauSjG8qO2A" name="ConstructorIs" type="_-agVuJSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bdY25SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdY3JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <defaultValue xmi:type="uml:InstanceValue" xmi:id="_-amcQJSkEdmjauSjG8qO2A" instance="_-agVuZSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdY3ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdY3pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-amcQZSkEdmjauSjG8qO2A" name="ReadOnly">
-      <eAnnotations xmi:id="_-bdY35SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdY4JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-amcQpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdY4ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdY4pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-amcQ5SkEdmjauSjG8qO2A" name="Generate_XML_DD">
-      <eAnnotations xmi:id="_-bdY45SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdY5JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-asisJSkEdmjauSjG8qO2A" value="true">
-        <eAnnotations xmi:id="_-bdY5ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdY5pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-asisZSkEdmjauSjG8qO2A" name="ServletName">
-      <eAnnotations xmi:id="_-bdY55SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdY6JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-asispSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdY6ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdY6pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-asis5SkEdmjauSjG8qO2A" name="EJBXMLFilePath">
-      <eAnnotations xmi:id="_-bdY65SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdY7JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-asitJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdY7ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdY7pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-asitZSkEdmjauSjG8qO2A" name="EJBCnxFactory">
-      <eAnnotations xmi:id="_-bdY75SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdY8JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-asitpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdY8ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdY8pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-asit5SkEdmjauSjG8qO2A" name="ServletRequestDispatcher">
-      <eAnnotations xmi:id="_-bdY85SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdY9JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-asiuJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdY9ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdY9pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-asiuZSkEdmjauSjG8qO2A" name="EJBReentrant">
-      <eAnnotations xmi:id="_-bdY95SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdY-JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-asiupSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdY-ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdY-pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-asiu5SkEdmjauSjG8qO2A" name="MethodForRequestParameters">
-      <eAnnotations xmi:id="_-bdY-5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdY_JSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-asivJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdY_ZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdY_pSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-asivZSkEdmjauSjG8qO2A" name="EJBEnvironmentProperties">
-      <eAnnotations xmi:id="_-bdY_5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdZAJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-asivpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdZAZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdZApSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-asiv5SkEdmjauSjG8qO2A" name="GenerateCode">
-      <eAnnotations xmi:id="_-bdZA5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdZBJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-asiwJSkEdmjauSjG8qO2A" value="true">
-        <eAnnotations xmi:id="_-bdZBZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdZBpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-asiwZSkEdmjauSjG8qO2A" name="ServletRequestParameter">
-      <eAnnotations xmi:id="_-bdZB5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdZCJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-asiwpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdZCZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdZCpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-asiw5SkEdmjauSjG8qO2A" name="GenerateHTML">
-      <eAnnotations xmi:id="_-bdZC5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdZDJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_-asixJSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdZDZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdZDpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-asixZSkEdmjauSjG8qO2A" name="ServletRequestAttribute">
-      <eAnnotations xmi:id="_-bdZD5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bdZEJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-asixpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bdZEZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bdZEpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Extension" xmi:id="_-agVjJSkEdmjauSjG8qO2A" name="Actor_Http_Servlet__Class" memberEnd="_-agVjZSkEdmjauSjG8qO2A _-agVj5SkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bjeUJSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bjeUZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_-agVjZSkEdmjauSjG8qO2A" name="extension$Http_Servlet__Class" type="_-agVhpSkEdmjauSjG8qO2A" association="_-agVjJSkEdmjauSjG8qO2A" aggregation="composite">
-      <eAnnotations xmi:id="_-bjeUpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bjeU5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-agVjpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bjeVJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bjeVZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </lowerValue>
-    </ownedEnd>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Extension" xmi:id="_-agVkJSkEdmjauSjG8qO2A" name="Class_Http_Servlet__Class" memberEnd="_-agVkZSkEdmjauSjG8qO2A _-agVk5SkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bjeVpSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bjeV5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_-agVkZSkEdmjauSjG8qO2A" name="extension$Http_Servlet__Class" type="_-agVhpSkEdmjauSjG8qO2A" association="_-agVkJSkEdmjauSjG8qO2A" aggregation="composite">
-      <eAnnotations xmi:id="_-bjeWJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bjeWZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-agVkpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bjeWpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bjeW5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </lowerValue>
-    </ownedEnd>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Extension" xmi:id="_-agVlJSkEdmjauSjG8qO2A" name="Enumeration_Http_Servlet__Class" memberEnd="_-agVlZSkEdmjauSjG8qO2A _-agVl5SkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bjeXJSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bjeXZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_-agVlZSkEdmjauSjG8qO2A" name="extension$Http_Servlet__Class" type="_-agVhpSkEdmjauSjG8qO2A" association="_-agVlJSkEdmjauSjG8qO2A" aggregation="composite">
-      <eAnnotations xmi:id="_-bjeXpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bjeX5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-agVlpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bjeYJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bjeYZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </lowerValue>
-    </ownedEnd>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Extension" xmi:id="_-agVmJSkEdmjauSjG8qO2A" name="Interface_Http_Servlet__Class" memberEnd="_-agVmZSkEdmjauSjG8qO2A _-agVm5SkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bjeYpSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bjeY5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_-agVmZSkEdmjauSjG8qO2A" name="extension$Http_Servlet__Class" type="_-agVhpSkEdmjauSjG8qO2A" association="_-agVmJSkEdmjauSjG8qO2A" aggregation="composite">
-      <eAnnotations xmi:id="_-bjeZJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bjeZZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-agVmpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bjeZpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bjeZ5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </lowerValue>
-    </ownedEnd>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Extension" xmi:id="_-agVnJSkEdmjauSjG8qO2A" name="Signal_Http_Servlet__Class" memberEnd="_-agVnZSkEdmjauSjG8qO2A _-agVn5SkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bjeaJSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bjeaZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_-agVnZSkEdmjauSjG8qO2A" name="extension$Http_Servlet__Class" type="_-agVhpSkEdmjauSjG8qO2A" association="_-agVnJSkEdmjauSjG8qO2A" aggregation="composite">
-      <eAnnotations xmi:id="_-bjeapSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bjea5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-agVnpSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bjebJSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bjebZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </lowerValue>
-    </ownedEnd>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Extension" xmi:id="_-agVoJSkEdmjauSjG8qO2A" name="PrimitiveType_Http_Servlet__Class" memberEnd="_-agVoZSkEdmjauSjG8qO2A _-agVo5SkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bjebpSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bjeb5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_-agVoZSkEdmjauSjG8qO2A" name="extension$Http_Servlet__Class" type="_-agVhpSkEdmjauSjG8qO2A" association="_-agVoJSkEdmjauSjG8qO2A" aggregation="composite">
-      <eAnnotations xmi:id="_-bjecJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bjecZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-agVopSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bjecpSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bjec5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </lowerValue>
-    </ownedEnd>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Enumeration" xmi:id="_-agVpJSkEdmjauSjG8qO2A" name="Http_Servlet__ClassEJBSessionType_Set">
-    <eAnnotations xmi:id="_-bjedJSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bjedZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedLiteral xmi:id="_-agVpZSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-agVppSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-agVp5SkEdmjauSjG8qO2A" key="cardinal" value="200"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bjedpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bjed5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-agVqJSkEdmjauSjG8qO2A" name="Stateless">
-      <eAnnotations xmi:id="_-agVqZSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-agVqpSkEdmjauSjG8qO2A" key="cardinal" value="201"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bjeeJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bjeeZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-agVq5SkEdmjauSjG8qO2A" name="Stateful">
-      <eAnnotations xmi:id="_-agVrJSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-agVrZSkEdmjauSjG8qO2A" key="cardinal" value="202"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bjeepSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bjee5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Enumeration" xmi:id="_-agVrpSkEdmjauSjG8qO2A" name="Http_Servlet__ClassEJBPersistenceType_Set">
-    <eAnnotations xmi:id="_-bjefJSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bjefZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedLiteral xmi:id="_-agVr5SkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-agVsJSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-agVsZSkEdmjauSjG8qO2A" key="cardinal" value="220"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bjefpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bjef5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-agVspSkEdmjauSjG8qO2A" name="Bean">
-      <eAnnotations xmi:id="_-agVs5SkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-agVtJSkEdmjauSjG8qO2A" key="cardinal" value="221"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bjegJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bjegZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-agVtZSkEdmjauSjG8qO2A" name="Container">
-      <eAnnotations xmi:id="_-agVtpSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-agVt5SkEdmjauSjG8qO2A" key="cardinal" value="222"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bjegpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bjeg5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Enumeration" xmi:id="_-agVuJSkEdmjauSjG8qO2A" name="Http_Servlet__ClassCtor_Set">
-    <eAnnotations xmi:id="_-bjehJSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bjehZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedLiteral xmi:id="_-agVuZSkEdmjauSjG8qO2A" name="public">
-      <eAnnotations xmi:id="_-agVupSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-agVu5SkEdmjauSjG8qO2A" key="cardinal" value="62"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bjehpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bjeh5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-agVvJSkEdmjauSjG8qO2A" name="protected">
-      <eAnnotations xmi:id="_-agVvZSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-agVvpSkEdmjauSjG8qO2A" key="cardinal" value="63"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bjeiJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bjeiZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-agVv5SkEdmjauSjG8qO2A" name="private">
-      <eAnnotations xmi:id="_-agVwJSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-agVwZSkEdmjauSjG8qO2A" key="cardinal" value="64"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bjeipSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bjei5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-agVwpSkEdmjauSjG8qO2A" name="package">
-      <eAnnotations xmi:id="_-agVw5SkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-agVxJSkEdmjauSjG8qO2A" key="cardinal" value="65"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bjejJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bjejZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Enumeration" xmi:id="_-agVxZSkEdmjauSjG8qO2A" name="Http_Servlet__ClassEJBTransactionType_Set">
-    <eAnnotations xmi:id="_-bjejpSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bjej5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedLiteral xmi:id="_-agVxpSkEdmjauSjG8qO2A" name="Container">
-      <eAnnotations xmi:id="_-agVx5SkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-agVyJSkEdmjauSjG8qO2A" key="cardinal" value="211"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bjekJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bjekZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-agVyZSkEdmjauSjG8qO2A" name="Bean">
-      <eAnnotations xmi:id="_-agVypSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-agVy5SkEdmjauSjG8qO2A" key="cardinal" value="212"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bjekpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bjek5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Enumeration" xmi:id="_-agVzJSkEdmjauSjG8qO2A" name="Http_Servlet__ClassEJBVersion_Set">
-    <eAnnotations xmi:id="_-bjelJSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bjelZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedLiteral xmi:id="_-agVzZSkEdmjauSjG8qO2A" name="2.0">
-      <eAnnotations xmi:id="_-agVzpSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-agVz5SkEdmjauSjG8qO2A" key="cardinal" value="230"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bjelpSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bjel5SkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-    <ownedLiteral xmi:id="_-agV0JSkEdmjauSjG8qO2A" name="1.x">
-      <eAnnotations xmi:id="_-agV0ZSkEdmjauSjG8qO2A" source="roseProperties">
-        <details xmi:id="_-agV0pSkEdmjauSjG8qO2A" key="cardinal" value="231"/>
-      </eAnnotations>
-      <eAnnotations xmi:id="_-bjemJSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bjemZSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-    </ownedLiteral>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Stereotype" xmi:id="_-asix5SkEdmjauSjG8qO2A" name="default__ModuleSpec">
-    <eAnnotations xmi:id="_-asiyJSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-asiyZSkEdmjauSjG8qO2A" key="categoryName" value="Java"/>
-      <details xmi:id="_-asiypSkEdmjauSjG8qO2A" key="suppressed" value="true"/>
-      <details xmi:id="_-bjempSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <eAnnotations xmi:id="_-asiy5SkEdmjauSjG8qO2A" source="keywords">
-      <details xmi:id="_-asizJSkEdmjauSjG8qO2A" key="taggedValueSet"/>
-    </eAnnotations>
-    <ownedAttribute xmi:id="_-asi0JSkEdmjauSjG8qO2A" name="base$Component" association="_-asizZSkEdmjauSjG8qO2A">
-      <eAnnotations xmi:id="_-bjem5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bjenJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:Class" href="pathmap://UML2_METAMODELS/UML2.metamodel.uml2#_m9VJjK86EdiEh75YJ_3n8g"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-asi0ZSkEdmjauSjG8qO2A" name="CmIdentification">
-      <eAnnotations xmi:id="_-bjenZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bjenpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-asi0pSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bjen5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bjeoJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_-asi05SkEdmjauSjG8qO2A" name="CopyrightNotice">
-      <eAnnotations xmi:id="_-bjeoZSkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bjeopSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <defaultValue xmi:type="uml:LiteralString" xmi:id="_-asi1JSkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bjeo5SkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bjepJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </defaultValue>
-    </ownedAttribute>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Extension" xmi:id="_-asizZSkEdmjauSjG8qO2A" name="Component_default__ModuleSpec" memberEnd="_-asizpSkEdmjauSjG8qO2A _-asi0JSkEdmjauSjG8qO2A">
-    <eAnnotations xmi:id="_-bjepZSkEdmjauSjG8qO2A" source="uml2.extensions">
-      <details xmi:id="_-bjeppSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-    </eAnnotations>
-    <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_-asizpSkEdmjauSjG8qO2A" name="extension$default__ModuleSpec" type="_-asix5SkEdmjauSjG8qO2A" association="_-asizZSkEdmjauSjG8qO2A" aggregation="composite">
-      <eAnnotations xmi:id="_-bjep5SkEdmjauSjG8qO2A" source="uml2.extensions">
-        <details xmi:id="_-bjeqJSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-      </eAnnotations>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-asiz5SkEdmjauSjG8qO2A">
-        <eAnnotations xmi:id="_-bjeqZSkEdmjauSjG8qO2A" source="uml2.extensions">
-          <details xmi:id="_-bjeqpSkEdmjauSjG8qO2A" key="addedInVersion" value="0"/>
-        </eAnnotations>
-      </lowerValue>
-    </ownedEnd>
-  </ownedMember>
-</uml:Profile>
diff --git a/plugins/org.eclipse.wst.common.modulecore/model/Java.properties b/plugins/org.eclipse.wst.common.modulecore/model/Java.properties
deleted file mode 100644
index 563b5df..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/model/Java.properties
+++ /dev/null
@@ -1,428 +0,0 @@
-###############################################################################
-# Copyright (c) 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
-###############################################################################
-#Mon Mar 14 11:20:27 EST 2005
-Java__default__Class__EJBReferences=EJBReferences
-Java__default__Project__JavadocDefaultVersion=JavadocDefaultVersion
-Java__Http_Servlet__Class__GenerateInstanceInitializer=GenerateInstanceInitializer
-Java__Http_Servlet__Class__ServletInitParameterNames=ServletInitParameterNames
-Java__default__ProjectEditorType__WindowsShell=WindowsShell
-Java__Http_Servlet__Class__EJBSessionSync=EJBSessionSync
-Java__default__ProjectVMType__Sun=Sun
-Java__default__Role=default
-Java__default__ProjectVMType__Microsoft=Microsoft
-Java__Http_Servlet__Class__MethodForRequestParameters=MethodForRequestParameters
-Java__default__Project__SCCComment=SCCComment
-Java__Default_Servlet__Class__MethodForRequestAttributes=MethodForRequestAttributes
-Java__default__Class__EJBPersistenceType=EJBPersistenceType
-Java__Default_EJB__Class__IsSingleThread=IsSingleThread
-Java__default__Class__ServletRequestAttributesNames=ServletRequestAttributesNames
-Java__Default_EJB__Class__ServletInitParameter=ServletInitParameter
-Java__Default_Servlet__Class__GenerateHTML=GenerateHTML
-Java__default__Project__StopOnError=StopOnError
-Java__default__RoleReadWrite_Set__Read\ Only=Read Only
-Java__default__ClassCtor_Set__public=public
-Java__Default_EJB__Class__EJBCmpField=EJBCmpField
-Java__Default_Servlet__Class__MethodForHeaders=MethodForHeaders
-Java__Http_Servlet__Class__MethodForHeaders=MethodForHeaders
-Java__default__Operation__Static=Static
-Java__Default_Servlet__ClassCtor_Set=Ctor_Set
-Java__Default_EJB__Class__EJBReferences=EJBReferences
-Java__Default_EJB__Class__ServletIntHeader=ServletIntHeader
-Java__default__Class__DispatcherForward=DispatcherForward
-Java__Http_Servlet__ClassCtor_Set__private=private
-Java__default__Project__SCCProjectName=SCCProjectName
-Java__Default_Servlet__Class__ServletCookie=ServletCookie
-Java__default__Role__PropertyType=PropertyType
-Java__default__Class__EJBNameInJAR=EJBNameInJAR
-Java__Default_EJB__Class__MethodForCookie=MethodForCookie
-Java__Default_EJB__ClassEJBTransactionType_Set__Container=Container
-Java__Http_Servlet__Class__ServletCookie=ServletCookie
-Java__default__Class__EJBCmpField=EJBCmpField
-Java__Default_Servlet__Class__Strictfp=Strictfp
-Java__default__Operation=default
-Java__default__Project__UseSpaces=UseSpaces
-Java__default__Class__DispatcherInclude=DispatcherInclude
-Java__default__Class__ServletName=ServletName
-Java__Http_Servlet__Class__ServletIsSecure=ServletIsSecure
-Java__Default_EJB__Class__DispatcherForward=DispatcherForward
-Java__Http_Servlet__Class__EJBSessionType=EJBSessionType
-Java__default__Class__EJBTransactionType=EJBTransactionType
-Java__Http_Servlet__Class__EJBVersion=EJBVersion
-Java__Default_Servlet__Class__ServletXMLFilePath=ServletXMLFilePath
-Java__Default_Servlet__ClassEJBVersion_Set=EJBVersion_Set
-Java__Default_EJB__Class__DispatcherInclude=DispatcherInclude
-Java__default__Project__PrimaryKeySuffix=PrimaryKeySuffix
-Java__default__Operation__GenerateFullyQualifiedReturn=GenerateFullyQualifiedReturn
-Java__Default_Servlet__Class__ServletRequestParameter=ServletRequestParameter
-Java__default__Project__RemoteSuffix=RemoteSuffix
-Java__default__Attribute__Volatile=Volatile
-Java__Http_Servlet__Class__ServletInitParameter=ServletInitParameter
-Java__default__RoleReadWrite_Set__Write\ Only=Write Only
-Java__default__Project__VAJavaWorkingFolder=VAJavaWorkingFolder
-Java__Default_Servlet__ClassCtor_Set__private=private
-Java__Http_Servlet__Class__EJBEnvironmentProperties=EJBEnvironmentProperties
-Java__Default_EJB__Class__EJBCnxFactory=EJBCnxFactory
-Java__default__AttributeReadWrite_Set=Read/Write_Set
-Java__Default_Servlet__Class__ServletInitParameterNames=ServletInitParameterNames
-Java__default__AttributeReadWrite_Set__Write\ Only=Write Only
-Java__default__Project__BeanSuffix=BeanSuffix
-Java__default__Class__ServletHeader=ServletHeader
-Java__default__AttributeBeanProperty_Set__Constrained=Constrained
-Java__default__Class__EJBVersion=EJBVersion
-Java__Default_Servlet__Class__Static=Static
-Java__default__Class__MethodForRequestAttributes=MethodForRequestAttributes
-Java__default__Class__GenerateFinalizer=GenerateFinalizer
-Java__default__Operation__ReplaceExistingCode=ReplaceExistingCode
-Java__Default_EJB__Class__EJBNameInJAR=EJBNameInJAR
-Java__default__Class__ServletCookie=ServletCookie
-Java__Default_Servlet__ClassEJBSessionType_Set=EJBSessionType_Set
-Java__default__Project__SCCProjectSourceRoot=SCCProjectSourceRoot
-Java__default__Operation__Abstract=Abstract
-Java__Http_Servlet__ClassEJBSessionType_Set=EJBSessionType_Set
-Java__Http_Servlet__Class__IsSingleThread=IsSingleThread
-Java__default__RoleBeanProperty_Set__Bound=Bound
-Java__Default_EJB__Class__BMP_Extend_CMP=BMP_Extend_CMP
-Java__default__Role__ReadWrite=Read/Write
-Java__default__Project__DefaultServletVersion=DefaultServletVersion
-Java__Default_EJB__ClassEJBPersistenceType_Set__Bean=Bean
-Java__default__Operation__Strictfp=Strictfp
-Java__default__Project__LocalPrefix=LocalPrefix
-Java__default__ClassCtor_Set__private=private
-Java__default__Class__ServletDateHeader=ServletDateHeader
-Java__Default_EJB__Class__ServletCookie=ServletCookie
-Java__default__Project__DefaultOperationReturnType=DefaultOperationReturnType
-Java__Default_Servlet__ClassCtor_Set__public=public
-Java__Default_EJB__ClassCtor_Set__public=public
-Java__Http_Servlet__Class__ServletHeaderNames=ServletHeaderNames
-Java__default__Project__RootDir=RootDir
-Java__default__Class__EJBReentrant=EJBReentrant
-Java__default__Project__NotShowRoseIDDlg=NotShowRoseIDDlg
-Java__default__Project__HomeSuffix=HomeSuffix
-Java__Default_EJB__Class__EJBPersistenceType=EJBPersistenceType
-Java__default__Class__ServletIsSecure=ServletIsSecure
-Java__Default_Servlet__Class=Default_Servlet
-Java__Default_EJB__Class__ServletDateHeader=ServletDateHeader
-Java__default__Project__LocalHomePrefix=LocalHomePrefix
-Java__Http_Servlet__Class__DispatcherForward=DispatcherForward
-Java__Default_EJB__Class__Generate_XML_DD=Generate_XML_DD
-Java__Default_EJB__Class__DisableAutoSync=DisableAutoSync
-Java__default__ModuleSpec=default
-Java__Default_EJB__ClassEJBPersistenceType_Set__Container=Container
-Java__default__Project__UserDefineTagApply3=UserDefineTagApply3
-Java__default__Attribute__IndividualChangeMgt=IndividualChangeMgt
-Java__Default_EJB__ClassEJBTransactionType_Set__Bean=Bean
-Java__default__Project__UserDefineTagApply2=UserDefineTagApply2
-Java__Http_Servlet__Class__DispatcherInclude=DispatcherInclude
-Java__default__Project__UserDefineTagApply1=UserDefineTagApply1
-Java__default__ModuleSpec__CmIdentification=CmIdentification
-Java__default__RoleBeanProperty_Set=BeanProperty_Set
-Java__Default_Servlet__Class__DispatcherInclude=DispatcherInclude
-Java__default__Project__GlobalImports=GlobalImports
-Java__default__Class__MethodForHeaders=MethodForHeaders
-Java__default__Role__ContainerClass=ContainerClass
-Java__default__Project__BeanPrefix=BeanPrefix
-Java__default__Attribute__ReadWrite=Read/Write
-Java__default__Class__ServletRequestDispatcher=ServletRequestDispatcher
-Java__default__Project__UsePrefixes=UsePrefixes
-Java__default__AttributeReadWrite_Set__Read\ &\ Write=Read & Write
-Java__Default_Servlet__Class__IsSingleThread=IsSingleThread
-Java__Default_Servlet__Class__GenerateStaticInitializer=GenerateStaticInitializer
-Java__default__ClassCtor_Set__protected=protected
-Java__default__AttributeReadWrite_Set__Read\ Only=Read Only
-Java__Http_Servlet__Class__MethodForRequestAttributes=MethodForRequestAttributes
-Java__Default_EJB__Class__EJBReentrant=EJBReentrant
-Java__Default_Servlet__Class__EJBSecurityRoles=EJBSecurityRoles
-Java__Default_Servlet__Class__Final=Final
-Java__default__Operation__Native=Native
-Java__default__Class__EJBSessionSync=EJBSessionSync
-Java__Default_Servlet__Class__MethodForCookie=MethodForCookie
-Java__Http_Servlet__ClassCtor_Set=Ctor_Set
-Java__Default_EJB__Class__ServletName=ServletName
-Java__Http_Servlet__Class__EJBPersistenceType=EJBPersistenceType
-Java__Http_Servlet__Class__GenerateHTML=GenerateHTML
-Java__Default_Servlet__Class__ServletRequestDispatcher=ServletRequestDispatcher
-Java__default__Role__Final=Final
-Java__Default_EJB__Class__ServletRequestDispatcherPath=ServletRequestDispatcherPath
-Java__Default_EJB__ClassCtor_Set__protected=protected
-Java__Default_EJB__Class__EJBEnvironmentProperties=EJBEnvironmentProperties
-Java__Default_Servlet__ClassEJBPersistenceType_Set__Bean=Bean
-Java__default__Attribute__Final=Final
-Java__Default_EJB__ClassEJBSessionType_Set__Stateful=Stateful
-Java__Default_Servlet__Class__GenerateFinalizer=GenerateFinalizer
-Java__default__Project__SpacingItems=SpacingItems
-Java__default__Class__EJBCnxFactory=EJBCnxFactory
-Java__default__Project__EJBDTDLocation=EJBDTDLocation
-Java__Default_Servlet__ClassEJBTransactionType_Set=EJBTransactionType_Set
-Java__Http_Servlet__ClassCtor_Set__public=public
-Java__default__ClassEJBTransactionType_Set=EJBTransactionType_Set
-Java__default__Project__SourceControl=SourceControl
-Java__default__Operation__Final=Final
-Java__Http_Servlet__Class__EJBTransactionType=EJBTransactionType
-Java__default__Class__GenerateHTML=GenerateHTML
-Java__default__Project__ServletDTDLocation=ServletDTDLocation
-Java__default__Role__InitialValue=InitialValue
-Java__Http_Servlet__ClassEJBVersion_Set=EJBVersion_Set
-Java__Default_EJB__Class__ServletHeaderNames=ServletHeaderNames
-Java__default__Class__EJBSessionType=EJBSessionType
-Java__Http_Servlet__Class__ServletDateHeader=ServletDateHeader
-Java__default__Project__DefaultEJBVersion=DefaultEJBVersion
-Java__Default_Servlet__Class__ServletSecurityRoles=ServletSecurityRoles
-Java__default__Project__AutoSync=AutoSync
-Java__default__Project__ClassPath=ClassPath
-Java__default__Class__ServletSecurityRoles=ServletSecurityRoles
-Java__Default_Servlet__ClassEJBTransactionType_Set__Bean=Bean
-Java__Default_Servlet__Class__ServletDateHeader=ServletDateHeader
-Java__Default_EJB__Class__ServletInitParameterNames=ServletInitParameterNames
-Java__Default_EJB__ClassCtor_Set__package=package
-Java__Default_Servlet__ClassEJBVersion_Set__2.0=2.0
-Java__default__ClassEJBSessionType_Set=EJBSessionType_Set
-Java__Default_Servlet__Class__GenerateCode=GenerateCode
-Java__default__Project__NoClassCustomDlg=NoClassCustomDlg
-Java__Http_Servlet__Class__Static=Static
-Java__Default_EJB__Class__ServletRequestAttribute=ServletRequestAttribute
-Java__default__Project__UserDefineJavaDocTags=UserDefineJavaDocTags
-Java__Default_EJB__Class=Default_EJB
-Java__default__Class__ServletXMLFilePath=ServletXMLFilePath
-Java__Http_Servlet__Class__ServletRequestParameter=ServletRequestParameter
-Java__default__Project=default
-Java__Default_EJB__Class__ServletRequestParameterNames=ServletRequestParameterNames
-Java__default__Class__ServletContextRef=ServletContextRef
-Java__Http_Servlet__Class__Generate_XML_DD=Generate_XML_DD
-Java__default__Role__IsNavigable=IsNavigable
-Java__default__RoleBeanProperty_Set__Not\ A\ Property=Not A Property
-Java__Default_EJB__Class__Final=Final
-Java__Default_EJB__Class__GenerateFinalizer=GenerateFinalizer
-Java__default__ClassEJBTransactionType_Set__Container=Container
-Java__Default_Servlet__Class__BMP_Extend_CMP=BMP_Extend_CMP
-Java__default__ClassEJBPersistenceType_Set__Bean=Bean
-Java__Default_EJB__Class__ServletContextRef=ServletContextRef
-Java__Default_EJB__Class__ServletContentType=ServletContentType
-Java__default__Project__JavadocDefaultSince=JavadocDefaultSince
-Java__default__Project__JavadocSince=JavadocSince
-Java__default__Class__ServletRequestAttribute=ServletRequestAttribute
-Java__Default_EJB__Class__ServletSecurityRoles=ServletSecurityRoles
-Java__Default_Servlet__ClassEJBTransactionType_Set__Container=Container
-Java__default__Project__SCCSelected=SCCSelected
-Java__Default_Servlet__Class__EJBVersion=EJBVersion
-Java__Default_EJB__Class__GenerateHTML=GenerateHTML
-Java__Default_Servlet__Class__GenerateDefaultConstructor=GenerateDefaultConstructor
-Java__default__ClassEJBVersion_Set__2.0=2.0
-Java__default__Project__InstanceVariablePrefix=InstanceVariablePrefix
-Java__Default_Servlet__ClassEJBSessionType_Set__Stateful=Stateful
-Java__Http_Servlet__ClassCtor_Set__protected=protected
-Java__Default_Servlet__Class__ServletHeaderNames=ServletHeaderNames
-Java__Default_EJB__Class__MethodForRequestParameters=MethodForRequestParameters
-Java__default__Class__ServletgetInfo=ServletgetInfo
-Java__Default_Servlet__Class__ConstructorIs=ConstructorIs
-Java__Default_Servlet__Class__Generate_XML_DD=Generate_XML_DD
-Java__Default_EJB__Class__MethodForHeaders=MethodForHeaders
-Java__Default_Servlet__Class__DisableAutoSync=DisableAutoSync
-Java__default__RoleBeanProperty_Set__Constrained=Constrained
-Java__Default_Servlet__Class__EJBReentrant=EJBReentrant
-Java__Default_Servlet__ClassCtor_Set__protected=protected
-Java__Default_Servlet__Class__ServletIntHeader=ServletIntHeader
-Java__Http_Servlet__Class__ConstructorIs=ConstructorIs
-Java__Default_EJB__ClassEJBVersion_Set__2.0=2.0
-Java__Default_EJB__Class__ServletIsSecure=ServletIsSecure
-Java__default__ModuleBody__CmIdentification=CmIdentification
-Java__Http_Servlet__Class__ServletRequestAttribute=ServletRequestAttribute
-Java__default__Attribute__GenerateFullyQualifiedTypes=GenerateFullyQualifiedTypes
-Java__default__ClassEJBTransactionType_Set__Bean=Bean
-Java__Default_Servlet__Class__EJBReferences=EJBReferences
-Java__default__Project__ShowCodegenDlg=ShowCodegenDlg
-Java__default__Project__PrimaryKeyPrefix=PrimaryKeyPrefix
-Java__default__Class__EJBXMLFilePath=EJBXMLFilePath
-Java__default__Project__RemotePrefix=RemotePrefix
-Java__default__Project__JavadocNumAsterisks=JavadocNumAsterisks
-Java__Http_Servlet__Class__MethodForCookie=MethodForCookie
-Java__default__Class__ReadOnly=ReadOnly
-Java__default__Role__Transient=Transient
-Java__default__RoleBeanProperty_Set__Simple=Simple
-Java__Default_EJB__Class__Static=Static
-Java__default__Class__GenerateStaticInitializer=GenerateStaticInitializer
-Java__default__Project__VM=VM
-Java__Http_Servlet__Class__ServletSecurityRoles=ServletSecurityRoles
-Java__Default_Servlet__ClassEJBVersion_Set__1.x=1.x
-Java__default__Project__UseTabs=UseTabs
-Java__Http_Servlet__Class__ServletRequestAttributesNames=ServletRequestAttributesNames
-Java__default__Class__Static=Static
-Java__Default_EJB__Class__EJBTransactionType=EJBTransactionType
-Java__default__Project__ClassVariablePrefix=ClassVariablePrefix
-Java__Http_Servlet__Class__ServletRequestDispatcherPath=ServletRequestDispatcherPath
-Java__default__Class__EJBSecurityRoles=EJBSecurityRoles
-Java__Http_Servlet__Class__ServletContentType=ServletContentType
-Java__default__Project__UserDefineTagText3=UserDefineTagText3
-Java__default__Project__UserDefineTagText2=UserDefineTagText2
-Java__default__Project__UserDefineTagText1=UserDefineTagText1
-Java__Default_EJB__Class__GenerateStaticInitializer=GenerateStaticInitializer
-Java__default__ProjectVMType__IBM=IBM
-Java__Default_Servlet__ClassEJBPersistenceType_Set=EJBPersistenceType_Set
-Java__Http_Servlet__Class__EJBSecurityRoles=EJBSecurityRoles
-Java__default__Project__JavadocDefaultAuthor=JavadocDefaultAuthor
-Java__default__ClassEJBPersistenceType_Set=EJBPersistenceType_Set
-Java__Http_Servlet__Class__BMP_Extend_CMP=BMP_Extend_CMP
-Java__Default_Servlet__Class__EJBPersistenceType=EJBPersistenceType
-Java__default__Class__GenerateDefaultConstructor=GenerateDefaultConstructor
-Java__Default_Servlet__ClassEJBSessionType_Set__Stateless=Stateless
-Java__default__ClassEJBSessionType_Set__Stateful=Stateful
-Java__default__ClassEJBSessionType_Set__Stateless=Stateless
-Java__Http_Servlet__Class__GenerateFinalizer=GenerateFinalizer
-Java__Http_Servlet__ClassCtor_Set__package=package
-Java__Default_EJB__Class__ServletRequestParameter=ServletRequestParameter
-Java__default__Project__RoseDefaultCommentStyle=RoseDefaultCommentStyle
-Java__Default_EJB__Class__GenerateDefaultConstructor=GenerateDefaultConstructor
-Java__Default_Servlet__Class__GenerateInstanceInitializer=GenerateInstanceInitializer
-Java__Default_EJB__Class__EJBVersion=EJBVersion
-Java__default__Class__GenerateInstanceInitializer=GenerateInstanceInitializer
-Java__default__Class__ServletRequestDispatcherPath=ServletRequestDispatcherPath
-Java__Default_Servlet__Class__EJBNameInJAR=EJBNameInJAR
-Java__Http_Servlet__Class__ServletContextRef=ServletContextRef
-Java__Default_EJB__ClassEJBSessionType_Set=EJBSessionType_Set
-Java__Http_Servlet__ClassEJBPersistenceType_Set__Bean=Bean
-Java__default__ClassEJBVersion_Set__1.x=1.x
-Java__default__Project__ReferenceClasspath=ReferenceClasspath
-Java__default__ClassEJBPersistenceType_Set__Container=Container
-Java__default__Role__IndividualChangeMgt=IndividualChangeMgt
-Java__Default_Servlet__Class__ServletContextRef=ServletContextRef
-Java__Http_Servlet__Class__EJBNameInJAR=EJBNameInJAR
-Java__Default_Servlet__Class__MethodForRequestParameters=MethodForRequestParameters
-Java__default__Project__MaxNumChars=MaxNumChars
-Java__default__Attribute__Transient=Transient
-Java__default__Class__ServletInitParameterNames=ServletInitParameterNames
-Java__Http_Servlet__Class__ServletRequestDispatcher=ServletRequestDispatcher
-Java__Http_Servlet__Class__ReadOnly=ReadOnly
-Java__default__Project__HomePrefix=HomePrefix
-Java__Default_EJB__Class__ConstructorIs=ConstructorIs
-Java__Default_EJB__ClassEJBVersion_Set__1.x=1.x
-Java__Default_Servlet__ClassEJBPersistenceType_Set__Container=Container
-Java__Default_Servlet__Class__EJBTransactionType=EJBTransactionType
-Java__default__Class__ServletRequestParameter=ServletRequestParameter
-Java__Http_Servlet__Class__ServletRequestParameterNames=ServletRequestParameterNames
-Java__Default_Servlet__Class__ServletHeader=ServletHeader
-Java__Default_EJB__Class__ReadOnly=ReadOnly
-Java__Default_Servlet__ClassCtor_Set__package=package
-Java__Http_Servlet__ClassEJBVersion_Set__2.0=2.0
-Java__Default_EJB__ClassEJBPersistenceType_Set=EJBPersistenceType_Set
-Java__Default_EJB__Class__ServletRequestAttributesNames=ServletRequestAttributesNames
-Java__default__Class__EJBEnvironmentProperties=EJBEnvironmentProperties
-Java__Http_Servlet__Class__ServletHeader=ServletHeader
-Java__Default_Servlet__Class__ServletgetInfo=ServletgetInfo
-Java__Default_EJB__Class__ServletgetInfo=ServletgetInfo
-Java__default__Project__LocalSuffix=LocalSuffix
-Java__default__Project__OpenBraceMethodStyle=OpenBraceMethodStyle
-Java__Http_Servlet__Class__EJBCmpField=EJBCmpField
-Java__default__Class__MethodForCookie=MethodForCookie
-Java__Http_Servlet__ClassEJBTransactionType_Set__Bean=Bean
-Java__Default_EJB__ClassEJBSessionType_Set__Stateless=Stateless
-Java__Http_Servlet__Class__ServletName=ServletName
-Java__default__ProjectEditorType=EditorType
-Java__Default_EJB__Class__GenerateInstanceInitializer=GenerateInstanceInitializer
-Java__Http_Servlet__Class__GenerateCode=GenerateCode
-Java__default__Project__GenerateRoseID=GenerateRoseID
-Java__Default_Servlet__Class__EJBXMLFilePath=EJBXMLFilePath
-Java__Default_EJB__ClassEJBTransactionType_Set=EJBTransactionType_Set
-Java__Default_EJB__Class__EJBXMLFilePath=EJBXMLFilePath
-Java__Default_Servlet__Class__EJBEnvironmentProperties=EJBEnvironmentProperties
-Java__default__Project__LocalHomeSuffix=LocalHomeSuffix
-Java__Http_Servlet__Class__DisableAutoSync=DisableAutoSync
-Java__Http_Servlet__ClassEJBTransactionType_Set__Container=Container
-Java__default__Project__UserDefineTagName3=UserDefineTagName3
-Java__default__Project__UserDefineTagName2=UserDefineTagName2
-Java__default__Project__UserDefineTagName1=UserDefineTagName1
-Java__default__ClassEJBVersion_Set=EJBVersion_Set
-Java__default__Class__ServletRequestParameterNames=ServletRequestParameterNames
-Java__Http_Servlet__Class=Http_Servlet
-Java__Http_Servlet__Class__ServletXMLFilePath=ServletXMLFilePath
-Java__Default_EJB__ClassCtor_Set=Ctor_Set
-Java__default__Project__Editor=Editor
-Java__default__Project__OpenBraceClassStyle=OpenBraceClassStyle
-Java__default__AttributeBeanProperty_Set__Bound=Bound
-Java__default__ClassCtor_Set=Ctor_Set
-Java__default__ModuleSpec__CopyrightNotice=CopyrightNotice
-Java__default__Attribute=default
-Java__default__RoleReadWrite_Set=Read/Write_Set
-Java__default__Project__JavadocVersion=JavadocVersion
-Java__default__ProjectVMType=VMType
-Java__default__Class__ServletIntHeader=ServletIntHeader
-Java__Http_Servlet__ClassEJBPersistenceType_Set=EJBPersistenceType_Set
-Java__Default_Servlet__Class__ServletRequestDispatcherPath=ServletRequestDispatcherPath
-Java__Default_Servlet__Class__ReadOnly=ReadOnly
-Java__default__RoleReadWrite_Set__Read\ &\ Write=Read & Write
-Java__default__ModuleBody=default
-Java__default__ClassCtor_Set__package=package
-Java__default__Class__IsSingleThread=IsSingleThread
-Java__default__Project__GenerateDefaultReturnLine=GenerateDefaultReturnLine
-Java__default__Class__GenerateCode=GenerateCode
-Java__default__Class__MethodForRequestParameters=MethodForRequestParameters
-Java__default__Class=default
-Java__Default_EJB__ClassCtor_Set__private=private
-Java__Http_Servlet__Class__GenerateDefaultConstructor=GenerateDefaultConstructor
-Java__Default_Servlet__Class__ServletIsSecure=ServletIsSecure
-Java__default__Class__Strictfp=Strictfp
-Java__default__Role__Volatile=Volatile
-Java__Default_Servlet__Class__EJBSessionSync=EJBSessionSync
-Java__Default_EJB__Class__EJBSecurityRoles=EJBSecurityRoles
-Java__Default_EJB__Class__EJBSessionSync=EJBSessionSync
-Java__default__Project__AsteriskCommentStyle=AsteriskCommentStyle
-Java__Http_Servlet__ClassEJBSessionType_Set__Stateful=Stateful
-Java__Http_Servlet__Class__ServletIntHeader=ServletIntHeader
-Java__Http_Servlet__ClassEJBTransactionType_Set=EJBTransactionType_Set
-Java__Default_EJB__Class__MethodForRequestAttributes=MethodForRequestAttributes
-Java__Http_Servlet__Class__Final=Final
-Java__Http_Servlet__Class__EJBReentrant=EJBReentrant
-Java__Http_Servlet__ClassEJBVersion_Set__1.x=1.x
-Java__default__Project__JavaCommentStyle=JavaCommentStyle
-Java__Http_Servlet__Class__EJBReferences=EJBReferences
-Java__default__AttributeBeanProperty_Set__Simple=Simple
-Java__Default_Servlet__Class__ServletRequestAttribute=ServletRequestAttribute
-Java__Http_Servlet__Class__GenerateStaticInitializer=GenerateStaticInitializer
-Java__Default_EJB__Class__ServletHeader=ServletHeader
-Java__Default_EJB__ClassEJBVersion_Set=EJBVersion_Set
-Java__default__Project__DefaultAttributeDataType=DefaultAttributeDataType
-Java__Http_Servlet__Class__ServletgetInfo=ServletgetInfo
-Java__Default_Servlet__Class__EJBCmpField=EJBCmpField
-Java__default__Class__ServletHeaderNames=ServletHeaderNames
-Java__Default_Servlet__Class__ServletName=ServletName
-Java__Default_Servlet__Class__ServletRequestAttributesNames=ServletRequestAttributesNames
-Java__default__AttributeBeanProperty_Set=BeanProperty_Set
-Java__default__Operation__Synchronized=Synchronized
-Java__Default_Servlet__Class__ServletContentType=ServletContentType
-Java__Default_Servlet__Class__EJBSessionType=EJBSessionType
-Java__Default_EJB__Class__EJBSessionType=EJBSessionType
-Java__default__ModuleBody__CopyrightNotice=CopyrightNotice
-Java__default__Class__Final=Final
-Java__Default_Servlet__Class__ServletRequestParameterNames=ServletRequestParameterNames
-Java__Default_EJB__Class__GenerateCode=GenerateCode
-Java__Http_Servlet__Class__EJBXMLFilePath=EJBXMLFilePath
-Java__default__Project__GenerateDefaultJ2EEJavadoc=GenerateDefaultJ2EEJavadoc
-Java__Default_EJB__Class__ServletRequestDispatcher=ServletRequestDispatcher
-Java__default__ProjectEditorType__BuiltIn=BuiltIn
-Java__Default_Servlet__Class__ServletInitParameter=ServletInitParameter
-Java__default__Class__Generate_XML_DD=Generate_XML_DD
-Java__default__Class__DisableAutoSync=DisableAutoSync
-Java__default__Class__ServletInitParameter=ServletInitParameter
-Java__default__AttributeBeanProperty_Set__Not\ A\ Property=Not A Property
-Java__Http_Servlet__Class__Strictfp=Strictfp
-Java__Default_Servlet__Class__EJBCnxFactory=EJBCnxFactory
-Java__default__Project__CreateMissingDirectories=CreateMissingDirectories
-Java__default__Class__ConstructorIs=ConstructorIs
-Java__default__Role__GenerateFullyQualifiedTypes=GenerateFullyQualifiedTypes
-Java__Default_Servlet__Class__DispatcherForward=DispatcherForward
-Java__Http_Servlet__Class__EJBCnxFactory=EJBCnxFactory
-Java__default__Attribute__PropertyType=PropertyType
-Java__Default_EJB__Class__Strictfp=Strictfp
-Java__Default_EJB__Class__ServletXMLFilePath=ServletXMLFilePath
-Java__Http_Servlet__ClassEJBPersistenceType_Set__Container=Container
-Java__default__Class__ServletContentType=ServletContentType
-Java__Http_Servlet__ClassEJBSessionType_Set__Stateless=Stateless
-Java__default__Class__BMP_Extend_CMP=BMP_Extend_CMP
-=
-Java__default__Project__JavadocAuthor=JavadocAuthor
diff --git a/plugins/org.eclipse.wst.common.modulecore/model/VirtualPathAPI.emx b/plugins/org.eclipse.wst.common.modulecore/model/VirtualPathAPI.emx
deleted file mode 100644
index 8ce023c..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/model/VirtualPathAPI.emx
+++ /dev/null
@@ -1,517 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--xtools2_universal_type_manager-->
-<uml:Model xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:notation="http://www.ibm.com/xtools/1.5.0/Notation" xmlns:uml="http://www.eclipse.org/uml2/1.0.0/UML" xmlns:umlnotation="http://www.ibm.com/xtools/1.5.0/Umlnotation" xmi:id="_XP2kcLqvEdmTwLcLkpAHPw" name="VirtualPathAPI" appliedProfile="_XSiFALqvEdmTwLcLkpAHPw _XUP8QLqvEdmTwLcLkpAHPw _XU0kALqvEdmTwLcLkpAHPw _XWoh4LqvEdmTwLcLkpAHPw _XZsc8LqvEdmTwLcLkpAHPw">
-  <eAnnotations xmi:id="_XP2kcbqvEdmTwLcLkpAHPw" source="uml2.diagrams" references="_XP2kcrqvEdmTwLcLkpAHPw">
-    <contents xmi:type="notation:Diagram" xmi:id="_XP2kcrqvEdmTwLcLkpAHPw" type="Class" name="Main">
-      <children xmi:id="_sLnKELsaEdmrmcil1Bx04w" sourceEdges="_sxPmsLsaEdmrmcil1Bx04w _sxPmuLsaEdmrmcil1Bx04w" targetEdges="_sxbz_bsaEdmrmcil1Bx04w _sxh6krsaEdmrmcil1Bx04w _sxoBOLsaEdmrmcil1Bx04w _sx0OcLsaEdmrmcil1Bx04w">
-        <children xmi:id="_sMGSQLsaEdmrmcil1Bx04w" type="ImageCompartment">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_sMGSQbsaEdmrmcil1Bx04w" width="530" height="530"/>
-        </children>
-        <children xmi:id="_sMGSQrsaEdmrmcil1Bx04w" type="Stereotype">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_sMGSQ7saEdmrmcil1Bx04w" type="Kind">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_sMGSRLsaEdmrmcil1Bx04w" type="Name">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_sM3HQLsaEdmrmcil1Bx04w" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_sM3HQbsaEdmrmcil1Bx04w"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_sM9N4LsaEdmrmcil1Bx04w" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_sM9N4bsaEdmrmcil1Bx04w"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_sM9N4rsaEdmrmcil1Bx04w" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_sM9N47saEdmrmcil1Bx04w"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLClassifierStyle" xmi:id="_sLnKEbsaEdmrmcil1Bx04w" showStereotype="Label" useClassifierShape="true"/>
-        <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_sLnKErsaEdmrmcil1Bx04w" x="318" y="2544"/>
-      </children>
-      <children xmi:id="_skEGULsaEdmrmcil1Bx04w" sourceEdges="_sxVtUbsaEdmrmcil1Bx04w" targetEdges="_sxuH0LsaEdmrmcil1Bx04w">
-        <children xmi:id="_skEGU7saEdmrmcil1Bx04w" type="ImageCompartment">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualFolder[jcu^name=IVirtualFolder.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_skEGVLsaEdmrmcil1Bx04w" width="530" height="530"/>
-        </children>
-        <children xmi:id="_skEGVbsaEdmrmcil1Bx04w" type="Stereotype">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualFolder[jcu^name=IVirtualFolder.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_skEGVrsaEdmrmcil1Bx04w" type="Kind">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualFolder[jcu^name=IVirtualFolder.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_skEGV7saEdmrmcil1Bx04w" type="Name">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualFolder[jcu^name=IVirtualFolder.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_skEGWLsaEdmrmcil1Bx04w" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_skEGWbsaEdmrmcil1Bx04w"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualFolder[jcu^name=IVirtualFolder.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_skEGWrsaEdmrmcil1Bx04w" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_skEGW7saEdmrmcil1Bx04w"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualFolder[jcu^name=IVirtualFolder.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_skKM8LsaEdmrmcil1Bx04w" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_skKM8bsaEdmrmcil1Bx04w"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualFolder[jcu^name=IVirtualFolder.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLClassifierStyle" xmi:id="_skEGUbsaEdmrmcil1Bx04w" showStereotype="Label" useClassifierShape="true"/>
-        <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualFolder[jcu^name=IVirtualFolder.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_skEGUrsaEdmrmcil1Bx04w" x="8268" y="14628"/>
-      </children>
-      <children xmi:id="_sku0sLsaEdmrmcil1Bx04w" sourceEdges="_sxVtWLsaEdmrmcil1Bx04w" targetEdges="_sxuH4LsaEdmrmcil1Bx04w">
-        <children xmi:id="_sku0s7saEdmrmcil1Bx04w" type="ImageCompartment">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualReference[jcu^name=IVirtualReference.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_sku0tLsaEdmrmcil1Bx04w" width="530" height="530"/>
-        </children>
-        <children xmi:id="_sku0tbsaEdmrmcil1Bx04w" type="Stereotype">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualReference[jcu^name=IVirtualReference.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_sku0trsaEdmrmcil1Bx04w" type="Kind">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualReference[jcu^name=IVirtualReference.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_sku0t7saEdmrmcil1Bx04w" type="Name">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualReference[jcu^name=IVirtualReference.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_sku0uLsaEdmrmcil1Bx04w" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_sku0ubsaEdmrmcil1Bx04w"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualReference[jcu^name=IVirtualReference.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_sku0ursaEdmrmcil1Bx04w" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_sku0u7saEdmrmcil1Bx04w"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualReference[jcu^name=IVirtualReference.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_sku0vLsaEdmrmcil1Bx04w" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_sku0vbsaEdmrmcil1Bx04w"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualReference[jcu^name=IVirtualReference.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLClassifierStyle" xmi:id="_sku0sbsaEdmrmcil1Bx04w" showStereotype="Label" useClassifierShape="true"/>
-        <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualReference[jcu^name=IVirtualReference.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_sku0srsaEdmrmcil1Bx04w" x="20034" y="2544"/>
-      </children>
-      <children xmi:id="_sl-K0LsaEdmrmcil1Bx04w">
-        <children xmi:id="_sl-K07saEdmrmcil1Bx04w" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ComponentHandle[jcu^name=ComponentHandle.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_sl-K1LsaEdmrmcil1Bx04w" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_sl-K1bsaEdmrmcil1Bx04w" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ComponentHandle[jcu^name=ComponentHandle.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_smERcLsaEdmrmcil1Bx04w" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ComponentHandle[jcu^name=ComponentHandle.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_smERcbsaEdmrmcil1Bx04w" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_smERcrsaEdmrmcil1Bx04w" filtering="Manual">
-            <filteredObjects xmi:type="uml:Property" href="vizref:///#jfield^vcore.target=uml2.Property^name=name[jsrctype^name=ComponentHandle[jcu^name=ComponentHandle.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-            <filteredObjects xmi:type="uml:Property" href="vizref:///#jfield^vcore.target=uml2.Property^name=toString[jsrctype^name=ComponentHandle[jcu^name=ComponentHandle.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-            <filteredObjects xmi:type="uml:Property" href="vizref:///#jfield^vcore.target=uml2.Property^name=hashCode[jsrctype^name=ComponentHandle[jcu^name=ComponentHandle.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </styles>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ComponentHandle[jcu^name=ComponentHandle.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_smERc7saEdmrmcil1Bx04w" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_smERdLsaEdmrmcil1Bx04w" filtering="Manual">
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=ComponentHandle^sign=(QIProject%3bQString%3b)V[jsrctype^name=ComponentHandle[jcu^name=ComponentHandle.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </styles>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ComponentHandle[jcu^name=ComponentHandle.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_smERdbsaEdmrmcil1Bx04w" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_smERdrsaEdmrmcil1Bx04w"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ComponentHandle[jcu^name=ComponentHandle.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_snOIALsaEdmrmcil1Bx04w" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_snOIAbsaEdmrmcil1Bx04w"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ComponentHandle[jcu^name=ComponentHandle.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_sl-K0bsaEdmrmcil1Bx04w" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ComponentHandle[jcu^name=ComponentHandle.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_sl-K0rsaEdmrmcil1Bx04w" x="13674" y="2544"/>
-      </children>
-      <children xmi:id="_sqLVYLsaEdmrmcil1Bx04w" sourceEdges="_sxbz_bsaEdmrmcil1Bx04w" targetEdges="_sxoBMLsaEdmrmcil1Bx04w">
-        <children xmi:id="_sqLVY7saEdmrmcil1Bx04w" type="ImageCompartment">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualFile[jcu^name=IVirtualFile.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_sqLVZLsaEdmrmcil1Bx04w" width="530" height="530"/>
-        </children>
-        <children xmi:id="_sqLVZbsaEdmrmcil1Bx04w" type="Stereotype">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualFile[jcu^name=IVirtualFile.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_sqLVZrsaEdmrmcil1Bx04w" type="Kind">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualFile[jcu^name=IVirtualFile.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_sqRcALsaEdmrmcil1Bx04w" type="Name">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualFile[jcu^name=IVirtualFile.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_sqRcAbsaEdmrmcil1Bx04w" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_sqRcArsaEdmrmcil1Bx04w"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualFile[jcu^name=IVirtualFile.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_sqRcA7saEdmrmcil1Bx04w" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_sqRcBLsaEdmrmcil1Bx04w"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualFile[jcu^name=IVirtualFile.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_sqRcBbsaEdmrmcil1Bx04w" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_sqRcBrsaEdmrmcil1Bx04w"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualFile[jcu^name=IVirtualFile.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLClassifierStyle" xmi:id="_sqLVYbsaEdmrmcil1Bx04w" showStereotype="Label" useClassifierShape="true"/>
-        <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualFile[jcu^name=IVirtualFile.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_sqLVYrsaEdmrmcil1Bx04w" x="1590" y="14628"/>
-      </children>
-      <children xmi:id="_sqv9ILsaEdmrmcil1Bx04w" sourceEdges="_sxh6krsaEdmrmcil1Bx04w _sxoBMLsaEdmrmcil1Bx04w _sxoBOLsaEdmrmcil1Bx04w _sxuH0LsaEdmrmcil1Bx04w" targetEdges="_sxPmuLsaEdmrmcil1Bx04w _sxVtUbsaEdmrmcil1Bx04w _sx0OeLsaEdmrmcil1Bx04w">
-        <children xmi:id="_sq2DwLsaEdmrmcil1Bx04w" type="ImageCompartment">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_sq2DwbsaEdmrmcil1Bx04w" width="530" height="530"/>
-        </children>
-        <children xmi:id="_sq2DwrsaEdmrmcil1Bx04w" type="Stereotype">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_sq2Dw7saEdmrmcil1Bx04w" type="Kind">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_sq2DxLsaEdmrmcil1Bx04w" type="Name">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_sq2DxbsaEdmrmcil1Bx04w" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_sq2DxrsaEdmrmcil1Bx04w"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_sq2Dx7saEdmrmcil1Bx04w" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_sq2DyLsaEdmrmcil1Bx04w"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_sq2DybsaEdmrmcil1Bx04w" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_sq2DyrsaEdmrmcil1Bx04w"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLClassifierStyle" xmi:id="_sqv9IbsaEdmrmcil1Bx04w" showStereotype="Label" useClassifierShape="true"/>
-        <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_sqv9IrsaEdmrmcil1Bx04w" x="8586" y="2544"/>
-      </children>
-      <children xmi:id="_ssd0YLsaEdmrmcil1Bx04w" sourceEdges="_sxuH2LsaEdmrmcil1Bx04w">
-        <children xmi:id="_ssd0Y7saEdmrmcil1Bx04w" type="ImageCompartment">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IFlexibleProject[jcu^name=IFlexibleProject.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_ssd0ZLsaEdmrmcil1Bx04w" width="530" height="530"/>
-        </children>
-        <children xmi:id="_ssd0ZbsaEdmrmcil1Bx04w" type="Stereotype">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IFlexibleProject[jcu^name=IFlexibleProject.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_ssd0ZrsaEdmrmcil1Bx04w" type="Kind">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IFlexibleProject[jcu^name=IFlexibleProject.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_ssd0Z7saEdmrmcil1Bx04w" type="Name">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IFlexibleProject[jcu^name=IFlexibleProject.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_ssd0aLsaEdmrmcil1Bx04w" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_ssd0absaEdmrmcil1Bx04w"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IFlexibleProject[jcu^name=IFlexibleProject.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_ssd0arsaEdmrmcil1Bx04w" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_ssd0a7saEdmrmcil1Bx04w"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IFlexibleProject[jcu^name=IFlexibleProject.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_ssd0bLsaEdmrmcil1Bx04w" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_ssd0bbsaEdmrmcil1Bx04w"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IFlexibleProject[jcu^name=IFlexibleProject.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLClassifierStyle" xmi:id="_ssd0YbsaEdmrmcil1Bx04w" showStereotype="Label" useClassifierShape="true"/>
-        <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IFlexibleProject[jcu^name=IFlexibleProject.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ssd0YrsaEdmrmcil1Bx04w" x="20034" y="10812" width="4871"/>
-      </children>
-      <children xmi:id="_stPQcLsaEdmrmcil1Bx04w" sourceEdges="_sxuH4LsaEdmrmcil1Bx04w _sx0OcLsaEdmrmcil1Bx04w _sx0OeLsaEdmrmcil1Bx04w" targetEdges="_sxPmsLsaEdmrmcil1Bx04w _sxVtWLsaEdmrmcil1Bx04w _sxuH2LsaEdmrmcil1Bx04w">
-        <children xmi:id="_stPQc7saEdmrmcil1Bx04w" type="ImageCompartment">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_stPQdLsaEdmrmcil1Bx04w" width="530" height="530"/>
-        </children>
-        <children xmi:id="_stPQdbsaEdmrmcil1Bx04w" type="Stereotype">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_stPQdrsaEdmrmcil1Bx04w" type="Kind">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_stPQd7saEdmrmcil1Bx04w" type="Name">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_stPQeLsaEdmrmcil1Bx04w" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_stPQebsaEdmrmcil1Bx04w"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_stVXELsaEdmrmcil1Bx04w" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_stVXEbsaEdmrmcil1Bx04w"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_stVXErsaEdmrmcil1Bx04w" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_stVXE7saEdmrmcil1Bx04w"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLClassifierStyle" xmi:id="_stPQcbsaEdmrmcil1Bx04w" showStereotype="Label" useClassifierShape="true"/>
-        <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_stPQcrsaEdmrmcil1Bx04w" x="13674" y="9222"/>
-      </children>
-      <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_XP2kc7qvEdmTwLcLkpAHPw"/>
-      <edges xmi:id="_sxPmsLsaEdmrmcil1Bx04w" source="_sLnKELsaEdmrmcil1Bx04w" target="_stPQcLsaEdmrmcil1Bx04w">
-        <children xmi:id="_sxPms7saEdmrmcil1Bx04w" type="KindLabel">
-          <children xmi:id="_sxPmtbsaEdmrmcil1Bx04w" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_sxPmt7saEdmrmcil1Bx04w" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_sxPmtrsaEdmrmcil1Bx04w" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_sxPmtLsaEdmrmcil1Bx04w" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_sxPmsbsaEdmrmcil1Bx04w" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_sxPmsrsaEdmrmcil1Bx04w" points="[3254, 4445, -9763, 1005]$[6773, 4445, -6244, 1005]$[6773, 4393, -6244, 953]$[10716, 4393, -2301, 953]"/>
-      </edges>
-      <edges xmi:id="_sxPmuLsaEdmrmcil1Bx04w" source="_sLnKELsaEdmrmcil1Bx04w" target="_sqv9ILsaEdmrmcil1Bx04w">
-        <children xmi:id="_sxPmu7saEdmrmcil1Bx04w" type="KindLabel">
-          <children xmi:id="_sxPmvbsaEdmrmcil1Bx04w" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_sxVtULsaEdmrmcil1Bx04w" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_sxPmvrsaEdmrmcil1Bx04w" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_sxPmvLsaEdmrmcil1Bx04w" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_sxPmubsaEdmrmcil1Bx04w" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_sxPmursaEdmrmcil1Bx04w" points="[3254, -3148, -3996, -529]$[5318, -3148, -1932, -529]"/>
-      </edges>
-      <edges xmi:id="_sxVtUbsaEdmrmcil1Bx04w" source="_skEGULsaEdmrmcil1Bx04w" target="_sqv9ILsaEdmrmcil1Bx04w">
-        <children xmi:id="_sxVtVLsaEdmrmcil1Bx04w" type="NameLabel">
-          <children xmi:id="_sxVtVrsaEdmrmcil1Bx04w" type="Stereotype">
-            <element xmi:type="uml:Generalization" href="vizref:///#jgen^vcore.target=uml2.Generalization[jsrctype^name=IVirtualFolder[jcu^name=IVirtualFolder.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_sxVtV7saEdmrmcil1Bx04w" type="Name">
-            <element xmi:type="uml:Generalization" href="vizref:///#jgen^vcore.target=uml2.Generalization[jsrctype^name=IVirtualFolder[jcu^name=IVirtualFolder.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <element xmi:type="uml:Generalization" href="vizref:///#jgen^vcore.target=uml2.Generalization[jsrctype^name=IVirtualFolder[jcu^name=IVirtualFolder.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_sxVtVbsaEdmrmcil1Bx04w" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_sxVtUrsaEdmrmcil1Bx04w" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Generalization" href="vizref:///#jgen^vcore.target=uml2.Generalization[jsrctype^name=IVirtualFolder[jcu^name=IVirtualFolder.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_sxVtU7saEdmrmcil1Bx04w" points="[132, -1085, -265, 10795]$[132, -8678, -265, 3202]"/>
-      </edges>
-      <edges xmi:id="_sxVtWLsaEdmrmcil1Bx04w" source="_sku0sLsaEdmrmcil1Bx04w" target="_stPQcLsaEdmrmcil1Bx04w">
-        <children xmi:id="_sxbz8LsaEdmrmcil1Bx04w" type="KindLabel">
-          <children xmi:id="_sxbz8rsaEdmrmcil1Bx04w" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualReference[jcu^name=IVirtualReference.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_sxbz9LsaEdmrmcil1Bx04w" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualReference[jcu^name=IVirtualReference.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_sxbz87saEdmrmcil1Bx04w" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualReference[jcu^name=IVirtualReference.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualReference[jcu^name=IVirtualReference.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_sxbz8bsaEdmrmcil1Bx04w" x="-98" y="338"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_sxVtWbsaEdmrmcil1Bx04w" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualReference[jcu^name=IVirtualReference.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_sxVtWrsaEdmrmcil1Bx04w" points="[-3175, 583, 3758, -6032]$[-4181, 583, 2752, -6032]$[-4181, 4551, 2752, -2064]$[-4657, 4551, 2276, -2064]"/>
-      </edges>
-      <edges xmi:id="_sxbz_bsaEdmrmcil1Bx04w" source="_sqLVYLsaEdmrmcil1Bx04w" target="_sLnKELsaEdmrmcil1Bx04w">
-        <children xmi:id="_sxb0ALsaEdmrmcil1Bx04w" type="NameLabel">
-          <children xmi:id="_sxh6kLsaEdmrmcil1Bx04w" type="Stereotype">
-            <element xmi:type="uml:Generalization" href="vizref:///#jgen^vcore.target=uml2.Generalization[jsrctype^name=IVirtualFile[jcu^name=IVirtualFile.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_sxh6kbsaEdmrmcil1Bx04w" type="Name">
-            <element xmi:type="uml:Generalization" href="vizref:///#jgen^vcore.target=uml2.Generalization[jsrctype^name=IVirtualFile[jcu^name=IVirtualFile.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <element xmi:type="uml:Generalization" href="vizref:///#jgen^vcore.target=uml2.Generalization[jsrctype^name=IVirtualFile[jcu^name=IVirtualFile.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_sxb0AbsaEdmrmcil1Bx04w" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_sxbz_rsaEdmrmcil1Bx04w" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Generalization" href="vizref:///#jgen^vcore.target=uml2.Generalization[jsrctype^name=IVirtualFile[jcu^name=IVirtualFile.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_sxbz_7saEdmrmcil1Bx04w" points="[741, -1058, -2143, 15214]$[741, -10478, -2143, 5794]"/>
-      </edges>
-      <edges xmi:id="_sxh6krsaEdmrmcil1Bx04w" source="_sqv9ILsaEdmrmcil1Bx04w" target="_sLnKELsaEdmrmcil1Bx04w">
-        <children xmi:id="_sxh6lbsaEdmrmcil1Bx04w" type="KindLabel">
-          <children xmi:id="_sxh6l7saEdmrmcil1Bx04w" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_sxh6mbsaEdmrmcil1Bx04w" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_sxh6mLsaEdmrmcil1Bx04w" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_sxh6lrsaEdmrmcil1Bx04w" x="81" y="-1070"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_sxh6k7saEdmrmcil1Bx04w" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_sxh6lLsaEdmrmcil1Bx04w" points="[1481, -3175, 2381, 7488]$[1481, -4869, 2381, 5794]"/>
-      </edges>
-      <edges xmi:id="_sxoBMLsaEdmrmcil1Bx04w" source="_sqv9ILsaEdmrmcil1Bx04w" target="_sqLVYLsaEdmrmcil1Bx04w">
-        <children xmi:id="_sxoBM7saEdmrmcil1Bx04w" type="KindLabel">
-          <children xmi:id="_sxoBNbsaEdmrmcil1Bx04w" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualFile[jcu^name=IVirtualFile.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_sxoBN7saEdmrmcil1Bx04w" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualFile[jcu^name=IVirtualFile.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_sxoBNrsaEdmrmcil1Bx04w" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualFile[jcu^name=IVirtualFile.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualFile[jcu^name=IVirtualFile.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_sxoBNLsaEdmrmcil1Bx04w" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_sxoBMbsaEdmrmcil1Bx04w" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualFile[jcu^name=IVirtualFile.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_sxoBMrsaEdmrmcil1Bx04w" points="[-1587, 3202, 5372, -6773]$[-1587, 4154, 5372, -5821]$[-2910, 4154, 4049, -5821]$[-2910, 9948, 4049, -27]$[-4974, 9948, 1985, -27]"/>
-      </edges>
-      <edges xmi:id="_sxoBOLsaEdmrmcil1Bx04w" source="_sqv9ILsaEdmrmcil1Bx04w" target="_sLnKELsaEdmrmcil1Bx04w">
-        <children xmi:id="_sxoBO7saEdmrmcil1Bx04w" type="NameLabel">
-          <children xmi:id="_sxoBPbsaEdmrmcil1Bx04w" type="Stereotype">
-            <element xmi:type="uml:Generalization" href="vizref:///#jgen^vcore.target=uml2.Generalization[jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_sxoBPrsaEdmrmcil1Bx04w" type="Name">
-            <element xmi:type="uml:Generalization" href="vizref:///#jgen^vcore.target=uml2.Generalization[jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <element xmi:type="uml:Generalization" href="vizref:///#jgen^vcore.target=uml2.Generalization[jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_sxoBPLsaEdmrmcil1Bx04w" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_sxoBObsaEdmrmcil1Bx04w" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Generalization" href="vizref:///#jgen^vcore.target=uml2.Generalization[jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_sxoBOrsaEdmrmcil1Bx04w" points="[-80, -3175, 820, 7488]$[-80, -4869, 820, 5794]"/>
-      </edges>
-      <edges xmi:id="_sxuH0LsaEdmrmcil1Bx04w" source="_sqv9ILsaEdmrmcil1Bx04w" target="_skEGULsaEdmrmcil1Bx04w">
-        <children xmi:id="_sxuH07saEdmrmcil1Bx04w" type="KindLabel">
-          <children xmi:id="_sxuH1bsaEdmrmcil1Bx04w" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualFolder[jcu^name=IVirtualFolder.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_sxuH17saEdmrmcil1Bx04w" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualFolder[jcu^name=IVirtualFolder.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_sxuH1rsaEdmrmcil1Bx04w" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualFolder[jcu^name=IVirtualFolder.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualFolder[jcu^name=IVirtualFolder.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_sxuH1LsaEdmrmcil1Bx04w" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_sxuH0bsaEdmrmcil1Bx04w" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualFolder[jcu^name=IVirtualFolder.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_sxuH0rsaEdmrmcil1Bx04w" points="[-979, 3202, -900, -6773]$[-979, 8890, -900, -1085]"/>
-      </edges>
-      <edges xmi:id="_sxuH2LsaEdmrmcil1Bx04w" source="_ssd0YLsaEdmrmcil1Bx04w" target="_stPQcLsaEdmrmcil1Bx04w">
-        <children xmi:id="_sxuH27saEdmrmcil1Bx04w" type="KindLabel">
-          <children xmi:id="_sxuH3bsaEdmrmcil1Bx04w" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IFlexibleProject[jcu^name=IFlexibleProject.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_sxuH37saEdmrmcil1Bx04w" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IFlexibleProject[jcu^name=IFlexibleProject.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_sxuH3rsaEdmrmcil1Bx04w" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IFlexibleProject[jcu^name=IFlexibleProject.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IFlexibleProject[jcu^name=IFlexibleProject.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_sxuH3LsaEdmrmcil1Bx04w" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_sxuH2bsaEdmrmcil1Bx04w" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IFlexibleProject[jcu^name=IFlexibleProject.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_sxuH2rsaEdmrmcil1Bx04w" points="[-1, 3201, -768, -4155]$[767, 4789, 0, -2567]"/>
-      </edges>
-      <edges xmi:id="_sxuH4LsaEdmrmcil1Bx04w" source="_stPQcLsaEdmrmcil1Bx04w" target="_sku0sLsaEdmrmcil1Bx04w">
-        <children xmi:id="_sxuH47saEdmrmcil1Bx04w" type="KindLabel">
-          <children xmi:id="_sxuH5bsaEdmrmcil1Bx04w" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualReference[jcu^name=IVirtualReference.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_sxuH57saEdmrmcil1Bx04w" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualReference[jcu^name=IVirtualReference.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_sxuH5rsaEdmrmcil1Bx04w" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualReference[jcu^name=IVirtualReference.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualReference[jcu^name=IVirtualReference.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_sxuH5LsaEdmrmcil1Bx04w" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_sxuH4bsaEdmrmcil1Bx04w" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualReference[jcu^name=IVirtualReference.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_sxuH4rsaEdmrmcil1Bx04w" points="[2276, -1349, -4657, 5266]$[3125, -1349, -3808, 5266]$[3125, -5503, -3808, 1112]$[3125, -5530, -3808, 1085]$[3758, -5530, -3175, 1085]"/>
-      </edges>
-      <edges xmi:id="_sx0OcLsaEdmrmcil1Bx04w" source="_stPQcLsaEdmrmcil1Bx04w" target="_sLnKELsaEdmrmcil1Bx04w">
-        <children xmi:id="_sx0Oc7saEdmrmcil1Bx04w" type="KindLabel">
-          <children xmi:id="_sx0OdbsaEdmrmcil1Bx04w" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_sx0Od7saEdmrmcil1Bx04w" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_sx0OdrsaEdmrmcil1Bx04w" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_sx0OdLsaEdmrmcil1Bx04w" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_sx0OcbsaEdmrmcil1Bx04w" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualResource[jcu^name=IVirtualResource.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_sx0OcrsaEdmrmcil1Bx04w" points="[-2275, 1799, 10742, 5239]$[-9763, 1799, 3254, 5239]"/>
-      </edges>
-      <edges xmi:id="_sx0OeLsaEdmrmcil1Bx04w" source="_stPQcLsaEdmrmcil1Bx04w" target="_sqv9ILsaEdmrmcil1Bx04w">
-        <children xmi:id="_sx0Oe7saEdmrmcil1Bx04w" type="NameLabel">
-          <children xmi:id="_sx0OfbsaEdmrmcil1Bx04w" type="Stereotype">
-            <element xmi:type="uml:Generalization" href="vizref:///#jgen^vcore.target=uml2.Generalization[jsrctype^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_sx6VELsaEdmrmcil1Bx04w" type="Name">
-            <element xmi:type="uml:Generalization" href="vizref:///#jgen^vcore.target=uml2.Generalization[jsrctype^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <element xmi:type="uml:Generalization" href="vizref:///#jgen^vcore.target=uml2.Generalization[jsrctype^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_sx0OfLsaEdmrmcil1Bx04w" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_sx0OebsaEdmrmcil1Bx04w" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Generalization" href="vizref:///#jgen^vcore.target=uml2.Generalization[jsrctype^name=IVirtualComponent[jcu^name=IVirtualComponent.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IVirtualContainer[jcu^name=IVirtualContainer.java[jpack^name=org.eclipse.wst.common.componentcore.resources[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_sx0OersaEdmrmcil1Bx04w" points="[-2275, -1217, 3492, 4842]$[-4709, -1217, 1058, 4842]$[-4709, -2857, 1058, 3202]"/>
-      </edges>
-    </contents>
-  </eAnnotations>
-  <packageImport xmi:type="uml:ProfileApplication" xmi:id="_XSiFALqvEdmTwLcLkpAHPw">
-    <eAnnotations xmi:id="_XSiFAbqvEdmTwLcLkpAHPw" source="attributes">
-      <details xmi:id="_XSiFArqvEdmTwLcLkpAHPw" key="version" value="0"/>
-    </eAnnotations>
-    <importedPackage xmi:type="uml:Profile" href="pathmap://UML2_PROFILES/Basic.profile.uml2#_6mFRgK86Edih9-GG5afQ0g"/>
-    <importedProfile href="pathmap://UML2_PROFILES/Basic.profile.uml2#_6mFRgK86Edih9-GG5afQ0g"/>
-  </packageImport>
-  <packageImport xmi:type="uml:ProfileApplication" xmi:id="_XUP8QLqvEdmTwLcLkpAHPw">
-    <eAnnotations xmi:id="_XUP8QbqvEdmTwLcLkpAHPw" source="attributes">
-      <details xmi:id="_XUoWwLqvEdmTwLcLkpAHPw" key="version" value="0"/>
-    </eAnnotations>
-    <importedPackage xmi:type="uml:Profile" href="pathmap://UML2_PROFILES/Intermediate.profile.uml2#_Cz7csK87Edih9-GG5afQ0g"/>
-    <importedProfile href="pathmap://UML2_PROFILES/Intermediate.profile.uml2#_Cz7csK87Edih9-GG5afQ0g"/>
-  </packageImport>
-  <packageImport xmi:type="uml:ProfileApplication" xmi:id="_XU0kALqvEdmTwLcLkpAHPw">
-    <eAnnotations xmi:id="_XU0kAbqvEdmTwLcLkpAHPw" source="attributes">
-      <details xmi:id="_XU0kArqvEdmTwLcLkpAHPw" key="version" value="0"/>
-    </eAnnotations>
-    <importedPackage xmi:type="uml:Profile" href="pathmap://UML2_PROFILES/Complete.profile.uml2#_M7pTkK87Edih9-GG5afQ0g"/>
-    <importedProfile href="pathmap://UML2_PROFILES/Complete.profile.uml2#_M7pTkK87Edih9-GG5afQ0g"/>
-  </packageImport>
-  <packageImport xmi:type="uml:ProfileApplication" xmi:id="_XWoh4LqvEdmTwLcLkpAHPw">
-    <eAnnotations xmi:id="_XWoh4bqvEdmTwLcLkpAHPw" source="attributes">
-      <details xmi:id="_XWoh4rqvEdmTwLcLkpAHPw" key="version" value="0"/>
-    </eAnnotations>
-    <importedPackage xmi:type="uml:Profile" href="pathmap://UML2_MSL_PROFILES/Default.epx#_a_S3wNWLEdiy4IqP8whjFA?Default"/>
-    <importedProfile href="pathmap://UML2_MSL_PROFILES/Default.epx#_a_S3wNWLEdiy4IqP8whjFA?Default"/>
-  </packageImport>
-  <packageImport xmi:type="uml:ProfileApplication" xmi:id="_XZsc8LqvEdmTwLcLkpAHPw">
-    <eAnnotations xmi:id="_XZsc8bqvEdmTwLcLkpAHPw" source="attributes">
-      <details xmi:id="_XZsc8rqvEdmTwLcLkpAHPw" key="version" value="0"/>
-    </eAnnotations>
-    <importedPackage xmi:type="uml:Profile" href="pathmap://UML2_MSL_PROFILES/Deployment.epx#_vjbuwOvHEdiDX5bji0iVSA?Deployment"/>
-    <importedProfile href="pathmap://UML2_MSL_PROFILES/Deployment.epx#_vjbuwOvHEdiDX5bji0iVSA?Deployment"/>
-  </packageImport>
-  <packageImport xmi:id="_XiSYQLqvEdmTwLcLkpAHPw">
-    <importedPackage xmi:type="uml:Model" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_EfRZoK86EdieaYgxtVWN8Q"/>
-  </packageImport>
-  <ownedMember xmi:type="uml:Enumeration" xmi:id="_WZvHQLscEdmrmcil1Bx04w" name="Enumeration1"/>
-</uml:Model>
diff --git a/plugins/org.eclipse.wst.common.modulecore/model/componentCore.ecore b/plugins/org.eclipse.wst.common.modulecore/model/componentCore.ecore
deleted file mode 100644
index 1e885f6..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/model/componentCore.ecore
+++ /dev/null
@@ -1,77 +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="componentcore"
-    nsURI="componentcore.xmi" nsPrefix="org.eclipse.wst.common.componentcore">
-  <eClassifiers xsi:type="ecore:EClass" name="WorkbenchComponent">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-        defaultValueLiteral=""/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="resources" unique="false"
-        upperBound="-1" eType="#//ComponentResource" containment="true" eOpposite="#//ComponentResource/component"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="componentType" unique="false"
-        lowerBound="1" eType="#//ComponentType" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="referencedComponents" unique="false"
-        upperBound="-1" eType="#//ReferencedComponent" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="properties" upperBound="-1"
-        eType="#//Property"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="metadataResources" upperBound="-1"
-        eType="#//IPath"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ComponentResource">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="sourcePath" lowerBound="1"
-        eType="#//IPath"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="runtimePath" lowerBound="1"
-        eType="#//IPath"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="exclusions" upperBound="-1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" defaultValueLiteral=""/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="component" unique="false"
-        lowerBound="1" eType="#//WorkbenchComponent" eOpposite="#//WorkbenchComponent/resources"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="resourceType" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" defaultValueLiteral=""/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="IPath" instanceClassName="org.eclipse.core.runtime.IPath">
-    <eAnnotations source="keywords">
-      <details key="datatype"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ComponentType">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="componentTypeId" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" defaultValueLiteral=""/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="version" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" defaultValueLiteral=""/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="properties" upperBound="-1"
-        eType="#//Property"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="metadataResources" upperBound="-1"
-        eType="#//IPath"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Property">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-        defaultValueLiteral=""/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-        defaultValueLiteral=""/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ReferencedComponent">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="handle" lowerBound="1"
-        eType="#//URI"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="runtimePath" lowerBound="1"
-        eType="#//IPath"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="dependencyType" lowerBound="1"
-        eType="#//DependencyType"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="dependentObject" eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EObject"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="URI" instanceClassName="org.eclipse.emf.common.util.URI">
-    <eAnnotations source="keywords">
-      <details key="datatype"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EEnum" name="DependencyType">
-    <eLiterals name="uses"/>
-    <eLiterals name="consumes" value="1"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProjectComponents">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="projectName" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" defaultValueLiteral=""/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="components" unique="false"
-        upperBound="-1" eType="#//WorkbenchComponent" containment="true"/>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/plugins/org.eclipse.wst.common.modulecore/model/componentCore.emx b/plugins/org.eclipse.wst.common.modulecore/model/componentCore.emx
deleted file mode 100644
index 91c48c8..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/model/componentCore.emx
+++ /dev/null
@@ -1,609 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--xtools2_universal_type_manager-->
-<uml:Model xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:Default_0="http:///Default_0.profile.uml2" xmlns:Ecore_0="http:///Ecore_0.profile.uml2" xmlns:notation="http://www.ibm.com/xtools/1.5.0/Notation" xmlns:uml="http://www.eclipse.org/uml2/1.0.0/UML" xmlns:umlnotation="http://www.ibm.com/xtools/1.5.0/Umlnotation" xsi:schemaLocation="http:///Default_0.profile.uml2 pathmap://UML2_MSL_PROFILES/Default.epx#_bA7Pc9WLEdiy4IqP8whjFA?Default/%3CEPackage%3E http:///Ecore_0.profile.uml2 pathmap://UML2_PROFILES/Ecore.profile.uml2#_v9VUsK87Edi5QpYeY_yIpg" xmi:id="3A0B2474025F" name="componentcore" appliedProfile="_kMDG4ZTYEdmy2onHYKlABg _kMDG5JTYEdmy2onHYKlABg _kMDG55TYEdmy2onHYKlABg _kMDG6pTYEdmy2onHYKlABg _kMDG7ZTYEdmy2onHYKlABg _kMJNg5TYEdmy2onHYKlABg _kNq3gZTYEdmy2onHYKlABg _H0ye8JTvEdmDNY6lnGAg5A">
-  <eAnnotations xmi:id="_kMJNhpTYEdmy2onHYKlABg" source="appliedStereotypes">
-    <contents xmi:type="Ecore_0:Ecore__EPackage" xmi:id="_xDZMwJTYEdmy2onHYKlABg" nsURI="componentcore.xmi" basePackage="org.eclipse.wst.common" prefix="ComponentCore"/>
-  </eAnnotations>
-  <eAnnotations xmi:id="_kNq3hJTYEdmy2onHYKlABg" source="appliedStereotypes">
-    <contents xmi:type="Ecore_0:Ecore__EPackage" xmi:id="_kNq3hZTYEdmy2onHYKlABg" nsURI="modulecore.xmi" basePackage="org.eclipse.wst.common" prefix="ModuleCore"/>
-  </eAnnotations>
-  <eAnnotations xmi:id="_kOVl9JTYEdmy2onHYKlABg" source="uml2.diagrams" references="_3A0B2474025F41E3DF060210">
-    <contents xmi:type="notation:Diagram" xmi:id="_3A0B2474025F41E3DF060210" type="Class" name="ComponentCore">
-      <children xmi:id="_kP328JTYEdmy2onHYKlABg" type="Note" sourceEdges="_kQilYpTYEdmy2onHYKlABg">
-        <children xmi:id="_kP99kJTYEdmy2onHYKlABg" type="DiagramName"/>
-        <children xmi:id="_kP99kZTYEdmy2onHYKlABg" type="Description"/>
-        <styles xmi:type="notation:ShapeStyle" xmi:id="_kP328ZTYEdmy2onHYKlABg" description="The ReferencedComponent handle must be resolvable to a WorkbenchComponent.&#xD;&#xA;&#xD;&#xA;The runtimePath specifies the location of the ReferencedComponent in the runtime structure of the containing WorkbenchComponent.&#xD;&#xA;&#xD;&#xA;The dependencyType specifies how the ReferencedComponent is assembled within the containing WorkbenchComponent." fillColor="13369343" lineColor="6737151"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_kP328pTYEdmy2onHYKlABg" x="19398" y="636" width="6934" height="4343"/>
-      </children>
-      <children xmi:id="_kQEENZTYEdmy2onHYKlABg" targetEdges="_bNhv4JTcEdmy2onHYKlABg" element="_3A0B2474025F41EC26DA027A">
-        <children xmi:id="_kQEEOJTYEdmy2onHYKlABg" type="ImageCompartment" element="_3A0B2474025F41EC26DA027A">
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_kQEEOZTYEdmy2onHYKlABg" width="7941" height="2048"/>
-        </children>
-        <children xmi:id="_kQEEOpTYEdmy2onHYKlABg" type="Stereotype" element="_3A0B2474025F41EC26DA027A"/>
-        <children xmi:id="_kQEEO5TYEdmy2onHYKlABg" type="Kind" element="_3A0B2474025F41EC26DA027A"/>
-        <children xmi:id="_kQEEPJTYEdmy2onHYKlABg" type="Name" element="_3A0B2474025F41EC26DA027A"/>
-        <children xmi:id="_kQEEPZTYEdmy2onHYKlABg" type="AttributeCompartment" element="_3A0B2474025F41EC26DA027A">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kQEEPpTYEdmy2onHYKlABg"/>
-        </children>
-        <children xmi:id="_kQEEP5TYEdmy2onHYKlABg" type="OperationCompartment" element="_3A0B2474025F41EC26DA027A">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kQEEQJTYEdmy2onHYKlABg"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_kQEENpTYEdmy2onHYKlABg" showListStereotype="Text" showStereotype="Image"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_kQEEN5TYEdmy2onHYKlABg" x="12285" y="15472"/>
-      </children>
-      <children xmi:id="_kQEEQZTYEdmy2onHYKlABg" targetEdges="_kQKK7pTYEdmy2onHYKlABg" element="_3A0B2474025F41E3DF670039">
-        <children xmi:id="_kQEERJTYEdmy2onHYKlABg" type="ImageCompartment" element="_3A0B2474025F41E3DF670039">
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_kQEERZTYEdmy2onHYKlABg" width="4859" height="2421"/>
-        </children>
-        <children xmi:id="_kQEERpTYEdmy2onHYKlABg" type="Stereotype" element="_3A0B2474025F41E3DF670039"/>
-        <children xmi:id="_kQEER5TYEdmy2onHYKlABg" type="Name" element="_3A0B2474025F41E3DF670039"/>
-        <children xmi:id="_kQEESJTYEdmy2onHYKlABg" type="AttributeCompartment" element="_3A0B2474025F41E3DF670039">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kQEESZTYEdmy2onHYKlABg"/>
-        </children>
-        <children xmi:id="_kQEESpTYEdmy2onHYKlABg" type="OperationCompartment" element="_3A0B2474025F41E3DF670039">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kQEES5TYEdmy2onHYKlABg"/>
-        </children>
-        <children xmi:id="_kQEETJTYEdmy2onHYKlABg" visible="false" type="SignalCompartment" element="_3A0B2474025F41E3DF670039">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kQEETZTYEdmy2onHYKlABg"/>
-        </children>
-        <children xmi:id="_kQEETpTYEdmy2onHYKlABg" visible="false" type="StructureCompartment" element="_3A0B2474025F41E3DF670039">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_kQEET5TYEdmy2onHYKlABg" canonical="false"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_kQEEQpTYEdmy2onHYKlABg" showListStereotype="Text" showStereotype="Image"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_kQEEQ5TYEdmy2onHYKlABg" x="5969" y="16099"/>
-      </children>
-      <children xmi:id="_kQEEUJTYEdmy2onHYKlABg" sourceEdges="_B4bI0JTcEdmy2onHYKlABg _bNhv4JTcEdmy2onHYKlABg" targetEdges="_kQWYHpTYEdmy2onHYKlABg" element="_3A0B2474025F41EC1D5103E2">
-        <children xmi:id="_kQEEU5TYEdmy2onHYKlABg" type="ImageCompartment" element="_3A0B2474025F41EC1D5103E2">
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_kQEEVJTYEdmy2onHYKlABg" width="6028" height="1998"/>
-        </children>
-        <children xmi:id="_kQEEVZTYEdmy2onHYKlABg" type="Stereotype" element="_3A0B2474025F41EC1D5103E2"/>
-        <children xmi:id="_kQEEVpTYEdmy2onHYKlABg" type="Name" element="_3A0B2474025F41EC1D5103E2"/>
-        <children xmi:id="_kQEEV5TYEdmy2onHYKlABg" type="AttributeCompartment" element="_3A0B2474025F41EC1D5103E2">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kQEEWJTYEdmy2onHYKlABg"/>
-        </children>
-        <children xmi:id="_kQEEWZTYEdmy2onHYKlABg" type="OperationCompartment" element="_3A0B2474025F41EC1D5103E2">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kQEEWpTYEdmy2onHYKlABg"/>
-        </children>
-        <children xmi:id="_kQEEW5TYEdmy2onHYKlABg" visible="false" type="SignalCompartment" element="_3A0B2474025F41EC1D5103E2">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kQEEXJTYEdmy2onHYKlABg"/>
-        </children>
-        <children xmi:id="_kQEEXZTYEdmy2onHYKlABg" visible="false" type="StructureCompartment" element="_3A0B2474025F41EC1D5103E2">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_kQEEXpTYEdmy2onHYKlABg" canonical="false"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_kQEEUZTYEdmy2onHYKlABg" showListStereotype="Text" showStereotype="Image"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_kQEEUpTYEdmy2onHYKlABg" x="11448" y="11130"/>
-      </children>
-      <children xmi:id="_kQEEX5TYEdmy2onHYKlABg" sourceEdges="_kQWYPpTYEdmy2onHYKlABg" element="_3A0B2474025F41F566DB0251">
-        <children xmi:id="_kQEEYpTYEdmy2onHYKlABg" type="ImageCompartment" element="_3A0B2474025F41F566DB0251">
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_kQEEY5TYEdmy2onHYKlABg" width="3742" height="1574"/>
-        </children>
-        <children xmi:id="_kQEEZJTYEdmy2onHYKlABg" type="Stereotype" element="_3A0B2474025F41F566DB0251"/>
-        <children xmi:id="_kQEEZZTYEdmy2onHYKlABg" type="Name" element="_3A0B2474025F41F566DB0251"/>
-        <children xmi:id="_kQEEZpTYEdmy2onHYKlABg" type="AttributeCompartment" element="_3A0B2474025F41F566DB0251">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kQEEZ5TYEdmy2onHYKlABg"/>
-        </children>
-        <children xmi:id="_kQEEaJTYEdmy2onHYKlABg" type="OperationCompartment" element="_3A0B2474025F41F566DB0251">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kQEEaZTYEdmy2onHYKlABg"/>
-        </children>
-        <children xmi:id="_kQEEapTYEdmy2onHYKlABg" visible="false" type="SignalCompartment" element="_3A0B2474025F41F566DB0251">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kQEEa5TYEdmy2onHYKlABg"/>
-        </children>
-        <children xmi:id="_kQEEbJTYEdmy2onHYKlABg" visible="false" type="StructureCompartment" element="_3A0B2474025F41F566DB0251">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_kQEEbZTYEdmy2onHYKlABg" canonical="false"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_kQEEYJTYEdmy2onHYKlABg" showListStereotype="Text" showStereotype="Image"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_kQEEYZTYEdmy2onHYKlABg" x="1651" y="4872"/>
-      </children>
-      <children xmi:id="_kQKK0JTYEdmy2onHYKlABg" targetEdges="_kQcewpTYEdmy2onHYKlABg _kQilYpTYEdmy2onHYKlABg" element="_3A0B2474025F41F6C24B023D">
-        <children xmi:id="_kQKK05TYEdmy2onHYKlABg" type="ImageCompartment" element="_3A0B2474025F41F6C24B023D">
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_kQKK1JTYEdmy2onHYKlABg" width="6146" height="2421"/>
-        </children>
-        <children xmi:id="_kQKK1ZTYEdmy2onHYKlABg" type="Stereotype" element="_3A0B2474025F41F6C24B023D"/>
-        <children xmi:id="_kQKK1pTYEdmy2onHYKlABg" type="Name" element="_3A0B2474025F41F6C24B023D"/>
-        <children xmi:id="_kQKK15TYEdmy2onHYKlABg" type="AttributeCompartment" element="_3A0B2474025F41F6C24B023D">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kQKK2JTYEdmy2onHYKlABg"/>
-        </children>
-        <children xmi:id="_kQKK2ZTYEdmy2onHYKlABg" type="OperationCompartment" element="_3A0B2474025F41F6C24B023D">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kQKK2pTYEdmy2onHYKlABg"/>
-        </children>
-        <children xmi:id="_kQKK25TYEdmy2onHYKlABg" visible="false" type="SignalCompartment" element="_3A0B2474025F41F6C24B023D">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kQKK3JTYEdmy2onHYKlABg"/>
-        </children>
-        <children xmi:id="_kQKK3ZTYEdmy2onHYKlABg" visible="false" type="StructureCompartment" element="_3A0B2474025F41F6C24B023D">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_kQKK3pTYEdmy2onHYKlABg" canonical="false"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_kQKK0ZTYEdmy2onHYKlABg" showListStereotype="Text" showStereotype="Image"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_kQKK0pTYEdmy2onHYKlABg" x="12402" y="4134"/>
-      </children>
-      <children xmi:id="_kQKK35TYEdmy2onHYKlABg" sourceEdges="_kQKK7pTYEdmy2onHYKlABg _kQWYHpTYEdmy2onHYKlABg _kQcewpTYEdmy2onHYKlABg" targetEdges="_kQWYPpTYEdmy2onHYKlABg" element="_3A0B2474025F41E3DF5801FA">
-        <children xmi:id="_kQKK4pTYEdmy2onHYKlABg" type="ImageCompartment" element="_3A0B2474025F41E3DF5801FA">
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_kQKK45TYEdmy2onHYKlABg" width="4080" height="1998"/>
-        </children>
-        <children xmi:id="_kQKK5JTYEdmy2onHYKlABg" type="Stereotype" element="_3A0B2474025F41E3DF5801FA"/>
-        <children xmi:id="_kQKK5ZTYEdmy2onHYKlABg" type="Name" element="_3A0B2474025F41E3DF5801FA"/>
-        <children xmi:id="_kQKK5pTYEdmy2onHYKlABg" type="AttributeCompartment" element="_3A0B2474025F41E3DF5801FA">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kQKK55TYEdmy2onHYKlABg"/>
-        </children>
-        <children xmi:id="_kQKK6JTYEdmy2onHYKlABg" type="OperationCompartment" element="_3A0B2474025F41E3DF5801FA">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kQKK6ZTYEdmy2onHYKlABg"/>
-        </children>
-        <children xmi:id="_kQKK6pTYEdmy2onHYKlABg" visible="false" type="SignalCompartment" element="_3A0B2474025F41E3DF5801FA">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kQKK65TYEdmy2onHYKlABg"/>
-        </children>
-        <children xmi:id="_kQKK7JTYEdmy2onHYKlABg" visible="false" type="StructureCompartment" element="_3A0B2474025F41E3DF5801FA">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_kQKK7ZTYEdmy2onHYKlABg" canonical="false"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_kQKK4JTYEdmy2onHYKlABg" showListStereotype="Text" showStereotype="Image"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_kQKK4ZTYEdmy2onHYKlABg" x="5952" y="7911"/>
-      </children>
-      <children xmi:id="_kQilVJTYEdmy2onHYKlABg" element="_3A0B2474025F420394F50185">
-        <children xmi:id="_kQilV5TYEdmy2onHYKlABg" type="ImageCompartment" element="_3A0B2474025F420394F50185">
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_kQilWJTYEdmy2onHYKlABg" width="3081" height="2472"/>
-        </children>
-        <children xmi:id="_kQilWZTYEdmy2onHYKlABg" type="Stereotype" element="_3A0B2474025F420394F50185"/>
-        <children xmi:id="_kQilWpTYEdmy2onHYKlABg" type="Kind" element="_3A0B2474025F420394F50185"/>
-        <children xmi:id="_kQilW5TYEdmy2onHYKlABg" type="Name" element="_3A0B2474025F420394F50185"/>
-        <children xmi:id="_kQilXJTYEdmy2onHYKlABg" type="EnumerationCompartment" element="_3A0B2474025F420394F50185">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kQilXZTYEdmy2onHYKlABg"/>
-        </children>
-        <children xmi:id="_kQilXpTYEdmy2onHYKlABg" type="AttributeCompartment" element="_3A0B2474025F420394F50185">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kQilX5TYEdmy2onHYKlABg"/>
-        </children>
-        <children xmi:id="_kQilYJTYEdmy2onHYKlABg" type="OperationCompartment" element="_3A0B2474025F420394F50185">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kQilYZTYEdmy2onHYKlABg"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_kQilVZTYEdmy2onHYKlABg" showListStereotype="Text" showStereotype="Image"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_kQilVpTYEdmy2onHYKlABg" x="19716" y="7314"/>
-      </children>
-      <children xmi:id="_5BUlQJTbEdmy2onHYKlABg" targetEdges="_B4bI0JTcEdmy2onHYKlABg" element="_5BCRYJTbEdmy2onHYKlABg">
-        <children xmi:id="_5BUlQ5TbEdmy2onHYKlABg" type="ImageCompartment" element="_5BCRYJTbEdmy2onHYKlABg">
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_5BUlRJTbEdmy2onHYKlABg" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_5BUlRZTbEdmy2onHYKlABg" type="Stereotype" element="_5BCRYJTbEdmy2onHYKlABg"/>
-        <children xmi:id="_5BUlRpTbEdmy2onHYKlABg" type="Name" element="_5BCRYJTbEdmy2onHYKlABg"/>
-        <children xmi:id="_5BUlR5TbEdmy2onHYKlABg" type="AttributeCompartment" element="_5BCRYJTbEdmy2onHYKlABg">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_5BUlSJTbEdmy2onHYKlABg"/>
-        </children>
-        <children xmi:id="_5BUlSZTbEdmy2onHYKlABg" type="OperationCompartment" element="_5BCRYJTbEdmy2onHYKlABg">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_5BUlSpTbEdmy2onHYKlABg"/>
-        </children>
-        <children xmi:id="_5BUlS5TbEdmy2onHYKlABg" visible="false" type="SignalCompartment" element="_5BCRYJTbEdmy2onHYKlABg">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_5BUlTJTbEdmy2onHYKlABg"/>
-        </children>
-        <children xmi:id="_5BUlTZTbEdmy2onHYKlABg" visible="false" type="StructureCompartment" element="_5BCRYJTbEdmy2onHYKlABg">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_5BUlTpTbEdmy2onHYKlABg"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_5BUlQZTbEdmy2onHYKlABg" showStereotype="Label"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_5BUlQpTbEdmy2onHYKlABg" x="19080" y="11130"/>
-      </children>
-      <children xmi:id="_IQ7RkKS3EdmtQ4Tckv5S2Q" element="_IQQjMKS3EdmtQ4Tckv5S2Q">
-        <children xmi:id="_IRBYMKS3EdmtQ4Tckv5S2Q" type="ImageCompartment" element="_IQQjMKS3EdmtQ4Tckv5S2Q">
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_IRBYMaS3EdmtQ4Tckv5S2Q" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_IRBYMqS3EdmtQ4Tckv5S2Q" type="Stereotype" element="_IQQjMKS3EdmtQ4Tckv5S2Q"/>
-        <children xmi:id="_IRBYM6S3EdmtQ4Tckv5S2Q" type="Kind" element="_IQQjMKS3EdmtQ4Tckv5S2Q"/>
-        <children xmi:id="_IRBYNKS3EdmtQ4Tckv5S2Q" type="Name" element="_IQQjMKS3EdmtQ4Tckv5S2Q"/>
-        <children xmi:id="_IRBYNaS3EdmtQ4Tckv5S2Q" visible="false" type="AttributeCompartment" element="_IQQjMKS3EdmtQ4Tckv5S2Q">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_IRBYNqS3EdmtQ4Tckv5S2Q"/>
-        </children>
-        <children xmi:id="_IRBYN6S3EdmtQ4Tckv5S2Q" visible="false" type="OperationCompartment" element="_IQQjMKS3EdmtQ4Tckv5S2Q">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_IRBYOKS3EdmtQ4Tckv5S2Q"/>
-        </children>
-        <children xmi:id="_IRBYOaS3EdmtQ4Tckv5S2Q" visible="false" type="RealizationListCompartment" element="_IQQjMKS3EdmtQ4Tckv5S2Q">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_IRBYOqS3EdmtQ4Tckv5S2Q"/>
-        </children>
-        <children xmi:id="_IRBYO6S3EdmtQ4Tckv5S2Q" type="RequiredInterfaceListCompartment" element="_IQQjMKS3EdmtQ4Tckv5S2Q">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_IRBYPKS3EdmtQ4Tckv5S2Q"/>
-        </children>
-        <children xmi:id="_IRBYPaS3EdmtQ4Tckv5S2Q" type="ProvidedInterfaceListCompartment" element="_IQQjMKS3EdmtQ4Tckv5S2Q">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_IRBYPqS3EdmtQ4Tckv5S2Q"/>
-        </children>
-        <children xmi:id="_IRBYP6S3EdmtQ4Tckv5S2Q" visible="false" type="StructureCompartment" element="_IQQjMKS3EdmtQ4Tckv5S2Q">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_IRBYQKS3EdmtQ4Tckv5S2Q"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLComponentStyle" xmi:id="_IQ7RkaS3EdmtQ4Tckv5S2Q" showStereotype="Label"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_IQ7RkqS3EdmtQ4Tckv5S2Q" x="19050" y="16007"/>
-      </children>
-      <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_kOVl9pTYEdmy2onHYKlABg"/>
-      <edges xmi:id="_kQKK7pTYEdmy2onHYKlABg" element="_3A0B2474025F41E3E14B01E3" source="_kQKK35TYEdmy2onHYKlABg" target="_kQEEQZTYEdmy2onHYKlABg">
-        <children xmi:id="_kQKK8ZTYEdmy2onHYKlABg" type="NameLabel" element="_3A0B2474025F41E3E14B01E3">
-          <children xmi:id="_kQQRcJTYEdmy2onHYKlABg" type="Stereotype" element="_3A0B2474025F41E3E14B01E3"/>
-          <children xmi:id="_kQQRcZTYEdmy2onHYKlABg" visible="false" type="Name" element="_3A0B2474025F41E3E14B01E3"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_kQKK8pTYEdmy2onHYKlABg" y="-185"/>
-        </children>
-        <children xmi:id="_kQQRcpTYEdmy2onHYKlABg" type="ToMultiplicityLabel" element="_3A0B2474025F41E3E14D031F">
-          <children xmi:id="_kQQRdJTYEdmy2onHYKlABg" type="ToMultiplicity" element="_3A0B2474025F41E3E14D031F"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_kQQRc5TYEdmy2onHYKlABg" x="-259" y="-264"/>
-        </children>
-        <children xmi:id="_kQQRdZTYEdmy2onHYKlABg" type="ToRoleLabel" element="_3A0B2474025F41E3E14D031F">
-          <children xmi:id="_kQQRd5TYEdmy2onHYKlABg" type="ToRole" element="_3A0B2474025F41E3E14D031F"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_kQQRdpTYEdmy2onHYKlABg" x="218" y="-1164"/>
-        </children>
-        <children xmi:id="_kQWYEJTYEdmy2onHYKlABg" type="FromMultiplicityLabel" element="_3A0B2474025F41E3E14D031D">
-          <children xmi:id="_kQWYEpTYEdmy2onHYKlABg" type="FromMultiplicity" element="_3A0B2474025F41E3E14D031D"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_kQWYEZTYEdmy2onHYKlABg" x="345" y="-263"/>
-        </children>
-        <children xmi:id="_kQWYE5TYEdmy2onHYKlABg" type="FromRoleLabel" element="_3A0B2474025F41E3E14D031D">
-          <children xmi:id="_kQWYFZTYEdmy2onHYKlABg" type="FromRole" element="_3A0B2474025F41E3E14D031D"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_kQWYFJTYEdmy2onHYKlABg" x="663" y="-1017"/>
-        </children>
-        <children xmi:id="_kQWYFpTYEdmy2onHYKlABg" type="ToQualifierLabel" element="_3A0B2474025F41E3E14D031F">
-          <children xmi:id="_kQWYGJTYEdmy2onHYKlABg" type="QualifierCompartment" element="_3A0B2474025F41E3E14D031F">
-            <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kQWYGZTYEdmy2onHYKlABg"/>
-          </children>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_kQWYF5TYEdmy2onHYKlABg" y="-185"/>
-        </children>
-        <children xmi:id="_kQWYGpTYEdmy2onHYKlABg" type="FromQualifierLabel" element="_3A0B2474025F41E3E14D031D">
-          <children xmi:id="_kQWYHJTYEdmy2onHYKlABg" type="QualifierCompartment" element="_3A0B2474025F41E3E14D031D">
-            <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kQWYHZTYEdmy2onHYKlABg"/>
-          </children>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_kQWYG5TYEdmy2onHYKlABg" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_kQKK75TYEdmy2onHYKlABg" routing="Rectilinear" showStereotype="None"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_kQKK8JTYEdmy2onHYKlABg" points="[-33, 999, -440, -7399]$[-33, 7188, -440, -1210]"/>
-      </edges>
-      <edges xmi:id="_kQWYHpTYEdmy2onHYKlABg" element="_3A0B2474025F41EC1D9802C2" source="_kQKK35TYEdmy2onHYKlABg" target="_kQEEUJTYEdmy2onHYKlABg">
-        <children xmi:id="_kQWYIZTYEdmy2onHYKlABg" type="NameLabel" element="_3A0B2474025F41EC1D9802C2">
-          <children xmi:id="_kQWYI5TYEdmy2onHYKlABg" type="Stereotype" element="_3A0B2474025F41EC1D9802C2"/>
-          <children xmi:id="_kQWYJJTYEdmy2onHYKlABg" visible="false" type="Name" element="_3A0B2474025F41EC1D9802C2"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_kQWYIpTYEdmy2onHYKlABg" y="-185"/>
-        </children>
-        <children xmi:id="_kQWYJZTYEdmy2onHYKlABg" visible="false" type="ToMultiplicityLabel" element="_3A0B2474025F41EC1D990243">
-          <children xmi:id="_kQWYJ5TYEdmy2onHYKlABg" type="ToMultiplicity" element="_3A0B2474025F41EC1D990243"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_kQWYJpTYEdmy2onHYKlABg" y="397"/>
-        </children>
-        <children xmi:id="_kQWYKJTYEdmy2onHYKlABg" visible="false" type="ToRoleLabel" element="_3A0B2474025F41EC1D990243">
-          <children xmi:id="_kQWYKpTYEdmy2onHYKlABg" type="ToRole" element="_3A0B2474025F41EC1D990243"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_kQWYKZTYEdmy2onHYKlABg" y="-397"/>
-        </children>
-        <children xmi:id="_kQWYK5TYEdmy2onHYKlABg" type="FromMultiplicityLabel" element="_3A0B2474025F41EC1D990241">
-          <children xmi:id="_kQWYLZTYEdmy2onHYKlABg" type="FromMultiplicity" element="_3A0B2474025F41EC1D990241"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_kQWYLJTYEdmy2onHYKlABg" x="-10" y="-301"/>
-        </children>
-        <children xmi:id="_kQWYLpTYEdmy2onHYKlABg" type="FromRoleLabel" element="_3A0B2474025F41EC1D990241">
-          <children xmi:id="_kQWYMJTYEdmy2onHYKlABg" type="FromRole" element="_3A0B2474025F41EC1D990241"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_kQWYL5TYEdmy2onHYKlABg" x="494" y="-1571"/>
-        </children>
-        <children xmi:id="_kQWYMZTYEdmy2onHYKlABg" type="ToQualifierLabel" element="_3A0B2474025F41EC1D990243">
-          <children xmi:id="_kQWYM5TYEdmy2onHYKlABg" type="QualifierCompartment" element="_3A0B2474025F41EC1D990243">
-            <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kQWYNJTYEdmy2onHYKlABg"/>
-          </children>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_kQWYMpTYEdmy2onHYKlABg" y="-185"/>
-        </children>
-        <children xmi:id="_kQWYNZTYEdmy2onHYKlABg" type="FromQualifierLabel" element="_3A0B2474025F41EC1D990241">
-          <children xmi:id="_kQWYN5TYEdmy2onHYKlABg" type="QualifierCompartment" element="_3A0B2474025F41EC1D990241">
-            <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kQWYOJTYEdmy2onHYKlABg"/>
-          </children>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_kQWYNpTYEdmy2onHYKlABg" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_kQWYH5TYEdmy2onHYKlABg" routing="Rectilinear" showStereotype="None"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_kQWYIJTYEdmy2onHYKlABg" points="[2040, 330, -5681, -2921]$[7730, 330, 8, -2921]$[7730, 2252, 8, -999]"/>
-      </edges>
-      <edges xmi:id="_kQWYPpTYEdmy2onHYKlABg" element="_3A0B2474025F41F5672000E8" source="_kQEEX5TYEdmy2onHYKlABg" target="_kQKK35TYEdmy2onHYKlABg">
-        <children xmi:id="_kQWYQZTYEdmy2onHYKlABg" type="NameLabel" element="_3A0B2474025F41F5672000E8">
-          <children xmi:id="_kQWYQ5TYEdmy2onHYKlABg" type="Stereotype" element="_3A0B2474025F41F5672000E8"/>
-          <children xmi:id="_kQWYRJTYEdmy2onHYKlABg" visible="false" type="Name" element="_3A0B2474025F41F5672000E8"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_kQWYQpTYEdmy2onHYKlABg" y="-185"/>
-        </children>
-        <children xmi:id="_kQWYRZTYEdmy2onHYKlABg" visible="false" type="ToMultiplicityLabel" element="_3A0B2474025F41F567210113">
-          <children xmi:id="_kQcesJTYEdmy2onHYKlABg" type="ToMultiplicity" element="_3A0B2474025F41F567210113"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_kQWYRpTYEdmy2onHYKlABg" y="397"/>
-        </children>
-        <children xmi:id="_kQcesZTYEdmy2onHYKlABg" visible="false" type="ToRoleLabel" element="_3A0B2474025F41F567210113">
-          <children xmi:id="_kQces5TYEdmy2onHYKlABg" type="ToRole" element="_3A0B2474025F41F567210113"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_kQcespTYEdmy2onHYKlABg" y="-397"/>
-        </children>
-        <children xmi:id="_kQcetJTYEdmy2onHYKlABg" type="FromMultiplicityLabel" element="_3A0B2474025F41F567210111">
-          <children xmi:id="_kQcetpTYEdmy2onHYKlABg" type="FromMultiplicity" element="_3A0B2474025F41F567210111"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_kQcetZTYEdmy2onHYKlABg" x="-1568" y="516"/>
-        </children>
-        <children xmi:id="_kQcet5TYEdmy2onHYKlABg" type="FromRoleLabel" element="_3A0B2474025F41F567210111">
-          <children xmi:id="_kQceuZTYEdmy2onHYKlABg" type="FromRole" element="_3A0B2474025F41F567210111"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_kQceuJTYEdmy2onHYKlABg" x="-602" y="834"/>
-        </children>
-        <children xmi:id="_kQceupTYEdmy2onHYKlABg" type="ToQualifierLabel" element="_3A0B2474025F41F567210113">
-          <children xmi:id="_kQcevJTYEdmy2onHYKlABg" type="QualifierCompartment" element="_3A0B2474025F41F567210113">
-            <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kQcevZTYEdmy2onHYKlABg"/>
-          </children>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_kQceu5TYEdmy2onHYKlABg" y="-185"/>
-        </children>
-        <children xmi:id="_kQcevpTYEdmy2onHYKlABg" type="FromQualifierLabel" element="_3A0B2474025F41F567210111">
-          <children xmi:id="_kQcewJTYEdmy2onHYKlABg" type="QualifierCompartment" element="_3A0B2474025F41F567210111">
-            <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kQcewZTYEdmy2onHYKlABg"/>
-          </children>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_kQcev5TYEdmy2onHYKlABg" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_kQWYP5TYEdmy2onHYKlABg" routing="Rectilinear" showStereotype="None"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_kQWYQJTYEdmy2onHYKlABg" points="[-770, 787, -5240, -2463]$[-770, 2734, -5240, -516]$[2429, 2734, -2040, -516]"/>
-      </edges>
-      <edges xmi:id="_kQcewpTYEdmy2onHYKlABg" element="_3A0B2474025F420146A502E2" source="_kQKK35TYEdmy2onHYKlABg" target="_kQKK0JTYEdmy2onHYKlABg">
-        <children xmi:id="_kQcexZTYEdmy2onHYKlABg" type="NameLabel" element="_3A0B2474025F420146A502E2">
-          <children xmi:id="_kQcex5TYEdmy2onHYKlABg" type="Stereotype" element="_3A0B2474025F420146A502E2"/>
-          <children xmi:id="_kQceyJTYEdmy2onHYKlABg" visible="false" type="Name" element="_3A0B2474025F420146A502E2"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_kQcexpTYEdmy2onHYKlABg" y="-185"/>
-        </children>
-        <children xmi:id="_kQceyZTYEdmy2onHYKlABg" visible="false" type="ToMultiplicityLabel" element="_3A0B2474025F420146A60281">
-          <children xmi:id="_kQcey5TYEdmy2onHYKlABg" type="ToMultiplicity" element="_3A0B2474025F420146A60281"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_kQceypTYEdmy2onHYKlABg" y="397"/>
-        </children>
-        <children xmi:id="_kQcezJTYEdmy2onHYKlABg" visible="false" type="ToRoleLabel" element="_3A0B2474025F420146A60281">
-          <children xmi:id="_kQcezpTYEdmy2onHYKlABg" type="ToRole" element="_3A0B2474025F420146A60281"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_kQcezZTYEdmy2onHYKlABg" y="-397"/>
-        </children>
-        <children xmi:id="_kQcez5TYEdmy2onHYKlABg" type="FromMultiplicityLabel" element="_3A0B2474025F420146A6027F">
-          <children xmi:id="_kQce0ZTYEdmy2onHYKlABg" type="FromMultiplicity" element="_3A0B2474025F420146A6027F"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_kQce0JTYEdmy2onHYKlABg" x="416" y="593"/>
-        </children>
-        <children xmi:id="_kQce0pTYEdmy2onHYKlABg" type="FromRoleLabel" element="_3A0B2474025F420146A6027F">
-          <children xmi:id="_kQce1JTYEdmy2onHYKlABg" type="FromRole" element="_3A0B2474025F420146A6027F"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_kQce05TYEdmy2onHYKlABg" x="-6" y="2426"/>
-        </children>
-        <children xmi:id="_kQce1ZTYEdmy2onHYKlABg" type="ToQualifierLabel" element="_3A0B2474025F420146A60281">
-          <children xmi:id="_kQce15TYEdmy2onHYKlABg" type="QualifierCompartment" element="_3A0B2474025F420146A60281">
-            <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kQce2JTYEdmy2onHYKlABg"/>
-          </children>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_kQce1pTYEdmy2onHYKlABg" y="-185"/>
-        </children>
-        <children xmi:id="_kQilUJTYEdmy2onHYKlABg" type="FromQualifierLabel" element="_3A0B2474025F420146A6027F">
-          <children xmi:id="_kQilUpTYEdmy2onHYKlABg" type="QualifierCompartment" element="_3A0B2474025F420146A6027F">
-            <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kQilU5TYEdmy2onHYKlABg"/>
-          </children>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_kQilUZTYEdmy2onHYKlABg" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_kQcew5TYEdmy2onHYKlABg" routing="Rectilinear" showStereotype="None"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_kQcexJTYEdmy2onHYKlABg" points="[2408, 28, -4762, 3573]$[6456, 28, -714, 3573]$[6456, -2434, -714, 1111]"/>
-      </edges>
-      <edges xmi:id="_kQilYpTYEdmy2onHYKlABg" type="NoteAttachment" source="_kP328JTYEdmy2onHYKlABg" target="_kQKK0JTYEdmy2onHYKlABg">
-        <styles xmi:type="notation:ConnectorStyle" xmi:id="_kQilY5TYEdmy2onHYKlABg" routing="Rectilinear"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_kQilZJTYEdmy2onHYKlABg" points="[-3493, -79, 3863, -2487]$[-5080, -79, 2276, -2487]$[-5080, 1297, 2276, -1111]"/>
-        <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_kQilZZTYEdmy2onHYKlABg" id="anchor50"/>
-        <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_kQilZpTYEdmy2onHYKlABg" id="anchor50"/>
-      </edges>
-      <edges xmi:id="_B4bI0JTcEdmy2onHYKlABg" element="_B3wacJTcEdmy2onHYKlABg" source="_kQEEUJTYEdmy2onHYKlABg" target="_5BUlQJTbEdmy2onHYKlABg">
-        <children xmi:id="_B4bI05TcEdmy2onHYKlABg" type="NameLabel" element="_B3wacJTcEdmy2onHYKlABg">
-          <children xmi:id="_B4bI1ZTcEdmy2onHYKlABg" type="Stereotype" element="_B3wacJTcEdmy2onHYKlABg"/>
-          <children xmi:id="_B4bI1pTcEdmy2onHYKlABg" type="Name" element="_B3wacJTcEdmy2onHYKlABg"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_B4bI1JTcEdmy2onHYKlABg" y="-185"/>
-        </children>
-        <children xmi:id="_B4bI15TcEdmy2onHYKlABg" type="ToMultiplicityLabel" element="_B3wacpTcEdmy2onHYKlABg">
-          <children xmi:id="_B4bI2ZTcEdmy2onHYKlABg" type="ToMultiplicity" element="_B3wacpTcEdmy2onHYKlABg"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_B4bI2JTcEdmy2onHYKlABg" y="397"/>
-        </children>
-        <children xmi:id="_B4bI2pTcEdmy2onHYKlABg" type="ToRoleLabel" element="_B3wacpTcEdmy2onHYKlABg">
-          <children xmi:id="_B4bI3JTcEdmy2onHYKlABg" type="ToRole" element="_B3wacpTcEdmy2onHYKlABg"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_B4bI25TcEdmy2onHYKlABg" y="-397"/>
-        </children>
-        <children xmi:id="_B4bI3ZTcEdmy2onHYKlABg" type="FromMultiplicityLabel" element="_B3wacZTcEdmy2onHYKlABg">
-          <children xmi:id="_B4bI35TcEdmy2onHYKlABg" type="FromMultiplicity" element="_B3wacZTcEdmy2onHYKlABg"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_B4bI3pTcEdmy2onHYKlABg" x="-1280" y="575"/>
-        </children>
-        <children xmi:id="_B4bI4JTcEdmy2onHYKlABg" type="FromRoleLabel" element="_B3wacZTcEdmy2onHYKlABg">
-          <children xmi:id="_B4bI4pTcEdmy2onHYKlABg" type="FromRole" element="_B3wacZTcEdmy2onHYKlABg"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_B4bI4ZTcEdmy2onHYKlABg" x="-486" y="893"/>
-        </children>
-        <children xmi:id="_B4bI45TcEdmy2onHYKlABg" type="ToQualifierLabel" element="_B3wacpTcEdmy2onHYKlABg">
-          <children xmi:id="_B4bI5ZTcEdmy2onHYKlABg" type="QualifierCompartment" element="_B3wacpTcEdmy2onHYKlABg">
-            <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_B4bI5pTcEdmy2onHYKlABg"/>
-          </children>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_B4bI5JTcEdmy2onHYKlABg" y="-185"/>
-        </children>
-        <children xmi:id="_B4bI55TcEdmy2onHYKlABg" type="FromQualifierLabel" element="_B3wacZTcEdmy2onHYKlABg">
-          <children xmi:id="_B4bI6ZTcEdmy2onHYKlABg" type="QualifierCompartment" element="_B3wacZTcEdmy2onHYKlABg">
-            <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_B4bI6pTcEdmy2onHYKlABg"/>
-          </children>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_B4bI6JTcEdmy2onHYKlABg" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_B4bI0ZTcEdmy2onHYKlABg" routing="Rectilinear" showStereotype="Text"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_B4bI0pTcEdmy2onHYKlABg" points="[2064, 27, -4286, 27]$[4974, 27, -1376, 27]"/>
-      </edges>
-      <edges xmi:id="_bNhv4JTcEdmy2onHYKlABg" element="_bNDOwJTcEdmy2onHYKlABg" source="_kQEEUJTYEdmy2onHYKlABg" target="_kQEENZTYEdmy2onHYKlABg">
-        <children xmi:id="_bNhv45TcEdmy2onHYKlABg" type="NameLabel" element="_bNDOwJTcEdmy2onHYKlABg">
-          <children xmi:id="_bNhv5ZTcEdmy2onHYKlABg" type="Stereotype" element="_bNDOwJTcEdmy2onHYKlABg"/>
-          <children xmi:id="_bNhv5pTcEdmy2onHYKlABg" type="Name" element="_bNDOwJTcEdmy2onHYKlABg"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_bNhv5JTcEdmy2onHYKlABg" y="-185"/>
-        </children>
-        <children xmi:id="_bNhv55TcEdmy2onHYKlABg" type="ToMultiplicityLabel" element="_bNDOwpTcEdmy2onHYKlABg">
-          <children xmi:id="_bNhv6ZTcEdmy2onHYKlABg" type="ToMultiplicity" element="_bNDOwpTcEdmy2onHYKlABg"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_bNhv6JTcEdmy2onHYKlABg" y="397"/>
-        </children>
-        <children xmi:id="_bNhv6pTcEdmy2onHYKlABg" type="ToRoleLabel" element="_bNDOwpTcEdmy2onHYKlABg">
-          <children xmi:id="_bNhv7JTcEdmy2onHYKlABg" type="ToRole" element="_bNDOwpTcEdmy2onHYKlABg"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_bNhv65TcEdmy2onHYKlABg" y="-397"/>
-        </children>
-        <children xmi:id="_bNhv7ZTcEdmy2onHYKlABg" type="FromMultiplicityLabel" element="_bNDOwZTcEdmy2onHYKlABg">
-          <children xmi:id="_bNhv75TcEdmy2onHYKlABg" type="FromMultiplicity" element="_bNDOwZTcEdmy2onHYKlABg"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_bNhv7pTcEdmy2onHYKlABg" x="-257" y="-353"/>
-        </children>
-        <children xmi:id="_bNhv8JTcEdmy2onHYKlABg" type="FromRoleLabel" element="_bNDOwZTcEdmy2onHYKlABg">
-          <children xmi:id="_bNhv8pTcEdmy2onHYKlABg" type="FromRole" element="_bNDOwZTcEdmy2onHYKlABg"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_bNhv8ZTcEdmy2onHYKlABg" x="61" y="-1782"/>
-        </children>
-        <children xmi:id="_bNhv85TcEdmy2onHYKlABg" type="ToQualifierLabel" element="_bNDOwpTcEdmy2onHYKlABg">
-          <children xmi:id="_bNhv9ZTcEdmy2onHYKlABg" type="QualifierCompartment" element="_bNDOwpTcEdmy2onHYKlABg">
-            <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_bNhv9pTcEdmy2onHYKlABg"/>
-          </children>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_bNhv9JTcEdmy2onHYKlABg" y="-185"/>
-        </children>
-        <children xmi:id="_bNhv95TcEdmy2onHYKlABg" type="FromQualifierLabel" element="_bNDOwZTcEdmy2onHYKlABg">
-          <children xmi:id="_bNhv-ZTcEdmy2onHYKlABg" type="QualifierCompartment" element="_bNDOwZTcEdmy2onHYKlABg">
-            <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_bNhv-pTcEdmy2onHYKlABg"/>
-          </children>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_bNhv-JTcEdmy2onHYKlABg" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_bNhv4ZTcEdmy2onHYKlABg" routing="Rectilinear" showStereotype="Text"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_bNhv4pTcEdmy2onHYKlABg" points="[5, 42, -18, -111]$[5, 123, -18, -30]"/>
-      </edges>
-    </contents>
-  </eAnnotations>
-  <packageImport xmi:type="uml:ProfileApplication" xmi:id="_kMDG4ZTYEdmy2onHYKlABg">
-    <eAnnotations xmi:id="_kMDG4pTYEdmy2onHYKlABg" source="attributes">
-      <details xmi:id="_kMDG45TYEdmy2onHYKlABg" key="version" value="0"/>
-    </eAnnotations>
-    <importedPackage xmi:type="uml:Profile" href="pathmap://UML2_PROFILES/Basic.profile.uml2#_6mFRgK86Edih9-GG5afQ0g"/>
-    <importedProfile href="pathmap://UML2_PROFILES/Basic.profile.uml2#_6mFRgK86Edih9-GG5afQ0g"/>
-  </packageImport>
-  <packageImport xmi:type="uml:ProfileApplication" xmi:id="_kMDG5JTYEdmy2onHYKlABg">
-    <eAnnotations xmi:id="_kMDG5ZTYEdmy2onHYKlABg" source="attributes">
-      <details xmi:id="_kMDG5pTYEdmy2onHYKlABg" key="version" value="0"/>
-    </eAnnotations>
-    <importedPackage xmi:type="uml:Profile" href="pathmap://UML2_PROFILES/Intermediate.profile.uml2#_Cz7csK87Edih9-GG5afQ0g"/>
-    <importedProfile href="pathmap://UML2_PROFILES/Intermediate.profile.uml2#_Cz7csK87Edih9-GG5afQ0g"/>
-  </packageImport>
-  <packageImport xmi:type="uml:ProfileApplication" xmi:id="_kMDG55TYEdmy2onHYKlABg">
-    <eAnnotations xmi:id="_kMDG6JTYEdmy2onHYKlABg" source="attributes">
-      <details xmi:id="_kMDG6ZTYEdmy2onHYKlABg" key="version" value="0"/>
-    </eAnnotations>
-    <importedPackage xmi:type="uml:Profile" href="pathmap://UML2_PROFILES/Complete.profile.uml2#_M7pTkK87Edih9-GG5afQ0g"/>
-    <importedProfile href="pathmap://UML2_PROFILES/Complete.profile.uml2#_M7pTkK87Edih9-GG5afQ0g"/>
-  </packageImport>
-  <packageImport xmi:type="uml:ProfileApplication" xmi:id="_kMDG6pTYEdmy2onHYKlABg">
-    <eAnnotations xmi:id="_kMDG65TYEdmy2onHYKlABg" source="attributes">
-      <details xmi:id="_kMDG7JTYEdmy2onHYKlABg" key="version" value="0"/>
-    </eAnnotations>
-    <importedPackage xmi:type="uml:Profile" href="pathmap://UML2_MSL_PROFILES/Default.epx#_a_S3wNWLEdiy4IqP8whjFA?Default"/>
-    <importedProfile href="pathmap://UML2_MSL_PROFILES/Default.epx#_a_S3wNWLEdiy4IqP8whjFA?Default"/>
-  </packageImport>
-  <packageImport xmi:type="uml:ProfileApplication" xmi:id="_kMDG7ZTYEdmy2onHYKlABg">
-    <eAnnotations xmi:id="_kMDG7pTYEdmy2onHYKlABg" source="attributes">
-      <details xmi:id="_kMDG75TYEdmy2onHYKlABg" key="version" value="0"/>
-    </eAnnotations>
-    <importedPackage xmi:type="uml:Profile" href="pathmap://UML2_MSL_PROFILES/Deployment.epx#_vjbuwOvHEdiDX5bji0iVSA?Deployment"/>
-    <importedProfile href="pathmap://UML2_MSL_PROFILES/Deployment.epx#_vjbuwOvHEdiDX5bji0iVSA?Deployment"/>
-  </packageImport>
-  <packageImport xmi:id="_kMDG8JTYEdmy2onHYKlABg">
-    <importedPackage xmi:type="uml:Model" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_EfRZoK86EdieaYgxtVWN8Q"/>
-  </packageImport>
-  <packageImport xmi:type="uml:ProfileApplication" xmi:id="_kMJNg5TYEdmy2onHYKlABg">
-    <eAnnotations xmi:id="_kMJNhJTYEdmy2onHYKlABg" source="attributes">
-      <details xmi:id="_kMJNhZTYEdmy2onHYKlABg" key="version" value="0"/>
-    </eAnnotations>
-    <importedPackage xmi:type="uml:Profile" href="pathmap://ROSE_PROFILES/Rose.epx#_8yPmgEO4EdmZFZk7zjZ-eA?Rose"/>
-    <importedProfile href="pathmap://ROSE_PROFILES/Rose.epx#_8yPmgEO4EdmZFZk7zjZ-eA?Rose"/>
-  </packageImport>
-  <packageImport xmi:type="uml:ProfileApplication" xmi:id="_kNq3gZTYEdmy2onHYKlABg">
-    <eAnnotations xmi:id="_kNq3gpTYEdmy2onHYKlABg" source="attributes">
-      <details xmi:id="_kNq3g5TYEdmy2onHYKlABg" key="version" value="0"/>
-    </eAnnotations>
-    <importedPackage xmi:type="uml:Profile" href="pathmap://UML2_PROFILES/Ecore.profile.uml2#_siPt4K87Edi5QpYeY_yIpg"/>
-    <importedProfile href="pathmap://UML2_PROFILES/Ecore.profile.uml2#_siPt4K87Edi5QpYeY_yIpg"/>
-  </packageImport>
-  <packageImport xmi:type="uml:ProfileApplication" xmi:id="_H0ye8JTvEdmDNY6lnGAg5A">
-    <eAnnotations xmi:id="_H0ye8ZTvEdmDNY6lnGAg5A" source="attributes">
-      <details xmi:id="_H0ye8pTvEdmDNY6lnGAg5A" key="version" value="0"/>
-    </eAnnotations>
-    <importedPackage xmi:type="uml:Profile" href="Java.epx#_-ZoywJSkEdmjauSjG8qO2A?Java"/>
-    <importedProfile href="Java.epx#_-ZoywJSkEdmjauSjG8qO2A?Java"/>
-  </packageImport>
-  <ownedMember xmi:type="uml:Class" xmi:id="_3A0B2474025F41E3DF5801FA" name="WorkbenchComponent">
-    <ownedAttribute xmi:id="_3A0B2474025F4201471D0208" name="name">
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_3A0B2474025F41E3E14D031D" name="resources" type="_3A0B2474025F41E3DF670039" isUnique="false" association="_3A0B2474025F41E3E14B01E3" aggregation="composite">
-      <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_kOVl4ZTYEdmy2onHYKlABg" value="-1"/>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_kOVl4JTYEdmy2onHYKlABg"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_3A0B2474025F41EC1D990241" name="componentType" type="_3A0B2474025F41EC1D5103E2" isUnique="false" association="_3A0B2474025F41EC1D9802C2">
-      <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_kOVl6JTYEdmy2onHYKlABg" value="1"/>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_kOVl55TYEdmy2onHYKlABg" value="1"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_3A0B2474025F420146A6027F" name="referencedComponents" type="_3A0B2474025F41F6C24B023D" isUnique="false" association="_3A0B2474025F420146A502E2">
-      <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_kOVl8pTYEdmy2onHYKlABg" value="-1"/>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_kOVl8ZTYEdmy2onHYKlABg"/>
-    </ownedAttribute>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Class" xmi:id="_3A0B2474025F41E3DF670039" name="ComponentResource">
-    <ownedAttribute xmi:id="_3A0B2474025F41E3DF970128" name="sourcePath" type="_3A0B2474025F41EC26DA027A"/>
-    <ownedAttribute xmi:id="_3A0B2474025F41EEC640025B" name="runtimePath" type="_3A0B2474025F41EC26DA027A"/>
-    <ownedAttribute xmi:id="_3A0B2474025F41E3DF9E011E" name="exclusions">
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-      <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_kN3ExpTYEdmy2onHYKlABg" value="-1"/>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_kN3ExZTYEdmy2onHYKlABg"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_3A0B2474025F41E3E14D031F" name="component" type="_3A0B2474025F41E3DF5801FA" isUnique="false" association="_3A0B2474025F41E3E14B01E3">
-      <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_kOVl5JTYEdmy2onHYKlABg" value="1"/>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_kOVl45TYEdmy2onHYKlABg" value="1"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_jw5GQKV-EdmoYeO-WR9aDg" name="resourceType">
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-    </ownedAttribute>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Class" xmi:id="_3A0B2474025F41EC1D5103E2" name="ComponentType">
-    <ownedAttribute xmi:id="_3A0B2474025F41EC21340357" name="componentTypeId">
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_UDkgEJTbEdmy2onHYKlABg" name="version">
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_B3wacZTcEdmy2onHYKlABg" name="properties" type="_5BCRYJTbEdmy2onHYKlABg" association="_B3wacJTcEdmy2onHYKlABg" aggregation="shared">
-      <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_B3wadJTcEdmy2onHYKlABg" value="-1"/>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_B3wac5TcEdmy2onHYKlABg"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_bNDOwZTcEdmy2onHYKlABg" name="metadataResources" visibility="private" type="_3A0B2474025F41EC26DA027A" association="_bNDOwJTcEdmy2onHYKlABg" aggregation="shared">
-      <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_bNDOxJTcEdmy2onHYKlABg" value="-1"/>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_bNDOw5TcEdmy2onHYKlABg"/>
-    </ownedAttribute>
-  </ownedMember>
-  <ownedMember xmi:type="uml:PrimitiveType" xmi:id="_3A0B2474025F41EC26DA027A" name="IPath">
-    <eAnnotations xmi:id="_kN9LZpTYEdmy2onHYKlABg" source="appliedStereotypes">
-      <contents xmi:type="Ecore_0:Ecore__EDataType" xmi:id="_kN9LZ5TYEdmy2onHYKlABg" instanceClassName="org.eclipse.core.runtime.IPath"/>
-    </eAnnotations>
-    <eAnnotations xmi:id="_kN9LaJTYEdmy2onHYKlABg" source="keywords">
-      <details xmi:id="_kN9LaZTYEdmy2onHYKlABg" key="datatype"/>
-    </eAnnotations>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Class" xmi:id="_3A0B2474025F41F566DB0251" name="ProjectComponents">
-    <ownedAttribute xmi:id="_3A0B2474025F41F567FD023A" name="projectName">
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_3A0B2474025F41F567210111" name="components" type="_3A0B2474025F41E3DF5801FA" isUnique="false" association="_3A0B2474025F41F5672000E8" aggregation="composite">
-      <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_kOVl7ZTYEdmy2onHYKlABg" value="-1"/>
-      <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_kOVl7JTYEdmy2onHYKlABg"/>
-    </ownedAttribute>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Class" xmi:id="_3A0B2474025F41F6C24B023D" name="ReferencedComponent">
-    <ownedAttribute xmi:id="_3A0B2474025F420145F001C9" name="handle" type="_IQQjMKS3EdmtQ4Tckv5S2Q"/>
-    <ownedAttribute xmi:id="_3A0B2474025F420145FA0015" name="runtimePath" type="_3A0B2474025F41EC26DA027A"/>
-    <ownedAttribute xmi:id="_3A0B2474025F42039243016E" name="dependencyType" type="_3A0B2474025F420394F50185"/>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Enumeration" xmi:id="_3A0B2474025F420394F50185" name="DependencyType">
-    <ownedComment xmi:id="_kN9LcZTYEdmy2onHYKlABg" body="uses=0&#xA;consumes=1&#xA;" annotatedElement="_3A0B2474025F420394F50185">
-      <eAnnotations xmi:id="_kOJYoJTYEdmy2onHYKlABg" source="appliedStereotypes">
-        <contents xmi:type="Default_0:Default__Documentation" xmi:id="_kOJYoZTYEdmy2onHYKlABg"/>
-      </eAnnotations>
-    </ownedComment>
-    <ownedLiteral xmi:id="_3A0B2474025F42039938018D" name="uses"/>
-    <ownedLiteral xmi:id="_3A0B2474025F42039A6E0139" name="consumes"/>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Association" xmi:id="_3A0B2474025F41E3E14B01E3" memberEnd="_3A0B2474025F41E3E14D031D _3A0B2474025F41E3E14D031F"/>
-  <ownedMember xmi:type="uml:Association" xmi:id="_3A0B2474025F41EC1D9802C2" memberEnd="_3A0B2474025F41EC1D990241 _3A0B2474025F41EC1D990243">
-    <ownedEnd xmi:id="_3A0B2474025F41EC1D990243" name="_workbenchModule" type="_3A0B2474025F41E3DF5801FA" isUnique="false" association="_3A0B2474025F41EC1D9802C2"/>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Association" xmi:id="_3A0B2474025F41F5672000E8" memberEnd="_3A0B2474025F41F567210111 _3A0B2474025F41F567210113">
-    <ownedEnd xmi:id="_3A0B2474025F41F567210113" name="_projectModules" type="_3A0B2474025F41F566DB0251" isUnique="false" association="_3A0B2474025F41F5672000E8"/>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Association" xmi:id="_3A0B2474025F420146A502E2" memberEnd="_3A0B2474025F420146A6027F _3A0B2474025F420146A60281">
-    <ownedEnd xmi:id="_3A0B2474025F420146A60281" name="_workbenchModule" type="_3A0B2474025F41E3DF5801FA" isUnique="false" association="_3A0B2474025F420146A502E2"/>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Class" xmi:id="_5BCRYJTbEdmy2onHYKlABg" name="Property">
-    <ownedAttribute xmi:id="_7Xo8YJTbEdmy2onHYKlABg" name="name">
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_8eOJ8JTbEdmy2onHYKlABg" name="value">
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-    </ownedAttribute>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Association" xmi:id="_B3wacJTcEdmy2onHYKlABg" memberEnd="_B3wacZTcEdmy2onHYKlABg _B3wacpTcEdmy2onHYKlABg">
-    <ownedEnd xmi:id="_B3wacpTcEdmy2onHYKlABg" visibility="private" type="_3A0B2474025F41EC1D5103E2" association="_B3wacJTcEdmy2onHYKlABg"/>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Association" xmi:id="_bNDOwJTcEdmy2onHYKlABg" memberEnd="_bNDOwZTcEdmy2onHYKlABg _bNDOwpTcEdmy2onHYKlABg">
-    <ownedEnd xmi:id="_bNDOwpTcEdmy2onHYKlABg" visibility="private" type="_3A0B2474025F41EC1D5103E2" association="_bNDOwJTcEdmy2onHYKlABg"/>
-  </ownedMember>
-  <ownedMember xmi:type="uml:PrimitiveType" xmi:id="_IQQjMKS3EdmtQ4Tckv5S2Q" name="URI">
-    <eAnnotations xmi:id="_kN9LZpTYEdmy2onHYKlABg" source="appliedStereotypes">
-      <contents xmi:type="Ecore_0:Ecore__EDataType" xmi:id="_kN9LZ5TYEdmy2onHYKlABg" instanceClassName="org.eclipse.emf.common.util.URI"/>
-    </eAnnotations>
-    <eAnnotations xmi:id="_kN9LaJTYEdmy2onHYKlABg" source="keywords">
-      <details xmi:id="_kN9LaZTYEdmy2onHYKlABg" key="datatype"/>
-    </eAnnotations>
-  </ownedMember>
-</uml:Model>
diff --git a/plugins/org.eclipse.wst.common.modulecore/model/componentCore.genmodel b/plugins/org.eclipse.wst.common.modulecore/model/componentCore.genmodel
deleted file mode 100644
index 2e55524..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/model/componentCore.genmodel
+++ /dev/null
@@ -1,52 +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.wst.common.modulecore/modulecore-src"
-    editDirectory="/org.eclipse.wst.common.modulecore.edit/src" editorDirectory="/org.eclipse.wst.common.modulecore.editor/src"
-    modelPluginID="org.eclipse.wst.common.modulecore" runtimeJar="true" modelName="ComponentCore"
-    editPluginClass="componentcore.provider.ComponentCoreEditPlugin" editorPluginClass="componentcore.presentation.ComponentCoreEditorPlugin">
-  <foreignModel>componentCore.ecore</foreignModel>
-  <genPackages prefix="Componentcore" basePackage="org.eclipse.wst.common" disposableProviderFactory="true"
-      interfacePackageSuffix="internal" classPackageSuffix="internal.impl" utilityPackageSuffix="internal.util"
-      ecorePackage="componentCore.ecore#/">
-    <genEnums ecoreEnum="componentCore.ecore#//DependencyType">
-      <genEnumLiterals ecoreEnumLiteral="componentCore.ecore#//DependencyType/uses"/>
-      <genEnumLiterals ecoreEnumLiteral="componentCore.ecore#//DependencyType/consumes"/>
-    </genEnums>
-    <genDataTypes ecoreDataType="componentCore.ecore#//IPath"/>
-    <genDataTypes ecoreDataType="componentCore.ecore#//URI"/>
-    <genClasses ecoreClass="componentCore.ecore#//WorkbenchComponent">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute componentCore.ecore#//WorkbenchComponent/name"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference componentCore.ecore#//WorkbenchComponent/resources"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference componentCore.ecore#//WorkbenchComponent/componentType"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference componentCore.ecore#//WorkbenchComponent/referencedComponents"/>
-    </genClasses>
-    <genClasses ecoreClass="componentCore.ecore#//ComponentResource">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute componentCore.ecore#//ComponentResource/sourcePath"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute componentCore.ecore#//ComponentResource/runtimePath"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute componentCore.ecore#//ComponentResource/exclusions"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference componentCore.ecore#//ComponentResource/component"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute componentCore.ecore#//ComponentResource/resourceType"/>
-    </genClasses>
-    <genClasses ecoreClass="componentCore.ecore#//ComponentType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute componentCore.ecore#//ComponentType/componentTypeId"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute componentCore.ecore#//ComponentType/version"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference componentCore.ecore#//ComponentType/properties"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute componentCore.ecore#//ComponentType/metadataResources"/>
-    </genClasses>
-    <genClasses ecoreClass="componentCore.ecore#//Property">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute componentCore.ecore#//Property/name"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute componentCore.ecore#//Property/value"/>
-    </genClasses>
-    <genClasses ecoreClass="componentCore.ecore#//ReferencedComponent">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute componentCore.ecore#//ReferencedComponent/handle"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute componentCore.ecore#//ReferencedComponent/runtimePath"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute componentCore.ecore#//ReferencedComponent/dependencyType"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference componentCore.ecore#//ReferencedComponent/dependentObject"/>
-    </genClasses>
-    <genClasses ecoreClass="componentCore.ecore#//ProjectComponents">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute componentCore.ecore#//ProjectComponents/projectName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference componentCore.ecore#//ProjectComponents/components"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/plugins/org.eclipse.wst.common.modulecore/model/componentCorePackage.emx b/plugins/org.eclipse.wst.common.modulecore/model/componentCorePackage.emx
deleted file mode 100644
index a903de7..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/model/componentCorePackage.emx
+++ /dev/null
@@ -1,310 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--xtools2_universal_type_manager-->
-<uml:Model xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:notation="http://www.ibm.com/xtools/1.5.0/Notation" xmlns:uml="http://www.eclipse.org/uml2/1.0.0/UML" xmlns:umlnotation="http://www.ibm.com/xtools/1.5.0/Umlnotation" xmi:id="_wUCHwMO8EdmmEbKEBnW0AQ" name="componentCorePackage" appliedProfile="_wUCHxMO8EdmmEbKEBnW0AQ _wUCHx8O8EdmmEbKEBnW0AQ _wUCHysO8EdmmEbKEBnW0AQ _wUIOYsO8EdmmEbKEBnW0AQ _wUIOZcO8EdmmEbKEBnW0AQ">
-  <eAnnotations xmi:id="_wUCHwcO8EdmmEbKEBnW0AQ" source="uml2.diagrams" references="_wUCHwsO8EdmmEbKEBnW0AQ">
-    <contents xmi:type="notation:Diagram" xmi:id="_wUCHwsO8EdmmEbKEBnW0AQ" type="Class" name="Main">
-      <children xmi:id="_2r1XUMO8EdmmEbKEBnW0AQ" sourceEdges="_3IZXgMO8EdmmEbKEBnW0AQ _3IfeIMO8EdmmEbKEBnW0AQ _3IfeJ8O8EdmmEbKEBnW0AQ" targetEdges="_3IZXgMO8EdmmEbKEBnW0AQ">
-        <children xmi:id="_2vFfoMO8EdmmEbKEBnW0AQ" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ArtifactEdit[jcu^name=ArtifactEdit.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_2vFfocO8EdmmEbKEBnW0AQ" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_2vFfosO8EdmmEbKEBnW0AQ" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ArtifactEdit[jcu^name=ArtifactEdit.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_2vFfo8O8EdmmEbKEBnW0AQ" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ArtifactEdit[jcu^name=ArtifactEdit.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_2vFfpMO8EdmmEbKEBnW0AQ" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_2vFfpcO8EdmmEbKEBnW0AQ" filtering="Manual">
-            <filteredObjects xmi:type="uml:Property" href="vizref:///#jfield^vcore.target=uml2.Property^name=artifactEditModel[jsrctype^name=ArtifactEdit[jcu^name=ArtifactEdit.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-            <filteredObjects xmi:type="uml:Property" href="vizref:///#jfield^vcore.target=uml2.Property^name=isReadOnly[jsrctype^name=ArtifactEdit[jcu^name=ArtifactEdit.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-            <filteredObjects xmi:type="uml:Property" href="vizref:///#jfield^vcore.target=uml2.Property^name=isArtifactEditModelSelfManaged[jsrctype^name=ArtifactEdit[jcu^name=ArtifactEdit.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </styles>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ArtifactEdit[jcu^name=ArtifactEdit.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_2vFfpsO8EdmmEbKEBnW0AQ" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_2vFfp8O8EdmmEbKEBnW0AQ" filtering="Automatic" filteringKeys="private,package,protected"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ArtifactEdit[jcu^name=ArtifactEdit.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_2vFfqMO8EdmmEbKEBnW0AQ" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_2vFfqcO8EdmmEbKEBnW0AQ"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ArtifactEdit[jcu^name=ArtifactEdit.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_2vFfqsO8EdmmEbKEBnW0AQ" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_2vFfq8O8EdmmEbKEBnW0AQ"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ArtifactEdit[jcu^name=ArtifactEdit.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_2r1XUcO8EdmmEbKEBnW0AQ" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ArtifactEdit[jcu^name=ArtifactEdit.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2r1XUsO8EdmmEbKEBnW0AQ" x="15582" y="21942"/>
-      </children>
-      <children xmi:id="_25TLkMO8EdmmEbKEBnW0AQ" sourceEdges="_3IlkwMO8EdmmEbKEBnW0AQ _3IlkyMO8EdmmEbKEBnW0AQ" targetEdges="_3IfeJ8O8EdmmEbKEBnW0AQ _3IlkwMO8EdmmEbKEBnW0AQ">
-        <children xmi:id="_25TLk8O8EdmmEbKEBnW0AQ" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ModuleCoreNature[jcu^name=ModuleCoreNature.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_25TLlMO8EdmmEbKEBnW0AQ" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_25TLlcO8EdmmEbKEBnW0AQ" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ModuleCoreNature[jcu^name=ModuleCoreNature.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_25TLlsO8EdmmEbKEBnW0AQ" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ModuleCoreNature[jcu^name=ModuleCoreNature.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_25TLl8O8EdmmEbKEBnW0AQ" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_25TLmMO8EdmmEbKEBnW0AQ"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ModuleCoreNature[jcu^name=ModuleCoreNature.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_25TLmcO8EdmmEbKEBnW0AQ" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_25TLmsO8EdmmEbKEBnW0AQ" filtering="Automatic" filteringKeys="private,package,protected"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ModuleCoreNature[jcu^name=ModuleCoreNature.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_25TLm8O8EdmmEbKEBnW0AQ" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_25TLnMO8EdmmEbKEBnW0AQ"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ModuleCoreNature[jcu^name=ModuleCoreNature.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_25TLncO8EdmmEbKEBnW0AQ" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_25TLnsO8EdmmEbKEBnW0AQ"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ModuleCoreNature[jcu^name=ModuleCoreNature.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_25TLkcO8EdmmEbKEBnW0AQ" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ModuleCoreNature[jcu^name=ModuleCoreNature.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_25TLksO8EdmmEbKEBnW0AQ" x="7009" y="17487"/>
-      </children>
-      <children xmi:id="_29B1AMO8EdmmEbKEBnW0AQ" targetEdges="_3IfeIMO8EdmmEbKEBnW0AQ">
-        <children xmi:id="_29B1A8O8EdmmEbKEBnW0AQ" type="ImageCompartment">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IEditModelHandler[jcu^name=IEditModelHandler.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_29B1BMO8EdmmEbKEBnW0AQ" width="530" height="530"/>
-        </children>
-        <children xmi:id="_29B1BcO8EdmmEbKEBnW0AQ" type="Stereotype">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IEditModelHandler[jcu^name=IEditModelHandler.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_29B1BsO8EdmmEbKEBnW0AQ" type="Kind">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IEditModelHandler[jcu^name=IEditModelHandler.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_29B1B8O8EdmmEbKEBnW0AQ" type="Name">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IEditModelHandler[jcu^name=IEditModelHandler.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_29B1CMO8EdmmEbKEBnW0AQ" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_29B1CcO8EdmmEbKEBnW0AQ"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IEditModelHandler[jcu^name=IEditModelHandler.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_29H7oMO8EdmmEbKEBnW0AQ" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_29H7ocO8EdmmEbKEBnW0AQ"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IEditModelHandler[jcu^name=IEditModelHandler.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_29H7osO8EdmmEbKEBnW0AQ" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_29H7o8O8EdmmEbKEBnW0AQ"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IEditModelHandler[jcu^name=IEditModelHandler.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLClassifierStyle" xmi:id="_29B1AcO8EdmmEbKEBnW0AQ" showStereotype="Label" useClassifierShape="true"/>
-        <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IEditModelHandler[jcu^name=IEditModelHandler.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_29B1AsO8EdmmEbKEBnW0AQ" x="16218" y="17490"/>
-      </children>
-      <children xmi:id="_294woMO8EdmmEbKEBnW0AQ" targetEdges="_3IlkyMO8EdmmEbKEBnW0AQ _3IrrY8O8EdmmEbKEBnW0AQ">
-        <children xmi:id="_294wo8O8EdmmEbKEBnW0AQ" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=UnresolveableURIException[jcu^name=UnresolveableURIException.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_294wpMO8EdmmEbKEBnW0AQ" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_294wpcO8EdmmEbKEBnW0AQ" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=UnresolveableURIException[jcu^name=UnresolveableURIException.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_294wpsO8EdmmEbKEBnW0AQ" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=UnresolveableURIException[jcu^name=UnresolveableURIException.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_294wp8O8EdmmEbKEBnW0AQ" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_294wqMO8EdmmEbKEBnW0AQ"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=UnresolveableURIException[jcu^name=UnresolveableURIException.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_294wqcO8EdmmEbKEBnW0AQ" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_294wqsO8EdmmEbKEBnW0AQ"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=UnresolveableURIException[jcu^name=UnresolveableURIException.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_294wq8O8EdmmEbKEBnW0AQ" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_294wrMO8EdmmEbKEBnW0AQ"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=UnresolveableURIException[jcu^name=UnresolveableURIException.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_294wrcO8EdmmEbKEBnW0AQ" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_294wrsO8EdmmEbKEBnW0AQ"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=UnresolveableURIException[jcu^name=UnresolveableURIException.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_294wocO8EdmmEbKEBnW0AQ" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=UnresolveableURIException[jcu^name=UnresolveableURIException.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_294wosO8EdmmEbKEBnW0AQ" x="3894" y="25611"/>
-      </children>
-      <children xmi:id="_2-RLIMO8EdmmEbKEBnW0AQ" sourceEdges="_3IrrY8O8EdmmEbKEBnW0AQ">
-        <children xmi:id="_2-RLI8O8EdmmEbKEBnW0AQ" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ComponentCore[jcu^name=ComponentCore.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_2-RLJMO8EdmmEbKEBnW0AQ" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_2-RLJcO8EdmmEbKEBnW0AQ" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ComponentCore[jcu^name=ComponentCore.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_2-RLJsO8EdmmEbKEBnW0AQ" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ComponentCore[jcu^name=ComponentCore.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_2-RLJ8O8EdmmEbKEBnW0AQ" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_2-RLKMO8EdmmEbKEBnW0AQ" filtering="Automatic" filteringKeys="protected,private,package"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ComponentCore[jcu^name=ComponentCore.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_2-XRwMO8EdmmEbKEBnW0AQ" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_2-XRwcO8EdmmEbKEBnW0AQ" filtering="Automatic" filteringKeys="protected,private,package"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ComponentCore[jcu^name=ComponentCore.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_2-XRwsO8EdmmEbKEBnW0AQ" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_2-XRw8O8EdmmEbKEBnW0AQ"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ComponentCore[jcu^name=ComponentCore.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <children xmi:id="_2-XRxMO8EdmmEbKEBnW0AQ" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_2-XRxcO8EdmmEbKEBnW0AQ"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ComponentCore[jcu^name=ComponentCore.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_2-RLIcO8EdmmEbKEBnW0AQ" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ComponentCore[jcu^name=ComponentCore.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2-RLIsO8EdmmEbKEBnW0AQ" x="1908" y="17490"/>
-      </children>
-      <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_wUCHw8O8EdmmEbKEBnW0AQ"/>
-      <edges xmi:id="_3IZXgMO8EdmmEbKEBnW0AQ" source="_2r1XUMO8EdmmEbKEBnW0AQ" target="_2r1XUMO8EdmmEbKEBnW0AQ">
-        <children xmi:id="_3IZXg8O8EdmmEbKEBnW0AQ" type="KindLabel">
-          <children xmi:id="_3IZXhcO8EdmmEbKEBnW0AQ" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ArtifactEdit[jcu^name=ArtifactEdit.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=ArtifactEdit[jcu^name=ArtifactEdit.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_3IZXh8O8EdmmEbKEBnW0AQ" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ArtifactEdit[jcu^name=ArtifactEdit.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=ArtifactEdit[jcu^name=ArtifactEdit.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_3IZXhsO8EdmmEbKEBnW0AQ" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ArtifactEdit[jcu^name=ArtifactEdit.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=ArtifactEdit[jcu^name=ArtifactEdit.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ArtifactEdit[jcu^name=ArtifactEdit.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=ArtifactEdit[jcu^name=ArtifactEdit.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_3IZXhMO8EdmmEbKEBnW0AQ" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_3IZXgcO8EdmmEbKEBnW0AQ" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ArtifactEdit[jcu^name=ArtifactEdit.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=ArtifactEdit[jcu^name=ArtifactEdit.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_3IZXgsO8EdmmEbKEBnW0AQ" points="[2673, 4312, 2673, 4312]$[3228, 4312, 3228, 4312]$[3228, 5556, 3228, 5556]$[1932, 5556, 1932, 5556]$[1932, 4947, 1932, 4947]"/>
-      </edges>
-      <edges xmi:id="_3IfeIMO8EdmmEbKEBnW0AQ" source="_2r1XUMO8EdmmEbKEBnW0AQ" target="_29B1AMO8EdmmEbKEBnW0AQ">
-        <children xmi:id="_3IfeI8O8EdmmEbKEBnW0AQ" type="NameLabel">
-          <children xmi:id="_3IfeJcO8EdmmEbKEBnW0AQ" type="Stereotype">
-            <element xmi:type="uml:Implementation" href="vizref:///#jimpl^vcore.target=uml2.Implementation[jsrctype^name=ArtifactEdit[jcu^name=ArtifactEdit.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IEditModelHandler[jcu^name=IEditModelHandler.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_3IfeJsO8EdmmEbKEBnW0AQ" type="Name">
-            <element xmi:type="uml:Implementation" href="vizref:///#jimpl^vcore.target=uml2.Implementation[jsrctype^name=ArtifactEdit[jcu^name=ArtifactEdit.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IEditModelHandler[jcu^name=IEditModelHandler.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <element xmi:type="uml:Implementation" href="vizref:///#jimpl^vcore.target=uml2.Implementation[jsrctype^name=ArtifactEdit[jcu^name=ArtifactEdit.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IEditModelHandler[jcu^name=IEditModelHandler.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_3IfeJMO8EdmmEbKEBnW0AQ" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_3IfeIcO8EdmmEbKEBnW0AQ" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Implementation" href="vizref:///#jimpl^vcore.target=uml2.Implementation[jsrctype^name=ArtifactEdit[jcu^name=ArtifactEdit.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=IEditModelHandler[jcu^name=IEditModelHandler.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_3IfeIsO8EdmmEbKEBnW0AQ" points="[27, -4948, 53, 3175]$[27, -6827, 53, 1296]"/>
-      </edges>
-      <edges xmi:id="_3IfeJ8O8EdmmEbKEBnW0AQ" source="_2r1XUMO8EdmmEbKEBnW0AQ" target="_25TLkMO8EdmmEbKEBnW0AQ">
-        <children xmi:id="_3IfeKsO8EdmmEbKEBnW0AQ" type="KindLabel">
-          <children xmi:id="_3IfeLMO8EdmmEbKEBnW0AQ" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ArtifactEdit[jcu^name=ArtifactEdit.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=ModuleCoreNature[jcu^name=ModuleCoreNature.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_3IfeLsO8EdmmEbKEBnW0AQ" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ArtifactEdit[jcu^name=ArtifactEdit.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=ModuleCoreNature[jcu^name=ModuleCoreNature.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_3IfeLcO8EdmmEbKEBnW0AQ" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ArtifactEdit[jcu^name=ArtifactEdit.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=ModuleCoreNature[jcu^name=ModuleCoreNature.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ArtifactEdit[jcu^name=ArtifactEdit.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=ModuleCoreNature[jcu^name=ModuleCoreNature.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_3IfeK8O8EdmmEbKEBnW0AQ" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_3IfeKMO8EdmmEbKEBnW0AQ" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ArtifactEdit[jcu^name=ArtifactEdit.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=ModuleCoreNature[jcu^name=ModuleCoreNature.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_3IfeKcO8EdmmEbKEBnW0AQ" points="[-13, 7077, 2831, -5636]$[-2844, 8664, 0, -4049]"/>
-      </edges>
-      <edges xmi:id="_3IlkwMO8EdmmEbKEBnW0AQ" source="_25TLkMO8EdmmEbKEBnW0AQ" target="_25TLkMO8EdmmEbKEBnW0AQ">
-        <children xmi:id="_3Ilkw8O8EdmmEbKEBnW0AQ" type="KindLabel">
-          <children xmi:id="_3IlkxcO8EdmmEbKEBnW0AQ" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ModuleCoreNature[jcu^name=ModuleCoreNature.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=ModuleCoreNature[jcu^name=ModuleCoreNature.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_3Ilkx8O8EdmmEbKEBnW0AQ" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ModuleCoreNature[jcu^name=ModuleCoreNature.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=ModuleCoreNature[jcu^name=ModuleCoreNature.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_3IlkxsO8EdmmEbKEBnW0AQ" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ModuleCoreNature[jcu^name=ModuleCoreNature.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=ModuleCoreNature[jcu^name=ModuleCoreNature.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ModuleCoreNature[jcu^name=ModuleCoreNature.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=ModuleCoreNature[jcu^name=ModuleCoreNature.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_3IlkxMO8EdmmEbKEBnW0AQ" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_3IlkwcO8EdmmEbKEBnW0AQ" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ModuleCoreNature[jcu^name=ModuleCoreNature.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=ModuleCoreNature[jcu^name=ModuleCoreNature.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_3IlkwsO8EdmmEbKEBnW0AQ" points="[2831, 2964, 2831, 2964]$[2831, 3837, 2831, 3837]$[1322, 3837, 1322, 3837]$[1322, 2964, 1322, 2964]"/>
-      </edges>
-      <edges xmi:id="_3IlkyMO8EdmmEbKEBnW0AQ" source="_25TLkMO8EdmmEbKEBnW0AQ" target="_294woMO8EdmmEbKEBnW0AQ">
-        <children xmi:id="_3Ilky8O8EdmmEbKEBnW0AQ" type="KindLabel">
-          <children xmi:id="_3IrrYMO8EdmmEbKEBnW0AQ" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ModuleCoreNature[jcu^name=ModuleCoreNature.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=UnresolveableURIException[jcu^name=UnresolveableURIException.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_3IrrYsO8EdmmEbKEBnW0AQ" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ModuleCoreNature[jcu^name=ModuleCoreNature.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=UnresolveableURIException[jcu^name=UnresolveableURIException.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_3IrrYcO8EdmmEbKEBnW0AQ" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ModuleCoreNature[jcu^name=ModuleCoreNature.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=UnresolveableURIException[jcu^name=UnresolveableURIException.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ModuleCoreNature[jcu^name=ModuleCoreNature.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=UnresolveableURIException[jcu^name=UnresolveableURIException.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_3IlkzMO8EdmmEbKEBnW0AQ" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_3IlkycO8EdmmEbKEBnW0AQ" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ModuleCoreNature[jcu^name=ModuleCoreNature.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=UnresolveableURIException[jcu^name=UnresolveableURIException.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_3IlkysO8EdmmEbKEBnW0AQ" points="[0, 4048, 3307, -2460]$[-3307, 5635, 0, -873]"/>
-      </edges>
-      <edges xmi:id="_3IrrY8O8EdmmEbKEBnW0AQ" source="_2-RLIMO8EdmmEbKEBnW0AQ" target="_294woMO8EdmmEbKEBnW0AQ">
-        <children xmi:id="_3IrrZsO8EdmmEbKEBnW0AQ" type="KindLabel">
-          <children xmi:id="_3IrraMO8EdmmEbKEBnW0AQ" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ComponentCore[jcu^name=ComponentCore.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=UnresolveableURIException[jcu^name=UnresolveableURIException.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_3IrrasO8EdmmEbKEBnW0AQ" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ComponentCore[jcu^name=ComponentCore.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=UnresolveableURIException[jcu^name=UnresolveableURIException.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <children xmi:id="_3IrracO8EdmmEbKEBnW0AQ" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ComponentCore[jcu^name=ComponentCore.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=UnresolveableURIException[jcu^name=UnresolveableURIException.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ComponentCore[jcu^name=ComponentCore.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=UnresolveableURIException[jcu^name=UnresolveableURIException.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_3IrrZ8O8EdmmEbKEBnW0AQ" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_3IrrZMO8EdmmEbKEBnW0AQ" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ComponentCore[jcu^name=ComponentCore.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]][jsrctype^name=UnresolveableURIException[jcu^name=UnresolveableURIException.java[jpack^name=org.eclipse.wst.common.componentcore[jsrcroot^srcfolder=modulecore-src[project^vcore.target=uml2.Model^id=org.eclipse.wst.common.modulecore]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_3IrrZcO8EdmmEbKEBnW0AQ" points="[-1, 4048, -3308, -2460]$[3307, 5635, 0, -873]"/>
-      </edges>
-    </contents>
-  </eAnnotations>
-  <packageImport xmi:type="uml:ProfileApplication" xmi:id="_wUCHxMO8EdmmEbKEBnW0AQ">
-    <eAnnotations xmi:id="_wUCHxcO8EdmmEbKEBnW0AQ" source="attributes">
-      <details xmi:id="_wUCHxsO8EdmmEbKEBnW0AQ" key="version" value="0"/>
-    </eAnnotations>
-    <importedPackage xmi:type="uml:Profile" href="pathmap://UML2_PROFILES/Basic.profile.uml2#_6mFRgK86Edih9-GG5afQ0g"/>
-    <importedProfile href="pathmap://UML2_PROFILES/Basic.profile.uml2#_6mFRgK86Edih9-GG5afQ0g"/>
-  </packageImport>
-  <packageImport xmi:type="uml:ProfileApplication" xmi:id="_wUCHx8O8EdmmEbKEBnW0AQ">
-    <eAnnotations xmi:id="_wUCHyMO8EdmmEbKEBnW0AQ" source="attributes">
-      <details xmi:id="_wUCHycO8EdmmEbKEBnW0AQ" key="version" value="0"/>
-    </eAnnotations>
-    <importedPackage xmi:type="uml:Profile" href="pathmap://UML2_PROFILES/Intermediate.profile.uml2#_Cz7csK87Edih9-GG5afQ0g"/>
-    <importedProfile href="pathmap://UML2_PROFILES/Intermediate.profile.uml2#_Cz7csK87Edih9-GG5afQ0g"/>
-  </packageImport>
-  <packageImport xmi:type="uml:ProfileApplication" xmi:id="_wUCHysO8EdmmEbKEBnW0AQ">
-    <eAnnotations xmi:id="_wUIOYMO8EdmmEbKEBnW0AQ" source="attributes">
-      <details xmi:id="_wUIOYcO8EdmmEbKEBnW0AQ" key="version" value="0"/>
-    </eAnnotations>
-    <importedPackage xmi:type="uml:Profile" href="pathmap://UML2_PROFILES/Complete.profile.uml2#_M7pTkK87Edih9-GG5afQ0g"/>
-    <importedProfile href="pathmap://UML2_PROFILES/Complete.profile.uml2#_M7pTkK87Edih9-GG5afQ0g"/>
-  </packageImport>
-  <packageImport xmi:type="uml:ProfileApplication" xmi:id="_wUIOYsO8EdmmEbKEBnW0AQ">
-    <eAnnotations xmi:id="_wUIOY8O8EdmmEbKEBnW0AQ" source="attributes">
-      <details xmi:id="_wUIOZMO8EdmmEbKEBnW0AQ" key="version" value="0"/>
-    </eAnnotations>
-    <importedPackage xmi:type="uml:Profile" href="pathmap://UML2_MSL_PROFILES/Default.epx#_a_S3wNWLEdiy4IqP8whjFA?Default"/>
-    <importedProfile href="pathmap://UML2_MSL_PROFILES/Default.epx#_a_S3wNWLEdiy4IqP8whjFA?Default"/>
-  </packageImport>
-  <packageImport xmi:type="uml:ProfileApplication" xmi:id="_wUIOZcO8EdmmEbKEBnW0AQ">
-    <eAnnotations xmi:id="_wUIOZsO8EdmmEbKEBnW0AQ" source="attributes">
-      <details xmi:id="_wUIOZ8O8EdmmEbKEBnW0AQ" key="version" value="0"/>
-    </eAnnotations>
-    <importedPackage xmi:type="uml:Profile" href="pathmap://UML2_MSL_PROFILES/Deployment.epx#_vjbuwOvHEdiDX5bji0iVSA?Deployment"/>
-    <importedProfile href="pathmap://UML2_MSL_PROFILES/Deployment.epx#_vjbuwOvHEdiDX5bji0iVSA?Deployment"/>
-  </packageImport>
-  <packageImport xmi:id="_wUIOaMO8EdmmEbKEBnW0AQ">
-    <importedPackage xmi:type="uml:Model" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_EfRZoK86EdieaYgxtVWN8Q"/>
-  </packageImport>
-</uml:Model>
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ArtifactEdit.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ArtifactEdit.java
deleted file mode 100644
index 33d6efd..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ArtifactEdit.java
+++ /dev/null
@@ -1,535 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.emf.common.command.CommandStack;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.jem.internal.util.emf.workbench.nls.EMFWorkbenchResourceHandler;
-import org.eclipse.wst.common.componentcore.internal.ArtifactEditModel;
-import org.eclipse.wst.common.componentcore.internal.impl.ModuleURIUtil;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.frameworks.internal.operations.IOperationHandler;
-import org.eclipse.wst.common.internal.emfworkbench.edit.EditModelRegistry;
-import org.eclipse.wst.common.internal.emfworkbench.integration.EditModel;
-import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelListener;
-import org.eclipse.wst.common.internal.emfworkbench.integration.IEditModelFactory;
-
-/**
- * Provides a Facade pattern for accessing Module Content Metamodels for Web Tools Platform flexible
- * modules.
- * <p>
- * ArtifactEdit hides the management of accessing edit models ({@see ArtifactEditModel})
- * correctly. Each project may have multiple ({@see ArtifactEditModel})s depending on the number
- * of modules contained by the project. Clients should use ArtifactEdit or an appropriate subclass
- * when working with the content models of WTP modules.
- * </p>
- * 
- * <p>
- * Each ArtifactEdit facade is designed to manage the EditModel lifecycle for clients. However,
- * while each ArtifactEdit is designed to be passed around as needed, clients must enforce the
- * ArtifactEdit lifecycle. The most common method of acquiring a ArtifactEdit instance facade is to
- * use {@see #getArtifactEditForRead(WorkbenchComponent)}&nbsp;or
- * {@see #getArtifactEditForWrite(WorkbenchComponent)}.
- * </p>
- * <p>
- * When clients have concluded their use of the instance, <b>clients must call {@see #dispose()}
- * </b>.
- * </p>
- * <p>
- * This class is experimental until fully documented.
- * </p>
- * 
- * @see ModuleCoreNature
- * @see ArtifactEditModel
- * @plannedfor 1.0
- */
-public class ArtifactEdit implements IEditModelHandler, IAdaptable{
-
-	public static final Class ADAPTER_TYPE = ArtifactEdit.class;
-	private final ArtifactEditModel artifactEditModel;
-	private boolean isReadOnly;
-	private boolean isArtifactEditModelSelfManaged;
-
-
-	/**
-	 * 
-	 */
-	protected ArtifactEdit() {
-		super();
-		artifactEditModel = null;
-		// TODO Auto-generated constructor stub
-	}
-
-	/**
-	 * <p>
-	 * Returns an instance facade to manage the underlying edit model for the given
-	 * {@see WorkbenchComponent}. Instances of ArtifactEdit that are returned through this method
-	 * must be {@see #dispose()}ed of when no longer in use.
-	 * </p>
-	 * <p>
-	 * Use to acquire an ArtifactEdit facade for a specific {@see WorkbenchComponent}&nbsp;that
-	 * will not be used for editing. Invocations of any save*() API on an instance returned from
-	 * this method will throw exceptions.
-	 * </p>
-	 * <p>
-	 * <b>The following method may return null. </b>
-	 * </p>
-	 * <p>Note: This method is for internal use only. Clients should not call this method.</p>
-	 * @param aModule
-	 *            A valid {@see WorkbenchComponent}&nbsp;with a handle that resolves to an
-	 *            accessible project in the workspace
-	 * @return An instance of ArtifactEdit that may only be used to read the underlying content
-	 *         model
-	 */
-	public static ArtifactEdit getArtifactEditForRead(IVirtualComponent aModule) {
-		if (isValidEditableModule(aModule)) {
-			IProject project = aModule.getProject();
-			ModuleCoreNature nature = ModuleCoreNature.getModuleCoreNature(project);
-			return new ArtifactEdit(nature, aModule, true);
-		}
-		return null;
-	}
-
-	/**
-	 * <p>
-	 * Returns an instance facade to manage the underlying edit model for the given
-	 * {@see WorkbenchComponent}. Instances of ArtifactEdit that are returned through this method
-	 * must be {@see #dispose()}ed of when no longer in use.
-	 * </p>
-	 * <p>
-	 * Use to acquire an ArtifactEdit facade for a specific {@see WorkbenchComponent}&nbsp;that
-	 * will be used for editing.
-	 * </p>
-	 * <p>
-	 * <b>The following method may return null. </b>
-	 * </p>
-	 * <p>Note: This method is for internal use only. Clients should not call this method.</p>
-	 * @param aModule
-	 *            A valid {@see WorkbenchComponent}&nbsp;with a handle that resolves to an
-	 *            accessible project in the workspace
-	 * @return An instance of ArtifactEdit that may be used to modify and persist changes to the
-	 *         underlying content model
-	 */
-	public static ArtifactEdit getArtifactEditForWrite(IVirtualComponent aModule) {
-		if (isValidEditableModule(aModule)) {
-			IProject project = aModule.getProject();
-			ModuleCoreNature nature = ModuleCoreNature.getModuleCoreNature(project);
-			return new ArtifactEdit(nature, aModule, false);
-		}
-		return null;
-	}
-
-	/**
-	 * <p>
-	 * Returns an instance facade to manage the underlying edit model for the given
-	 * {@see WorkbenchComponent}. Instances of ArtifactEdit that are returned through this method
-	 * must be {@see #dispose()}ed of when no longer in use.
-	 * </p>
-	 * <p>
-	 * Use to acquire an ArtifactEdit facade for a specific {@see WorkbenchComponent}&nbsp;that
-	 * will not be used for editing. Invocations of any save*() API on an instance returned from
-	 * this method will throw exceptions.
-	 * </p>
-	 * <p>
-	 * <b>The following method may return null. </b>
-	 * </p>
-	 * 
-	 * @param aModule
-	 *            A valid {@see WorkbenchComponent}&nbsp;with a handle that resolves to an
-	 *            accessible project in the workspace
-	 * @return An instance of ArtifactEdit that may only be used to read the underlying content
-	 *         model
-	 */
-	public static ArtifactEdit getArtifactEditForRead(IProject aProject) {
-		ArtifactEdit artifactEdit = null;
-		try {
-			artifactEdit = new ArtifactEdit(aProject, true);
-		} catch (IllegalArgumentException iae) {
-			artifactEdit = null;
-		}
-		return artifactEdit;
-	}
-
-	/**
-	 * <p>
-	 * Returns an instance facade to manage the underlying edit model for the given
-	 * {@see WorkbenchComponent}. Instances of ArtifactEdit that are returned through this method
-	 * must be {@see #dispose()}ed of when no longer in use.
-	 * </p>
-	 * <p>
-	 * Use to acquire an ArtifactEdit facade for a specific {@see WorkbenchComponent}&nbsp;that
-	 * will be used for editing.
-	 * </p>
-	 * <p>
-	 * <b>The following method may return null. </b>
-	 * </p>
-	 * 
-	 * @param aModule
-	 *            A valid {@see WorkbenchComponent}&nbsp;with a handle that resolves to an
-	 *            accessible project in the workspace
-	 * @return An instance of ArtifactEdit that may be used to modify and persist changes to the
-	 *         underlying content model
-	 */
-	public static ArtifactEdit getArtifactEditForWrite(IProject aProject) {
-		ArtifactEdit artifactEdit = null;
-		try {
-			artifactEdit = new ArtifactEdit(aProject, false);
-		} catch (IllegalArgumentException iae) {
-			artifactEdit = null;
-		}
-		return artifactEdit;
-	}
-
-	/**
-	 * <p>Note: This method is for internal use only. Clients should not call this method.</p>
-	 * @param module
-	 *            A {@see WorkbenchComponent}
-	 * @return True if the supplied module has a moduleTypeId which has a defined
-	 *         {@see IEditModelFactory}&nbsp;and is contained by an accessible project
-	 */
-	public static boolean isValidEditableModule(IVirtualComponent aModule) {
-		if (aModule == null)
-			return false;
-		if (ModuleURIUtil.fullyQualifyURI(aModule.getProject()) == null)
-			return false;
-		/* and the containing project must be resolveable and accessible */
-		IProject project = aModule.getProject();
-		if (project == null || !project.isAccessible())
-			return false;
-		/* and an edit model factory must be defined for the module type */
-		IEditModelFactory factory = EditModelRegistry.getInstance().findEditModelFactoryByProject(aModule.getProject());
-		if (factory == null)
-			return false;
-		return true;
-	}
-
-
-	/**
-	 * <p>
-	 * Creates an instance facade for the given {@see ArtifactEditModel}.
-	 * </p>
-	 * 
-	 * @param anArtifactEditModel
-	 */
-	public ArtifactEdit(ArtifactEditModel anArtifactEditModel) {
-		artifactEditModel = anArtifactEditModel;
-		isReadOnly = artifactEditModel.isReadOnly();
-		isArtifactEditModelSelfManaged = false;
-	}
-
-	/**
-	 * <p>
-	 * Creates an instance facade for the given {@see WorkbenchComponent}.
-	 * </p>
-	 * <p>Note: This method is for internal use only. Clients should not call this method.</p>
-	 * @param aNature
-	 *            A non-null {@see ModuleCoreNature}&nbsp;for an accessible project
-	 * @param aModule
-	 *            A non-null {@see WorkbenchComponent}&nbsp;pointing to a module from the given
-	 *            {@see ModuleCoreNature}
-	 */
-	protected ArtifactEdit(ModuleCoreNature aNature, IVirtualComponent aModule, boolean toAccessAsReadOnly) {
-		if (toAccessAsReadOnly)
-			artifactEditModel = aNature.getArtifactEditModelForRead(ModuleURIUtil.fullyQualifyURI(aModule.getProject()), this);
-		else
-			artifactEditModel = aNature.getArtifactEditModelForWrite(ModuleURIUtil.fullyQualifyURI(aModule.getProject()), this);
-		isReadOnly = toAccessAsReadOnly;
-		isArtifactEditModelSelfManaged = true;
-	}
-
-	/**
-	 * <p>
-	 * Creates an instance facade for the given {@see WorkbenchComponent}.
-	 * </p>
-	 * 
-	 * @param aNature
-	 *            A non-null {@see ModuleCoreNature}&nbsp;for an accessible project
-	 * @param aModule
-	 *            A non-null {@see WorkbenchComponent}&nbsp;pointing to a module from the given
-	 *            {@see ModuleCoreNature}
-	 */
-	public ArtifactEdit(IProject aProject, boolean toAccessAsReadOnly) throws IllegalArgumentException {
-		this(aProject,toAccessAsReadOnly,false,null);
-	}
-	
-	/**
-	 * <p>
-	 * Creates an instance facade for the given {@see WorkbenchComponent}.
-	 * </p>
-	 * 
-	 * @param aNature
-	 *            A non-null {@see ModuleCoreNature}&nbsp;for an accessible project
-	 * @param aModule
-	 *            A non-null {@see WorkbenchComponent}&nbsp;pointing to a module from the given
-	 *            {@see ModuleCoreNature}
-	 */
-	protected ArtifactEdit(IProject aProject, boolean toAccessAsReadOnly, boolean forCreate, String projectType) throws IllegalArgumentException {
-
-		if (aProject == null || !aProject.isAccessible())
-			throw new IllegalArgumentException("Invalid project: " + aProject);
-
-		ModuleCoreNature nature = ModuleCoreNature.getModuleCoreNature(aProject);
-
-		if (nature == null)
-			throw new IllegalArgumentException("Project does not have ModuleCoreNature: " + aProject);
-
-		IVirtualComponent component = ComponentCore.createComponent(aProject);
-		if (component == null)
-			throw new IllegalArgumentException("Invalid component handle: " + aProject);
-		if (!forCreate && !isValidEditableModule(component))
-			throw new IllegalArgumentException("Invalid component handle: " + aProject);
-		URI componentURI = ModuleURIUtil.fullyQualifyURI(aProject);
-
-		if (toAccessAsReadOnly)
-			artifactEditModel = nature.getArtifactEditModelForRead(componentURI, this, projectType);
-		else
-			artifactEditModel = nature.getArtifactEditModelForWrite(componentURI, this, projectType);
-		isReadOnly = toAccessAsReadOnly;
-		isArtifactEditModelSelfManaged = true;
-	}
-
-
-	/**
-	 * <p>
-	 * Force a save of the underlying model. The following method should be used with care. Unless
-	 * required, use {@see #saveIfNecessary(IProgressMonitor)}&nbsp; instead.
-	 * </p>
-	 * 
-	 * @see org.eclipse.wst.common.componentcore.IEditModelHandler#save()
-	 * @throws IllegalStateException
-	 *             If the ModuleCore object was created as read-only
-	 */
-	public void save(IProgressMonitor aMonitor) {
-		if (isReadOnly())
-			throwAttemptedReadOnlyModification();
-		artifactEditModel.save(aMonitor, this);
-	}
-
-	/**
-	 * <p>
-	 * Save the underlying model only if no other clients are currently using the model. If the
-	 * model is not shared, it will be saved. If it is shared, the save will be deferred.
-	 * </p>
-	 * 
-	 * @see org.eclipse.wst.common.componentcore.IEditModelHandler#saveIfNecessary()
-	 * @throws IllegalStateException
-	 *             If the ModuleCore object was created as read-only
-	 */
-	public void saveIfNecessary(IProgressMonitor aMonitor) {
-		if (isReadOnly())
-			throwAttemptedReadOnlyModification();
-		artifactEditModel.saveIfNecessary(aMonitor, this);
-	}
-
-	/**
-	 * Save only if necessary. If typically a save would not occur because this edit model is
-	 * shared, the user will be prompted using the
-	 * 
-	 * @operationHandler. If the prompt returns true (the user wants to save) the entire edit model
-	 *                    will be saved. You may pass in a boolean <code>wasDirty</code> to
-	 *                    indicate whether this edit model was dirty prior to making any changes and
-	 *                    calling this method. {@link EditModel#isDirty()}
-	 */
-	public void saveIfNecessaryWithPrompt(IProgressMonitor monitor, IOperationHandler operationHandler, boolean wasDirty) {
-
-		if (shouldSave(operationHandler, wasDirty))
-			saveIfNecessary(monitor);
-		else
-			handleSaveIfNecessaryDidNotSave(monitor);
-	}
-
-	/**
-	 * Default is to do nothing. This method is called if a saveIfNecessary or
-	 * saveIfNecessaryWithPrompt determines not to save. This provides subclasses with an
-	 * opportunity to do some other action.
-	 */
-	private void handleSaveIfNecessaryDidNotSave(IProgressMonitor monitor) {
-		// do nothing
-	}
-
-	/**
-	 * Should the resources be saved.
-	 */
-	private boolean shouldSave(IOperationHandler operationHandler, boolean wasDirty) {
-		return !wasDirty ? shouldSave() : shouldSave(operationHandler);
-	}
-
-	/**
-	 * Prompt for a save.
-	 */
-	private boolean promptToSave(IOperationHandler operationHandler) {
-		if (operationHandler == null)
-			return false;
-		return operationHandler.canContinue(EMFWorkbenchResourceHandler.getString("The_following_resources_ne_UI_"), getArtifactEditModel().getResourceURIs(true)); //$NON-NLS-1$ = "The following resources need to be saved but are currently shared, do you want to save now?"
-	}
-
-	/**
-	 * Should the resources be saved.
-	 */
-	private boolean shouldSave(IOperationHandler operationHandler) {
-		return shouldSave() || promptToSave(operationHandler);
-	}
-
-	/**
-	 * Should the resources be saved.
-	 */
-	private boolean shouldSave() {
-		return !isReadOnly() && isArtifactEditModelSelfManaged;
-	}
-
-	/**
-	 * <p>
-	 * Clients must call the following method when they have finished using the model, even if the
-	 * ArtifactEdit instance facade was created as read-only.
-	 * </p>
-	 * 
-	 * @see org.eclipse.wst.common.componentcore.IEditModelHandler#dispose()
-	 */
-	public void dispose() {
-		if (isArtifactEditModelSelfManaged && artifactEditModel != null)
-			artifactEditModel.releaseAccess(this);
-	}
-
-	/**
-	 * <p>
-	 * Returns the root object for read or write access (depending on how the current ArtifactEdit
-	 * was loaded).
-	 * </p>
-	 * 
-	 * @return The root object of the underlying model
-	 */
-	public EObject getContentModelRoot() {
-		return artifactEditModel.getPrimaryRootObject();
-	}
-
-	/**
-	 * <p>
-	 * Add a listener to track lifecylce events from the underlying EditModel.
-	 * </p>
-	 * 
-	 * @param listener
-	 *            A non-null EditModelListener
-	 */
-	public void addListener(EditModelListener listener) {
-		artifactEditModel.addListener(listener);
-	}
-
-	/**
-	 * <p>
-	 * Remove the supplied listener
-	 * </p>
-	 * 
-	 * @param listener
-	 *            A non-null EditModelListener
-	 *           
-	 */
-	public void removeListener(EditModelListener listener) {
-		artifactEditModel.removeListener(listener);
-	}
-
-	/**
-	 * <p>
-	 * This method may be removed soon. Avoid adding dependencies to it.
-	 * </p>
-	 * <p>
-	 * This method is considered internal and not published as API.
-	 * </p>
-	 * @param editModel
-	 * @return
-	 */
-	public boolean hasEditModel(EditModel editModel) {
-		return artifactEditModel == editModel;
-	}
-	/**
-	 * 
-	 * @return IProject - returns the project of the underlying workbench component.
-	 */
-	public IProject getProject() {
-		
-		return getArtifactEditModel().getProject();
-	}
-	/**
-	 * 
-	 * @return IVirtualComponent - returns the underlying workbench component.
-	 */
-	public IVirtualComponent getComponent() {
-		
-		return getArtifactEditModel().getVirtualComponent();
-	}
-
-	/**
-	 * @return The underlying managed edit model
-	 */
-	protected ArtifactEditModel getArtifactEditModel() {
-		return artifactEditModel;
-	}
-	
-	/**
-	 * @return The EMF command stack managed by the underlying editmodel
-	 */
-	public CommandStack getCommandStack() {
-		return artifactEditModel.getCommandStack();
-	}
-	/**
-	 * 
-	 * @deprecated Use ((ArtifactEditModel)getAdapter(ArtifactEditModel.ADAPTER_TYPE)).deleteResource(aResource);
-	 */
-	public void deleteResource(Resource aResource) {
-		artifactEditModel.deleteResource(aResource);
-	}
-	/**
-	 * @return The isDirty flag based the underlying editmodel's list of resources.
-	 */
-	public boolean isDirty() {
-		return artifactEditModel.isDirty();
-	}
-
-	private void throwAttemptedReadOnlyModification() {
-		throw new IllegalStateException("Attempt to modify an ArtifactEdit instance facade that was loaded as read-only.");
-	}
-
-	public boolean isReadOnly() {
-		return isReadOnly;
-	}
-	
-	/**
-	 * Force all of the known resource URIs to be loaded
-	 * if they are not already.
-	 */
-	public void forceLoadKnownResources() {
-		List uris = getArtifactEditModel().getKnownResourceUris();
-		URI uri = null;
-		for (int i = 0; i < uris.size(); i++) {
-			uri = (URI) uris.get(i);
-			getArtifactEditModel().getResource(uri);
-		}
-	}
-	
-	/**
-	 * Return a Resource for @aUri.
-	 * @deprecated Use ((ArtifactEditModel)getAdapter(ArtifactEditModel.ADAPTER_TYPE)).getResource(aResource);
-	 */
-	public Resource getResource(URI aUri) {
-		return getArtifactEditModel().getResource(aUri);
-	}
-
-	public Object getAdapter(Class adapterType) {
-		return Platform.getAdapterManager().getAdapter(this, adapterType);
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ComponentCore.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ComponentCore.java
deleted file mode 100644
index 243e84b..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ComponentCore.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.wst.common.componentcore.internal.ComponentResource;
-import org.eclipse.wst.common.componentcore.internal.StructureEdit;
-import org.eclipse.wst.common.componentcore.internal.impl.ResourceTreeNode;
-import org.eclipse.wst.common.componentcore.internal.resources.VirtualArchiveComponent;
-import org.eclipse.wst.common.componentcore.internal.resources.VirtualComponent;
-import org.eclipse.wst.common.componentcore.internal.resources.VirtualFile;
-import org.eclipse.wst.common.componentcore.internal.resources.VirtualFolder;
-import org.eclipse.wst.common.componentcore.internal.resources.VirtualReference;
-import org.eclipse.wst.common.componentcore.internal.resources.VirtualResource;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualContainer;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
-import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
-import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
-
-/**
- * Provides a handle creation factory for the Virtual Path API. Clients may use
- * this class to convert Platform IResource model elements to IVirtualResource
- * model elements.
- * <p>
- * ComponentCore provides a consistent entry point to the IVirtual Path model
- * that allows clients to group resources together in logical collections with a
- * path structure that varies from their actual source location structures.
- * </p>
- * 
- * @plannedfor 1.0
- */
-public class ComponentCore {
-
-	private static final IVirtualResource[] NO_RESOURCES = new VirtualResource[0];
-
-	/**
-	 * Return an IVirtualComponent with the given name (aComponentName)
-	 * contained by the given project (aProject). Component names should be
-	 * unique across a project.
-	 * 
-	 * @param aProject
-	 *            A valid, accessible project to contain the component
-	 * @return A handle to an IVirtualComponent that may or may not exist or
-	 *         null if passed project does not contain ModuleCoreNature.
-	 * @see IVirtualContainer#create(int, IProgressMonitor)
-	 */
-	public static IVirtualComponent createComponent(IProject aProject) {
-		if (!ModuleCoreNature.isFlexibleProject(aProject))
-			return null;
-		return new VirtualComponent(aProject, new Path("/")); //$NON-NLS-1$
-	}
-
-	/**
-	 * Return an IVirtualComponent with the given name (aComponentName)
-	 * contained by the given project (aProject). Component names should be
-	 * unique across a project.
-	 * 
-	 * @param aProject
-	 *            A valid, accessible project to contain the component
-	 * @return A handle to an IVirtualComponent that may or may not exist or
-	 *         null if passed project does not contain ModuleCoreNature.
-	 * @deprecated
-	 * @see IVirtualContainer#create(int, IProgressMonitor)
-	 */
-	public static IVirtualComponent createComponent(IProject aProject, String aName) {
-		return createComponent(aProject);
-	}
-
-	/**
-	 * Return an IVirtualComponent with the given name (aComponentName)
-	 * 
-	 * @param aComponentName
-	 *            A name to identify the component, the name can be
-	 *            lib/&lt;Absolute path of a jar&gt; or
-	 *            var/&lt;CLASSPATH_VARIABLE/library namer&gt;
-	 * @return A handle to an IVirtualComponent that may or may not exist.
-	 * @see IVirtualContainer#create(int, IProgressMonitor)
-	 */
-	public static IVirtualComponent createArchiveComponent(IProject aProject, String aComponentName) {
-		return new VirtualArchiveComponent(aProject, aComponentName, new Path("/")); //$NON-NLS-1$
-	}
-
-	/**
-	 * Return an IVirtualFolder with a runtime path specified by aRuntimePath
-	 * contained by aProject, in a component named aComponentName. The resultant
-	 * IVirtualFolder may or may not exist.
-	 * 
-	 * @param aProject
-	 *            A valid, accessible project to contain the component
-	 * @param aRuntimePath
-	 *            The runtime path of the IVirtualFolder to return.
-	 * @return An IVirtualFolder contained by the specified component with the
-	 *         given runtime path
-	 * @see IVirtualContainer#create(int, IProgressMonitor)
-	 * @see IVirtualResource#createLink(IPath, int, IProgressMonitor)
-	 */
-	public static IVirtualFolder createFolder(IProject aProject, IPath aRuntimePath) {
-		return new VirtualFolder(aProject, aRuntimePath);
-	}
-
-	/**
-	 * Return an IVirtualFile with a runtime path specified by aRuntimePath
-	 * contained by aProject, in a component named aComponentName. IVirtualFiles
-	 * can only be created as links. Use
-	 * {@link IVirtualResource#getUnderlyingResource()} or
-	 * {@link IVirtualFile#getUnderlyingFile()} to create a resource with real
-	 * contents.
-	 * 
-	 * @param aProject
-	 *            A valid, accessible project to contain the component
-	 * @param aRuntimePath
-	 *            The runtime path of the IVirtualFolder to return.
-	 * @return An IVirtualFile contained by the specified component with the
-	 *         given runtime path
-	 * @see IVirtualResource#createLink(IPath, int, IProgressMonitor)
-	 */
-	public static IVirtualFile createFile(IProject aProject, IPath aRuntimePath) {
-		return new VirtualFile(aProject, aRuntimePath);
-	}
-
-	/**
-	 * Return an IVirtualReference that captures a relationship between
-	 * aComponent and aReferencedComponent. The IVirtualReference will be stored
-	 * with aComponent and target aReferencedComponent. IVirtualReferences may
-	 * span projects.
-	 * 
-	 * @param aComponent
-	 *            A valid, existing IVirtualComponent
-	 * @param aReferencedComponent
-	 *            A valid, existing IVirtualComponent
-	 * @return An IVirtualReference that captures the relationship between
-	 *         aComponent and aReferencedComponent.
-	 * @see IVirtualReference#create(int, IProgressMonitor)
-	 */
-	public static IVirtualReference createReference(IVirtualComponent aComponent, IVirtualComponent aReferencedComponent) {
-		return new VirtualReference(aComponent, aReferencedComponent);
-	}
-
-	public static IVirtualReference createReference(IVirtualComponent aComponent, IVirtualComponent aReferencedComponent, IPath runtimePath) {
-		return new VirtualReference(aComponent, aReferencedComponent, runtimePath);
-	}
-
-	/**
-	 * Return an array of IVirtualResources that represent the given IResource.
-	 * Each IResource could be mapped to multiple components, and thus an array
-	 * of each IVirtualResource that represents the IResource will be returned.
-	 * Each IVirtualResource may also map to other existing IResources, so the
-	 * mapping is not 1:1.
-	 * 
-	 * @param aResource
-	 *            An accessible IResource
-	 * @return An array of IVirtualResources from the model that represent the
-	 *         IResource.
-	 */
-	public static IVirtualResource[] createResources(IResource aResource) {
-		IProject proj = aResource.getProject();
-		StructureEdit se = null;
-		List foundResources = new ArrayList();
-		try {
-			se = StructureEdit.getStructureEditForRead(proj);
-			if (se != null) {
-				ComponentResource[] resources = se.findResourcesBySourcePath(aResource.getProjectRelativePath(), aResource.exists() ? ResourceTreeNode.CREATE_NONE : ResourceTreeNode.CREATE_RESOURCE_ALWAYS);
-				for (int i = 0; i < resources.length; i++) {
-					if (aResource.getType() == IResource.FILE)
-						foundResources.add(new VirtualFile(proj, resources[i].getRuntimePath()));
-					else
-						foundResources.add(new VirtualFolder(proj, resources[i].getRuntimePath()));
-				}
-			}
-		} catch (UnresolveableURIException e) {
-			e.printStackTrace();
-		} finally {
-			if (se != null) {
-				se.dispose();
-			}
-		}
-		if (foundResources.size() > 0)
-			return (IVirtualResource[]) foundResources.toArray(new VirtualResource[foundResources.size()]);
-		return NO_RESOURCES;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/IEditModelHandler.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/IEditModelHandler.java
deleted file mode 100644
index 7d89b16..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/IEditModelHandler.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-
-/**
- * <p>
- * Provides a standard interface for managing the lifecycle of an Edit Model. Clients which use
- * instances of this interface are <b>required to invoke {@see #dispose()}</b> when they have
- * completed their usage. Once clients have disposed that instance, they will not be able to invoke
- * {@see #save(IProgressMonitor)}or {@see #saveIfNecessary(IProgressMonitor)}&nbsp;and should be wary of
- * using any model objects acquired from the handler, as they may be or become stale.
- * </p>
- * @see org.eclipse.wst.common.componentcore.internal.StructureEdit
- * @see org.eclipse.wst.common.componentcore.ArtifactEdit
- * @plannedfor 1.0
- */
-public interface IEditModelHandler {
-
-	/**
-	 * <p>
-	 * Force a save of the underlying edit model and keep track of progress using the supplied
-	 * progress monitor. Clients should avoid calling this version of save unless they are certain
-	 * they require the model to be saved. Clients are encouraged to use
-	 * {@see #saveIfNecessary(IProgressMonitor)}&nbsp;instead.
-	 * </p>
-	 * 
-	 * @param aMonitor
-	 *            A valid progress monitor or null
-	 */
-	void save(IProgressMonitor aMonitor);
-
-	/**
-	 * <p>
-	 * Save the underlying edit model, if no other consumers are using the edit model, and keep
-	 * track of progress using the supplied progress monitor. This version of save will only save if
-	 * the underlying edit model is not shared with other consumers.
-	 * </p>
-	 * 
-	 * @param aMonitor
-	 *            A valid progress monitor or null
-	 */
-	void saveIfNecessary(IProgressMonitor aMonitor);
-
-	/**
-	 * <p>
-	 * Clients must invoke this method when they have finished using the handler.
-	 * </p>
-	 */
-	void dispose();
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ModuleCoreNature.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ModuleCoreNature.java
deleted file mode 100644
index 3368238..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ModuleCoreNature.java
+++ /dev/null
@@ -1,564 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.IProjectNature;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.jobs.IJobManager;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.resource.URIConverter;
-import org.eclipse.jem.util.emf.workbench.EMFWorkbenchContextBase;
-import org.eclipse.jem.util.emf.workbench.ISynchronizerExtender;
-import org.eclipse.jem.util.emf.workbench.ProjectResourceSet;
-import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.jem.util.emf.workbench.nature.EMFNature;
-import org.eclipse.wst.common.componentcore.internal.ArtifactEditModel;
-import org.eclipse.wst.common.componentcore.internal.ModuleStructuralModel;
-import org.eclipse.wst.common.componentcore.internal.StructureEdit;
-import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-import org.eclipse.wst.common.componentcore.internal.impl.ArtifactEditModelFactory;
-import org.eclipse.wst.common.componentcore.internal.impl.ComponentCoreURIConverter;
-import org.eclipse.wst.common.componentcore.internal.impl.ModuleStructuralModelFactory;
-import org.eclipse.wst.common.componentcore.internal.impl.WTPResourceFactoryRegistry;
-import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
-import org.eclipse.wst.common.internal.emfworkbench.edit.EditModelRegistry;
-import org.eclipse.wst.common.internal.emfworkbench.integration.EditModel;
-import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelNature;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject;
-import org.eclipse.wst.common.project.facet.core.IProjectFacet;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-
-/**
- * <p>
- * Allows projects to support flexible project structures. The ModuleCoreNature manages the
- * configuration of a module structural builder that prepares WorkbenchModules for deployment.
- * </p>
- * <p>
- * To determine if a project supports flexible project structures, check for the existence of the
- * ModuleCoreNature:
- * <p>
- * <code>(ModuleCoreNature.getModuleCoreNature(project) != null)</code>
- * </p>
- * <p>
- * If the project has a ModuleCoreNature, then the project supports flexible module structures.
- * </p>
- * <p>
- * In general, clients are expected to use the utility methods available on this class to acquire
- * the ModuleCoreNature instance from a given project ({@see #getModuleCoreNature(IProject)}
- * &nbsp;or to make a flexible project flexible by adding a ModuleCoreNature (
- * {@see #addModuleCoreNatureIfNecessary(IProject, IProgressMonitor)}).
- * </p> 
- * <a name="model-discussion"/>
-* <a name="module-structural-model"/>
-* <p>
-* Each ModuleCoreNature from a given project can provide access to the
-* {@see org.eclipse.wst.common.modulecore.ModuleStructuralModel}&nbsp; of the project.
-* {@see org.eclipse.wst.common.modulecore.ModuleStructuralModel}&nbsp; is a subclass of
-* {@see org.eclipse.wst.common.internal.emfworkbench.integration.EditModel}&nbsp;that manages
-* resources associated with the Module Structural Metamodel. As an EditModel, the
-* {@see org.eclipse.wst.common.modulecore.ModuleStructuralModel}&nbsp; references EMF resources,
-* that contain EMF models -- in this case, the EMF model of <i>.component </i> file.
-* </p>
-* <p>
-* Clients are encouraged to use the Edit Facade pattern (via
-* {@see org.eclipse.wst.common.modulecore.ArtifactEdit}&nbsp; or one if its relevant subclasses)
-* to work directly with the Module Structural Metamodel.
-* </p>
-* <a name="artifact-editmodel"/>
-* <p>
-* Each ModuleCoreNature from a given project can also provide access to the
-* {@see org.eclipse.wst.common.modulecore.ArtifactEditModel}&nbsp; for each
-* {@see org.eclipse.wst.common.modulecore.WorkbenchComponent}&nbsp; contained by the project. Like
-* {@see org.eclipse.wst.common.modulecore.ModuleStructuralModel},
-* {@see org.eclipse.wst.common.modulecore.ArtifactEditModel}&nbsp; is a subclass of
-* {@see org.eclipse.wst.common.internal.emfworkbench.integration.EditModel}&nbsp; that contains
-* EMF resources, which in turn contain the EMF models of module metadata files (such as J2EE
-* deployment descriptors).
-* </p>
-* <p>
-* The following diagram highlights the relationships of these subclasses of EditModel, and the
-* relationship of the EditModel to the EMF resources. In the diagram, "MetamodelResource" and
-* "MetamodelObject" are used as placeholders for the specific subclasses of
-* {@see org.eclipse.emf.ecore.resource.Resource}&nbsp;and {@see org.eclipse.emf.ecore.EObject}&nbsp;
-* respectively.
-* </p>
-* <table cellspacing="10" cellpadding="10">
-* <tr>
-* <td>
-* <p>
-* <img src="../../../../../overview/metamodel_components.jpg" />
-* </p>
-* </td>
-* </tr>
-* <tr>
-* <td>
-* <p>
-* <i>Figure 1: A component diagram of the Module Edit Models. </i>
-* </p>
-* </td>
-* </tr>
-* </table>
-* <p>
-* Clients are encouraged to use the Edit Facade pattern (via
-* {@see org.eclipse.wst.common.modulecore.ArtifactEdit}&nbsp; or what if its relevant subclasses)
-* to work directly with the Module Structural Metamodel.
-* </p>
-* <a name="accessor-key"/>
-* <p>
-* All EditModels have a lifecycle that must be enforced to keep the resources loaded that are in
-* use, and to unload resources that are not in use. To access an EditModel, clients are required to
-* supply an object token referred to as an accessor key. The accessor key allows the framework to
-* better track which clients are using the EditModel, and to ensure that only a client which has
-* accessed the EditModel with an accessor key may invoke save*()s on that EditModel.
-* </p> 
- * @see org.eclipse.wst.common.componentcore.internal.StructureEdit
- * @see org.eclipse.wst.common.componentcore.internal.StructureEdit#getStructureEditForRead(IProject)
- * @see org.eclipse.wst.common.componentcore.internal.StructureEdit#getStructureEditForWrite(IProject)
- * @see org.eclipse.wst.common.componentcore.ArtifactEdit
- * @see org.eclipse.wst.common.componentcore.ArtifactEdit#getArtifactEditForRead(WorkbenchComponent)
- * @see org.eclipse.wst.common.componentcore.ArtifactEdit#getArtifactEditForWrite(WorkbenchComponent)
- * @plannedfor 1.0
- */
-public class ModuleCoreNature extends EditModelNature implements IProjectNature, IModuleConstants, ISynchronizerExtender {
-	
-    public static final String VALIDATION_BUILDER_ID = "org.eclipse.wst.validation.validationbuilder"; // plugin id of the validation builder//$NON-NLS-1$
-    private ModuleStructuralModel cachedModel;
-	/**
-	 * <p>
-	 * Find and return the ModuleCoreNature of aProject, if available.
-	 * <p>
-	 * <b>This method may return null. </b>
-	 * </p>
-	 * 
-	 * @param aProject
-	 *            An accessible project
-	 * @return The ModuleCoreNature of aProject, if it exists
-	 */
-	public static ModuleCoreNature getModuleCoreNature(IProject aProject) {
-		try {
-			if (aProject != null && aProject.isAccessible())
-				return (ModuleCoreNature) aProject.getNature(IModuleConstants.MODULE_NATURE_ID);
-		} catch (CoreException e) {
-			//Ignore
-		}
-		return null;
-	}
-	public static boolean isFlexibleProject(IProject project) {
-		return ModuleCoreNature.getModuleCoreNature(project) != null;
-	}
-
-	/**
-	 * <p>
-	 * Adds a ModuleCoreNature to the project.
-	 * </p>
-	 * <p>
-	 * <b>This method may return null. </b>
-	 * </p>
-	 * 
-	 * @param aProject
-	 *            A accessible project.
-	 * @param aMonitor
-	 *            A progress monitor to track the time to completion
-	 * @return The ModuleCoreNature of aProject, if it exists
-	 */
-	public static ModuleCoreNature addModuleCoreNatureIfNecessary(final IProject aProject, IProgressMonitor aMonitor) {
-		try {
-			if (aProject.hasNature(IModuleConstants.MODULE_NATURE_ID))
-				return getModuleCoreNature(aProject);
-
-			IJobManager manager = Platform.getJobManager();
-			IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();	
-			if (aMonitor != null)
-				aMonitor.beginTask("Add ModuleCore Nature", 5); //$NON-NLS-1$
-			manager.beginRule(root, aMonitor);
-			try {
-				IProjectDescription description = aProject.getDescription();
-				String[] currentNatureIds = description.getNatureIds();
-				String[] newNatureIds = new String[currentNatureIds.length + 1];
-				System.arraycopy(currentNatureIds, 0, newNatureIds, 0, currentNatureIds.length);
-				newNatureIds[currentNatureIds.length] = IModuleConstants.MODULE_NATURE_ID;
-				description.setNatureIds(newNatureIds);
-				aProject.setDescription(description, aMonitor);
-			} catch (CoreException e) {
-				e.printStackTrace(); 				
-			} finally {
-				manager.endRule(root);
-			} 			
-			if (aMonitor != null)
-				aMonitor.done();
-		} catch (CoreException e) {
-			e.printStackTrace();
-		}
-		/* Return the new nature */
-		return getModuleCoreNature(aProject);
-	}
-
-	/**
-	 * <p>
-	 * Return a {@see ModuleStructuralModel}&nbsp;for read-only access.
-	 * </p>
-	 * <p>
-	 * Clients are encouraged to use {@see ModuleCore#getModuleCoreForRead(IProject)}&nbsp;to work
-	 * with the Module Structural Metamodels of flexible projects.
-	 * </p>
-	 * <p>
-	 * See the discussion what a {@see ModuleStructuralModel}&nbsp; is and <a
-	 * href="#module-structural-model">how it relates to the Module Structural Metamodel </a>.
-	 * </p>
-	 * <p>
-	 * Also see the discussion of <a href="#accessor-key">the purpose of an accessor key </a>.
-	 * </p>
-	 * 
-	 * @param anAccessorKey
-	 *            Typically client supplies the object that invoked this method, or a proxy (
-	 *            <code>new Object()</code>) in the case of other static methods requesting a
-	 *            {@see ModuleStructuralModel}.
-	 * @return A {@see ModuleStructuralModel}for the project of the current nature.
-	 */
-	public ModuleStructuralModel getModuleStructuralModelForRead(Object anAccessorKey) {
-		return (ModuleStructuralModel) getEditModelForRead(ModuleStructuralModelFactory.MODULE_STRUCTURAL_MODEL_ID, anAccessorKey);
-	}
-
-	/**
-	 * <p>
-	 * Return a {@see ModuleStructuralModel}&nbsp;for write access.
-	 * </p>
-	 * <p>
-	 * Clients are encouraged to use {@see ModuleCore#getModuleCoreForWrite(IProject)}&nbsp;to work
-	 * with the Module Structural Metamodels of flexible projects.
-	 * </p>
-	 * <p>
-	 * See the discussion what a {@see ModuleStructuralModel}&nbsp; is and <a
-	 * href="#module-structural-model">how it relates to the Module Structural Metamodel </a>.
-	 * </p>
-	 * <p>
-	 * Also see the discussion of <a href="#accessor-key">the purpose of an accessor key </a>.
-	 * </p>
-	 * 
-	 * @param anAccessorKey
-	 *            Typically client supplies the object that invoked this method, or a proxy (
-	 *            <code>new Object()</code>) in the case of other static methods requesting a
-	 *            {@see ModuleStructuralModel}.
-	 * @return A {@see ModuleStructuralModel}for the project of the current nature.
-	 */
-	public ModuleStructuralModel getModuleStructuralModelForWrite(Object anAccessorKey) {
-		return (ModuleStructuralModel) getEditModelForWrite(ModuleStructuralModelFactory.MODULE_STRUCTURAL_MODEL_ID, anAccessorKey);
-	}
-
-	/**
-	 * <p>
-	 * Returns an {@see ArtifactEditModel}&nbsp; to work with the underlying content of an
-	 * individual {@see WorkbenchComponent}&nbsp; contained in the project. {@see ArtifactEditModel}s
-	 * are used to manipulate the content models for individual {@see WorkbenchComponent}s. In
-	 * general, a content model will contain an EMF representation of the module's relevant
-	 * deployment descriptor, and possibly other EMF resources as well.
-	 * </p>
-	 * <p>
-	 * {@see ArtifactEditModel}s that are returned from this method may not be used to modify and
-	 * persist changes to the underlying Module Content Metamodel. Clients that need to make changes
-	 * to the underlying Module Content Module, and that choose to work directly with the
-	 * {@see ArtifactEditModel}&nbsp; should use {@see #getArtifactEditModelForWrite(URI, Object)}.
-	 * </p>
-	 * <p>
-	 * Clients are encouraged to use {@see ArtifactEdit}&nbsp;or one of its relevant subclasses to
-	 * work with the module content model, instead of working with directly with the EditModel:
-	 * </p>
-	 * <p>
-	 * <code>ArtifactEdit editFacade = ArtifactEdit.getArtifactEditForRead(aWorkbenchModule);</code>
-	 * </p>
-	 * <p>
-	 * When a client is aware of the underlying type of module, more specific Edit Facades may be
-	 * acquired:
-	 * </p>
-	 * <p>
-	 * <code>WebEdit editFacade = WebEdit.getWebEditForRead(aWorkbenchModule);</code>
-	 * </p>
-	 * <p>
-	 * If a particular Edit Facade is not applicable to the supplied {@see WorkbenchComponent}, then
-	 * <b>null </b> will be returned.
-	 * </p>
-	 * 
-	 * <p>
-	 * See the discussion what a {@see ArtifactEditModel}&nbsp; is and <a
-	 * href="#artifact-editmodel">how it relates to the Module Content Metamodel </a>.
-	 * </p>
-	 * <p>
-	 * Also see the discussion of <a href="#accessor-key">the purpose of an accessor key </a>.
-	 * </p>
-	 * 
-	 * @param aModuleURI
-	 *            A fully qualified URI of the form "module:/resource/ <project-name>/
-	 *            <module-deployed-name>"
-	 * @param anAccessorKey
-	 *            Typically client supplies the object that invoked this method, or a proxy (
-	 *            <code>new Object()</code>) in the case of other static methods requesting a
-	 *            {@see ModuleStructuralModel}.
-	 * @return
-	 * @see ArtifactEdit
-	 * @see ArtifactEdit#getArtifactEditForRead(WorkbenchComponent)
-	 */
-	public ArtifactEditModel getArtifactEditModelForRead(URI aModuleURI, Object anAccessorKey) {
-		return getArtifactEditModelForRead(aModuleURI, anAccessorKey, null);
-	}
-	
-	public ArtifactEditModel getArtifactEditModelForRead(URI aModuleURI, Object anAccessorKey, String projectType) {
-		Map params = new HashMap();
-		params.put(ArtifactEditModelFactory.PARAM_MODULE_URI, aModuleURI);
-		if (projectType !=null)
-			return (ArtifactEditModel) getEditModelForRead(projectType, anAccessorKey, params);
-		try {
-			IProject aProject = StructureEdit.getContainingProject(aModuleURI);
-			IFacetedProject facetedProject = ProjectFacetsManager.create(aProject);
-			String[] editModelIDs = EditModelRegistry.getInstance().getRegisteredEditModelIDs();
-			for (int i=0; i<editModelIDs.length; i++) {
-				try {
-					IProjectFacet facet = ProjectFacetsManager.getProjectFacet(editModelIDs[i]);
-					if (facet != null && facetedProject.hasProjectFacet(facet)) {
-						ArtifactEditModel editModel = (ArtifactEditModel) getEditModelForRead(editModelIDs[i], anAccessorKey, params);
-						if (editModel !=null)
-							return editModel;
-					}
-				} catch (Exception e) {
-					continue;
-				}
-			}
-			
-		} catch (Exception e){
-			//Return null
-		}
-		return null;
-	}
-
-	/**
-	 * <p>
-	 * Returns an {@see ArtifactEditModel}&nbsp; to work with the underlying content of an
-	 * individual {@see WorkbenchComponent}&nbsp; contained in the project. {@see ArtifactEditModel}s
-	 * are used to manipulate the content models for individual {@see WorkbenchComponent}s. In
-	 * general, a content model will contain an EMF representation of the module's relevant
-	 * deployment descriptor, and possibly other EMF resources as well.
-	 * </p>
-	 * 
-	 * <p>
-	 * {@see ArtifactEditModel}s that are returned from this method may be used to modify and
-	 * persist changes to the underlying Module Content Metamodel. For clients that do not expect to
-	 * make modifications are encouraged to use {@see #getArtifactEditModelForRead(URI, Object)}
-	 * &nbsp; instead.
-	 * </p>
-	 * <p>
-	 * Clients are encouraged to use {@see ArtifactEdit}&nbsp;or one of its relevant subclasses to
-	 * work with the module content model, instead of working with directly with the EditModel:
-	 * </p>
-	 * <p>
-	 * <code>ArtifactEdit editFacade = ArtifactEdit.getArtifactEditForWrite(aWorkbenchModule);</code>
-	 * </p>
-	 * <p>
-	 * When a client is aware of the underlying type of module, more specific Edit Facades may be
-	 * acquired:
-	 * </p>
-	 * <p>
-	 * <code>WebEdit editFacade = WebEdit.getWebEditForWrite(aWorkbenchModule);</code>
-	 * </p>
-	 * <p>
-	 * If a particular Edit Facade is not applicable to the supplied {@see WorkbenchComponent}, then
-	 * <b>null </b> will be returned.
-	 * </p>
-	 * 
-	 * <p>
-	 * See the discussion what a {@see ArtifactEditModel}&nbsp; is and <a
-	 * href="#artifact-editmodel">how it relates to the Module Content Metamodel </a>.
-	 * </p>
-	 * <p>
-	 * Also see the discussion of <a href="#accessor-key">the purpose of an accessor key </a>.
-	 * </p>
-	 * 
-	 * @param aModuleURI
-	 *            A fully qualified URI of the form "module:/resource/ <project-name>/
-	 *            <module-deployed-name>"
-	 * @param anAccessorKey
-	 *            Typically client supplies the object that invoked this method, or a proxy (
-	 *            <code>new Object()</code>) in the case of other static methods requesting a
-	 *            {@see ModuleStructuralModel}.
-	 * @return
-	 * @see ArtifactEdit
-	 * @see ArtifactEdit#getArtifactEditForRead(WorkbenchComponent)
-	 */
-	public ArtifactEditModel getArtifactEditModelForWrite(URI aModuleURI, Object anAccessorKey) {
-		return getArtifactEditModelForWrite(aModuleURI, anAccessorKey, null);
-	}
-	public ArtifactEditModel getArtifactEditModelForWrite(URI aModuleURI, Object anAccessorKey, String projectType) {
-		Map params = new HashMap();
-		params.put(ArtifactEditModelFactory.PARAM_MODULE_URI, aModuleURI);
-		if (projectType != null)
-			return  (ArtifactEditModel) getEditModelForWrite(projectType, anAccessorKey, params);
-		try {
-			IProject aProject = StructureEdit.getContainingProject(aModuleURI);
-			IFacetedProject facetedProject = ProjectFacetsManager.create(aProject);
-			String[] editModelIDs = EditModelRegistry.getInstance().getRegisteredEditModelIDs();
-			for (int i=0; i<editModelIDs.length; i++) {
-				try {
-					IProjectFacet facet = ProjectFacetsManager.getProjectFacet(editModelIDs[i]);
-					if (facet != null && facetedProject.hasProjectFacet(facet)) {
-						ArtifactEditModel editModel = (ArtifactEditModel) getEditModelForWrite(editModelIDs[i], anAccessorKey, params);
-						if (editModel !=null)
-							return editModel;
-					}
-				} catch (Exception e) {
-					continue;
-				}
-			}
-			
-		} catch (Exception e){
-			//Return null
-		}
-		return null;
-	}
-
-	public String getNatureID() {
-		return MODULE_NATURE_ID;
-	}
-
-
-	/**
-	 * <p>
-	 * This method should not be invoked by clients.
-	 * </p>
-	 * 
-	 * @see org.eclipse.jem.util.emf.workbench.IEMFContextContributor#primaryContributeToContext(org.eclipse.jem.util.emf.workbench.EMFWorkbenchContextBase)
-	 */
-	public void primaryContributeToContext(EMFWorkbenchContextBase aNature) {
-		if (emfContext == aNature)
-			return;
-		emfContext = aNature;
-		getEmfContext().setDefaultToMOF5Compatibility(true);
-		// Overriding superclass to use our own URI converter, which knows about binary projects
-		ProjectResourceSet projectResourceSet = aNature.getResourceSet();
-		projectResourceSet.setResourceFactoryRegistry(WTPResourceFactoryRegistry.INSTANCE);
-		projectResourceSet.setURIConverter(createURIConverter(getProject(), projectResourceSet));
-		
-		// initializeCacheEditModel();
-		// addAdapterFactories(set);
-		// set.getSynchronizer().addExtender(this); // added so we can be informed of closes to the
-		// new J2EEResourceDependencyRegister(set); // This must be done after the URIConverter is
-		cacheModuleStructuralModel();
-	}
-	
-	/**
-	 * @see EMFNature.primConfigure
-	 */
-	protected void primConfigure() throws CoreException {
-		super.primConfigure();
-		// add Validation Builder to all flex Project's builder list
-		ProjectUtilities.addToBuildSpec(VALIDATION_BUILDER_ID,project);
-
-	}
-	
-	/**
-	 * @param project
-	 * @return
-	 */
-	private URIConverter createURIConverter(IProject aProject, ProjectResourceSet aResourceSet ) {
-		ComponentCoreURIConverter uriConverter = new ComponentCoreURIConverter(aProject, aResourceSet.getSynchronizer()); 
-		uriConverter.addInputContainer(getProject());
-		return uriConverter;
-	}
-	
-
-	/**
-	 * <p>
-	 * This method should not be invoked by clients.
-	 * </p>
-	 */
-	public ResourceSet getResourceSet() {
-		return getEmfContextBase().getResourceSet();
-	}
-
-	/**
-	 * <p>
-	 * This method should not be invoked by clients.
-	 * </p>
-	 * 
-	 * @see org.eclipse.jem.util.emf.workbench.IEMFContextContributor#secondaryContributeToContext(org.eclipse.jem.util.emf.workbench.EMFWorkbenchContextBase)
-	 */
-	public void secondaryContributeToContext(EMFWorkbenchContextBase aNature) {
-		//Default
-	}
-
-	/**
-	 * <p>
-	 * This method should not be invoked by clients.
-	 * </p>
-	 * 
-	 * @see org.eclipse.jem.util.emf.workbench.nature.EMFNature#configure()
-	 */
-	public void configure() throws CoreException {
-		super.configure();
-		
-	}
-
-	private void cacheModuleStructuralModel() {
-		if (cachedModel == null)
-			cachedModel = getModuleStructuralModelForRead(this);
-	}
-
-	protected String getPluginID() {
-		return MODULE_PLUG_IN_ID;
-	}
-
-	public EditModel getExistingEditModel(String artifactEditModelId,Map params, boolean isReadOnly) {
-		return getEmfContext().getExistingEditModel(artifactEditModelId,params,isReadOnly);
-	}
-
-	public void shutdown() {
-		super.shutdown();
-		if (cachedModel != null) {
-			cachedModel.dispose();
-			cachedModel = null;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.internal.emfworkbench.ISynchronizerExtender#projectChanged(org.eclipse.core.resources.IResourceDelta)
-	 */
-	public void projectChanged(IResourceDelta delta) {
-		if (delta.getKind() == IResourceDelta.OPEN)
-			if (cachedModel == null)
-				cachedModel = getModuleStructuralModelForRead(this);
-	
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.internal.emfworkbench.ISynchronizerExtender#projectClosed()
-	 */
-	public void projectClosed() {
-		this.emfContext = null;
-		if (cachedModel != null) {
-			cachedModel.dispose();
-			cachedModel = null;
-		}
-	}
-
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/UnresolveableURIException.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/UnresolveableURIException.java
deleted file mode 100644
index 3957c00..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/UnresolveableURIException.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore;
-
-import org.eclipse.emf.common.util.URI;
-
-/**
- * <p>
- * Thrown whenever a URI cannot be appropriately resolved.
- * </p>
- *  
- * @plannedfor 1.0
- */
-public class UnresolveableURIException extends Exception {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-
-	public UnresolveableURIException(URI anUnresolveableURI) {
-		super("Could not resolve: " + anUnresolveableURI);
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/FacetDataModelConfigAdapter.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/FacetDataModelConfigAdapter.java
deleted file mode 100644
index 705a702..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/FacetDataModelConfigAdapter.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/******************************************************************************
- * Copyright (c) 2005 BEA Systems, Inc.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Konstantin Komissarchik - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.wst.common.componentcore.datamodel;
-
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.project.facet.core.IActionConfig;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-
-/**
- * @author <a href="mailto:kosta@bea.com">Konstantin Komissarchik</a>
- */
-
-public final class FacetDataModelConfigAdapter
-
-    implements IActionConfig
-    
-{
-    private final IDataModel dm;
-    
-    public FacetDataModelConfigAdapter( final IDataModel dm )
-    {
-        this.dm = dm;
-    }
-    
-    public void setVersion( final IProjectFacetVersion fv )
-    {
-        dm.setProperty( IFacetDataModelProperties.FACET_VERSION, fv );
-    }
-
-    public void setProjectName( final String pjname )
-    {
-        dm.setStringProperty( IFacetDataModelProperties.FACET_PROJECT_NAME, pjname );
-    }
-
-    public IStatus validate()
-    {
-        return Status.OK_STATUS;
-    }
-
-    public static final class Factory
-    
-        implements IAdapterFactory
-        
-    {
-        private static final Class[] ADAPTER_TYPES
-            = { IActionConfig.class };
-        
-        public Object getAdapter( final Object adaptable, 
-                                  final Class adapterType )
-        {
-            if( adapterType == IActionConfig.class )
-            {
-                return new FacetDataModelConfigAdapter( (IDataModel) adaptable );
-            }
-            else
-            {
-                return null;
-            }
-        }
-
-        public Class[] getAdapterList()
-        {
-            return ADAPTER_TYPES;
-        }
-    }
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/FacetDataModelProvider.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/FacetDataModelProvider.java
deleted file mode 100644
index 4cc5a6a..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/FacetDataModelProvider.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.datamodel;
-
-import java.util.Set;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
-import org.eclipse.wst.common.componentcore.internal.operation.FacetDataModelOperation;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelProvider;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ExtendableOperationImpl;
-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.common.project.facet.core.IFacetedProject.Action.Type;
-
-public class FacetDataModelProvider extends AbstractDataModelProvider implements IFacetDataModelProperties {
-
-	public static final String NOTIFICATION_OPERATION = "FacetDataModelProvider.NOTIFICATION_OPERATION"; //$NON-NLS-1$
-
-	public Set getPropertyNames() {
-		Set names = super.getPropertyNames();
-		names.add(FACET_PROJECT_NAME);
-		names.add(FACET_ID);
-		names.add(FACET_VERSION_STR);
-		names.add(FACET_TYPE);
-		names.add(FACET_VERSION);
-		names.add(FACET_ACTION);
-		names.add(SHOULD_EXECUTE);
-		names.add(NOTIFICATION_OPERATION);
-		return names;
-	}
-
-	public Object getDefaultProperty(String propertyName) {
-		if (FACET_VERSION.equals(propertyName)) {
-			return ProjectFacetsManager.getProjectFacet(getStringProperty(FACET_ID)).getVersion(getStringProperty(FACET_VERSION_STR));
-		} else if (FACET_ACTION.equals(propertyName)) {
-			return new IFacetedProject.Action((Type) model.getProperty(FACET_TYPE), (IProjectFacetVersion) model.getProperty(FACET_VERSION), model);
-		} else if (SHOULD_EXECUTE.equals(propertyName)) {
-			return Boolean.TRUE;
-		} else if (NOTIFICATION_OPERATION.equals(propertyName)) {
-			return getFacetNotificationOperation();
-		}
-		return super.getDefaultProperty(propertyName);
-	}
-
-	public boolean propertySet(String propertyName, Object propertyValue) {
-		if (FACET_ACTION.equals(propertyName)) {
-			throw new RuntimeException();
-		}
-		return super.propertySet(propertyName, propertyValue);
-	}
-
-	public final IDataModelOperation getDefaultOperation() {
-		return new FacetDataModelOperation(model);
-	}
-
-	protected IDataModelOperation getFacetNotificationOperation() {
-		return new ExtendableOperationImpl(new AbstractDataModelOperation(this.model) {
-			public String getID() {
-				return "FacetDataModelProvider.Notification." + model.getProperty(FACET_TYPE) + "." + model.getStringProperty(FACET_ID); //$NON-NLS-1$//$NON-NLS-2$ 
-			}
-
-			public org.eclipse.core.runtime.IStatus execute(IProgressMonitor monitor, org.eclipse.core.runtime.IAdaptable info) throws ExecutionException {
-				return AbstractDataModelProvider.OK_STATUS;
-			}
-		});
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/FacetInstallDataModelProvider.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/FacetInstallDataModelProvider.java
deleted file mode 100644
index cb2ab1d..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/FacetInstallDataModelProvider.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.datamodel;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelPropertyDescriptor;
-import org.eclipse.wst.common.project.facet.core.IActionConfigFactory;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-
-public class FacetInstallDataModelProvider extends FacetDataModelProvider implements IActionConfigFactory {
-
-	public static final String MASTER_PROJECT_DM = "FacetInstallDataModelProvider.MASTER_PROJECT_DM"; //$NON-NLS-1$
-	
-	public Set getPropertyNames() {
-		Set names = super.getPropertyNames();
-		names.add(MASTER_PROJECT_DM);
-		return names;
-	}
-	
-	public FacetInstallDataModelProvider() {
-		super();
-	}
-
-	public Object getDefaultProperty(String propertyName) {
-		if (FACET_TYPE.equals(propertyName)) {
-			return FACET_TYPE_INSTALL;
-		} else if (FACET_VERSION_STR.equals(propertyName)) {
-			IProjectFacetVersion version = (IProjectFacetVersion) getProperty(FACET_VERSION);
-			return version.getVersionString();
-		} else if (FACET_VERSION.equals(propertyName)) {
-			DataModelPropertyDescriptor[] validVersions = getValidPropertyDescriptors(FACET_VERSION);
-			return validVersions[validVersions.length - 1].getPropertyValue();
-		}
-		return super.getDefaultProperty(propertyName);
-	}
-
-	public boolean propertySet(String propertyName, Object propertyValue) {
-		if (FACET_TYPE.equals(propertyName)) {
-			throw new RuntimeException();
-		} else if (FACET_VERSION_STR.equals(propertyName)) {
-			DataModelPropertyDescriptor[] descriptors = getValidPropertyDescriptors(FACET_VERSION);
-			for (int i = 0; i < descriptors.length; i++) {
-				if (descriptors[i].getPropertyDescription().equals(propertyValue)) {
-					setProperty(FACET_VERSION, descriptors[i].getPropertyValue());
-					break;
-				}
-			}
-		} else if (null != propertyValue && FACET_VERSION.equals(propertyName)) {
-			IProjectFacetVersion version = (IProjectFacetVersion) propertyValue;
-			setProperty(FACET_VERSION_STR, version.getVersionString());
-		}
-		return super.propertySet(propertyName, propertyValue);
-	}
-
-	protected DataModelPropertyDescriptor[] cachedVersionDescriptors;
-	protected DataModelPropertyDescriptor[] cachedVersionStringDescriptors;
-
-	public DataModelPropertyDescriptor[] getValidPropertyDescriptors(String propertyName) {
-		if (FACET_VERSION.equals(propertyName)) {
-			if (null == cachedVersionDescriptors) {
-				Set versions = ProjectFacetsManager.getProjectFacet(getStringProperty(FACET_ID)).getVersions();
-				List list = Collections.list(Collections.enumeration(versions));
-				Collections.sort(list, new Comparator(){
-					public int compare(Object o1, Object o2) {
-						return ((IProjectFacetVersion)o1).getVersionString().compareTo(((IProjectFacetVersion)o2).getVersionString());
-					}
-				});
-				
-				cachedVersionDescriptors = new DataModelPropertyDescriptor[list.size()];
-				Iterator iterator = list.iterator();
-				for (int i = 0; i < cachedVersionDescriptors.length; i++) {
-					IProjectFacetVersion version = (IProjectFacetVersion) iterator.next();
-					cachedVersionDescriptors[i] = new DataModelPropertyDescriptor(version, version.getVersionString());
-				}
-			}
-			return cachedVersionDescriptors;
-		}
-		if (FACET_VERSION_STR.equals(propertyName)) {
-			if (null == cachedVersionStringDescriptors) {
-				DataModelPropertyDescriptor[] versionDescriptors = getValidPropertyDescriptors(FACET_VERSION);
-				cachedVersionStringDescriptors = new DataModelPropertyDescriptor[versionDescriptors.length];
-				for (int i = 0; i < cachedVersionStringDescriptors.length; i++) {
-					cachedVersionStringDescriptors[i] = new DataModelPropertyDescriptor(versionDescriptors[i].getPropertyDescription());
-				}
-			}
-			return cachedVersionStringDescriptors;
-		}
-		return super.getValidPropertyDescriptors(propertyName);
-	}
-
-	public Object create() {
-		return DataModelFactory.createDataModel(this);
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/FacetProjectCreationDataModelProvider.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/FacetProjectCreationDataModelProvider.java
deleted file mode 100644
index 2d350b0..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/FacetProjectCreationDataModelProvider.java
+++ /dev/null
@@ -1,333 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.datamodel;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
-import org.eclipse.wst.common.componentcore.internal.operation.FacetProjectCreationOperation;
-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.DataModelPropertyDescriptor;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelListener;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
-import org.eclipse.wst.common.frameworks.internal.operations.IProjectCreationPropertiesNew;
-import org.eclipse.wst.common.frameworks.internal.operations.ProjectCreationDataModelProviderNew;
-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.project.facet.core.IFacetedProject.Action;
-import org.eclipse.wst.common.project.facet.core.runtime.IRuntime;
-import org.eclipse.wst.common.project.facet.core.runtime.RuntimeManager;
-
-public class FacetProjectCreationDataModelProvider extends AbstractDataModelProvider implements IFacetProjectCreationDataModelProperties {
-
-	public FacetProjectCreationDataModelProvider() {
-		super();
-	}
-
-	public Set getPropertyNames() {
-		Set names = super.getPropertyNames();
-		names.add(FACET_PROJECT_NAME);
-		names.add(FACET_DM_MAP);
-		names.add(FACET_ACTION_MAP);
-		names.add(FACET_RUNTIME);
-		return names;
-	}
-
-	public void init() {
-		super.init();
-		IDataModel projectDataModel = DataModelFactory.createDataModel(new ProjectCreationDataModelProviderNew());
-		projectDataModel.addListener(new IDataModelListener() {
-			public void propertyChanged(DataModelEvent event) {
-				if (IProjectCreationPropertiesNew.PROJECT_NAME.equals(event.getPropertyName())) {
-					getDataModel().setProperty(FACET_PROJECT_NAME, event.getProperty());
-				}
-			}
-		});
-		model.addNestedModel(NESTED_PROJECT_DM, projectDataModel);
-	}
-
-	protected class FacetActionMapImpl extends HashMap implements FacetActionMap {
-		private static final long serialVersionUID = 1L;
-		private boolean supressNotification = false;
-
-		public void add(Action action) {
-			put(action.getProjectFacetVersion().getProjectFacet().getId(), action);
-		}
-
-		public Action getAction(String facetID) {
-			return (Action) get(facetID);
-		}
-
-		public void clear() {
-			try {
-				supressNotification = true;
-				super.clear();
-			} finally {
-				supressNotification = false;
-				getDataModel().notifyPropertyChange(FACET_ACTION_MAP, IDataModel.VALUE_CHG);
-			}
-		}
-
-		public Object remove(Object key) {
-			try {
-				return super.remove(key);
-			} finally {
-				if (!supressNotification) {
-					getDataModel().notifyPropertyChange(FACET_ACTION_MAP, IDataModel.VALUE_CHG);
-				}
-			}
-		}
-
-		public Object put(Object key, Object value) {
-			try {
-				return super.put(key, value);
-			} finally {
-				if (!supressNotification) {
-					getDataModel().notifyPropertyChange(FACET_ACTION_MAP, IDataModel.VALUE_CHG);
-				}
-			}
-		}
-
-		public void putAll(Map m) {
-			try {
-				supressNotification = true;
-				super.putAll(m);
-			} finally {
-				supressNotification = false;
-				getDataModel().notifyPropertyChange(FACET_ACTION_MAP, IDataModel.VALUE_CHG);
-			}
-		}
-	}
-
-	protected class FacetDataModelMapImpl extends HashMap implements FacetDataModelMap, IDataModelListener {
-		private static final long serialVersionUID = 1L;
-		private boolean supressNotification = false;
-
-		public void add(IDataModel facetDataModel) {
-			put(facetDataModel.getProperty(IFacetDataModelProperties.FACET_ID), facetDataModel);
-		}
-
-		public IDataModel getFacetDataModel(String facetID) {
-			return (IDataModel) get(facetID);
-		}
-
-		public void clear() {
-			try {
-				supressNotification = true;
-				for (Iterator iterator = values().iterator(); iterator.hasNext();) {
-					((IDataModel) iterator.next()).removeListener(this);
-				}
-				super.clear();
-			} finally {
-				supressNotification = false;
-				getDataModel().notifyPropertyChange(FACET_DM_MAP, IDataModel.VALUE_CHG);
-			}
-		}
-
-		public Object put(Object key, Object value) {
-			try {
-				IDataModel dm = (IDataModel) value;
-				Object lastValue = super.put(key, value);
-				if (lastValue != null) {
-					((IDataModel) lastValue).removeListener(this);
-					((IDataModel) lastValue).setProperty(FacetInstallDataModelProvider.MASTER_PROJECT_DM, null);
-				}
-				dm.setProperty(FACET_PROJECT_NAME, getDataModel().getProperty(FACET_PROJECT_NAME));
-				dm.setProperty(FacetInstallDataModelProvider.MASTER_PROJECT_DM, FacetProjectCreationDataModelProvider.this.model);
-				dm.addListener(this);
-				return lastValue;
-			} finally {
-				if (!supressNotification) {
-					getDataModel().notifyPropertyChange(FACET_DM_MAP, IDataModel.VALUE_CHG);
-				}
-			}
-		}
-
-		public void putAll(Map m) {
-			try {
-				supressNotification = true;
-				super.putAll(m);
-			} finally {
-				supressNotification = false;
-				getDataModel().notifyPropertyChange(FACET_DM_MAP, IDataModel.VALUE_CHG);
-			}
-		}
-
-		public Object remove(Object key) {
-			try {
-				IDataModel dm = (IDataModel) super.remove(key);
-				dm.removeListener(this);
-				return dm;
-			} finally {
-				if (!supressNotification) {
-					getDataModel().notifyPropertyChange(FACET_DM_MAP, IDataModel.VALUE_CHG);
-				}
-			}
-		}
-
-		public void propertyChanged(DataModelEvent event) {
-			if (event.getPropertyName().equals(FACET_PROJECT_NAME)) {
-				if (containsValue(event.getDataModel())) {
-					getDataModel().setProperty(FACET_PROJECT_NAME, event.getProperty());
-				} else {
-					event.getDataModel().removeListener(this);
-				}
-			} else if (event.getPropertyName().equals(FACET_RUNTIME)) {
-				if (containsValue(event.getDataModel())) {
-					getDataModel().setProperty(FACET_RUNTIME, event.getProperty());
-				} else {
-					event.getDataModel().removeListener(this);
-				}
-			} else if (event.getPropertyName().equals(IFacetDataModelProperties.FACET_VERSION)) {
-				getDataModel().notifyPropertyChange(FACET_RUNTIME, IDataModel.VALID_VALUES_CHG);
-			}
-		}
-
-	}
-
-	public boolean propertySet(String propertyName, Object propertyValue) {
-		if (FACET_PROJECT_NAME.equals(propertyName)) {
-			for (Iterator iterator = ((Map) getDataModel().getProperty(FACET_DM_MAP)).values().iterator(); iterator.hasNext();) {
-				((IDataModel) iterator.next()).setProperty(FACET_PROJECT_NAME, propertyValue);
-			}
-			IDataModel projModel = model.getNestedModel(NESTED_PROJECT_DM);
-			projModel.setProperty(IProjectCreationPropertiesNew.PROJECT_NAME, propertyValue);
-		} else if (FACET_RUNTIME.equals(propertyName)) {
-			IRuntime runtime = (IRuntime) propertyValue;
-			for (Iterator iterator = ((Map) getDataModel().getProperty(FACET_DM_MAP)).values().iterator(); iterator.hasNext();) {
-				IDataModel dm = (IDataModel) iterator.next();
-				if (dm.isProperty(FACET_RUNTIME)) {
-					dm.setProperty(FACET_RUNTIME, runtime);
-				}
-			}
-			if (runtime != null) {
-				Map facetDMs = (Map) getProperty(FACET_DM_MAP);
-
-				for (Iterator iterator = facetDMs.values().iterator(); iterator.hasNext();) {
-					IDataModel facetDataModel = (IDataModel) iterator.next();
-					IProjectFacet facet = ProjectFacetsManager.getProjectFacet((String) facetDataModel.getProperty(IFacetDataModelProperties.FACET_ID));
-
-					try {
-						IDataModel facetModel = ((FacetDataModelMap) facetDMs).getFacetDataModel(facet.getId());
-						IProjectFacetVersion oldVersion = (IProjectFacetVersion) facetModel.getProperty(IFacetDataModelProperties.FACET_VERSION);
-						IProjectFacetVersion newVersion = facet.getLatestSupportedVersion(runtime);
-						if (newVersion != null && (oldVersion == null || oldVersion.getVersionString().compareTo(newVersion.getVersionString()) > 0)) {
-							facetModel.setProperty(IFacetDataModelProperties.FACET_VERSION, newVersion);
-						}
-
-					} catch (CoreException e) {
-						Logger.getLogger().logError(e);
-					}
-				}
-			}
-		}
-		return super.propertySet(propertyName, propertyValue);
-	}
-
-	public Object getDefaultProperty(String propertyName) {
-		if (FACET_DM_MAP.equals(propertyName)) {
-			Object obj = new FacetDataModelMapImpl();
-			setProperty(FACET_DM_MAP, obj);
-			return obj;
-		} else if (FACET_ACTION_MAP.equals(propertyName)) {
-			Object obj = new FacetActionMapImpl();
-			setProperty(FACET_ACTION_MAP, obj);
-			return obj;
-		}
-		return super.getDefaultProperty(propertyName);
-	}
-
-	public DataModelPropertyDescriptor getPropertyDescriptor(String propertyName) {
-		if (FACET_RUNTIME.equals(propertyName)) {
-			IRuntime runtime = (IRuntime) getProperty(propertyName);
-			if (null != runtime) {
-				return new DataModelPropertyDescriptor(runtime, runtime.getName());
-			}
-		}
-		return super.getPropertyDescriptor(propertyName);
-	}
-
-	public DataModelPropertyDescriptor[] getValidPropertyDescriptors(String propertyName) {
-		if (FACET_RUNTIME.equals(propertyName)) {
-			Set projectFacets = new HashSet();
-			Map facetDMs = (Map) getProperty(FACET_DM_MAP);
-			for (Iterator iterator = facetDMs.values().iterator(); iterator.hasNext();) {
-				IDataModel facetDataModel = (IDataModel) iterator.next();
-				if (facetDataModel.getBooleanProperty(IFacetDataModelProperties.SHOULD_EXECUTE)) {
-					IProjectFacet facet = ProjectFacetsManager.getProjectFacet((String) facetDataModel.getProperty(IFacetDataModelProperties.FACET_ID));
-					projectFacets.add(facet);
-				}
-			}
-			Map facetActions = (Map)getProperty(FACET_ACTION_MAP);
-			for(Iterator iterator = facetActions.values().iterator(); iterator.hasNext();){
-				IFacetedProject.Action action = (IFacetedProject.Action) iterator.next();
-				projectFacets.add(action.getProjectFacetVersion().getProjectFacet());
-			}
-			
-			Set runtimes = RuntimeManager.getRuntimes();
-			ArrayList list = new ArrayList();
-
-			for (Iterator it = runtimes.iterator(); it.hasNext();) {
-				IRuntime rt = (IRuntime) it.next();
-
-				// add this runtime in the list only if this runtime supports all of the facets
-				// in the project
-
-				boolean supportsFactet = true;
-				for (Iterator facetIt = projectFacets.iterator(); facetIt.hasNext();) {
-					IProjectFacet facet = (IProjectFacet) facetIt.next();
-					if (!rt.supports(facet)) {
-						supportsFactet = false;
-					}
-				}
-				if (supportsFactet) {
-					list.add(rt);
-				}
-			}
-
-			DataModelPropertyDescriptor[] descriptors = new DataModelPropertyDescriptor[list.size() + 1];
-			Iterator iterator = list.iterator();
-			for (int i = 0; i < descriptors.length -1; i++) {
-				IRuntime runtime = (IRuntime) iterator.next();
-				descriptors[i] = new DataModelPropertyDescriptor(runtime, runtime.getName());
-			}
-			descriptors[descriptors.length -1] = new DataModelPropertyDescriptor(null, "");
-			return descriptors;
-		}
-		return super.getValidPropertyDescriptors(propertyName);
-	}
-
-	public IStatus validate(String propertyName) {
-		if (FACET_PROJECT_NAME.equals(propertyName)) {
-			return validate(IProjectCreationPropertiesNew.PROJECT_NAME);
-		}
-		return super.validate(propertyName);
-	}
-
-	public IDataModelOperation getDefaultOperation() {
-		return new FacetProjectCreationOperation(model);
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/FlexibleProjectCreationDataModelProvider.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/FlexibleProjectCreationDataModelProvider.java
deleted file mode 100644
index b3d1bc5..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/FlexibleProjectCreationDataModelProvider.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.datamodel;
-
-import java.util.Set;
-
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IFlexibleProjectCreationDataModelProperties;
-import org.eclipse.wst.common.componentcore.internal.operation.FlexibleProjectCreationOperation;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelProvider;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
-import org.eclipse.wst.common.frameworks.internal.operations.IProjectCreationProperties;
-import org.eclipse.wst.common.frameworks.internal.operations.ProjectCreationDataModelProvider;
-
-public class FlexibleProjectCreationDataModelProvider extends AbstractDataModelProvider implements IFlexibleProjectCreationDataModelProperties {
-
-	public FlexibleProjectCreationDataModelProvider() {
-		super();
-
-	}
-
-	public void init() {
-		super.init();
-		initNestedProjectModel();
-	}
-
-	protected void initNestedProjectModel() {
-		IDataModel projModel = DataModelFactory.createDataModel(new ProjectCreationDataModelProvider());
-		model.addNestedModel(NESTED_MODEL_PROJECT_CREATION, projModel);
-	}
-
-	public Set getPropertyNames() {
-		Set propertyNames = super.getPropertyNames();
-		propertyNames.add(PROJECT_NAME);
-		propertyNames.add(PROJECT_LOCATION);
-		propertyNames.add(NESTED_MODEL_PROJECT_CREATION);
-		return propertyNames;
-	}
-
-	public Object getDefaultProperty(String propertyName) {
-		if (PROJECT_LOCATION.equals(propertyName)) {
-			return getDefaultLocation();
-		}
-		return super.getDefaultProperty(propertyName);
-	}
-
-	public boolean propertySet(String propertyName, Object propertyValue) {
-		boolean status = super.propertySet(propertyName, propertyValue);
-		if (PROJECT_NAME.equals(propertyName)) {
-			IDataModel projModel = model.getNestedModel(NESTED_MODEL_PROJECT_CREATION);
-			projModel.setProperty(IProjectCreationProperties.PROJECT_NAME, propertyValue);
-		} else if (PROJECT_LOCATION.equals(propertyName)) {
-			IDataModel projModel = model.getNestedModel(NESTED_MODEL_PROJECT_CREATION);
-			projModel.setProperty(IProjectCreationProperties.PROJECT_LOCATION, propertyValue);
-		}
-		return status;
-	}
-
-	public IStatus validate(String propertyName) {
-		if (PROJECT_NAME.equals(propertyName)) {
-			return validateProjectName();
-		} else if (PROJECT_LOCATION.equals(propertyName)) {
-			return validateProjectLocation();
-		}
-		return OK_STATUS;
-	}
-
-	private IStatus validateProjectName() {
-		IDataModel projModel = model.getNestedModel(NESTED_MODEL_PROJECT_CREATION);
-		return projModel.validateProperty(IProjectCreationProperties.PROJECT_NAME);
-	}
-
-	private IStatus validateProjectLocation() {
-		IDataModel projModel = model.getNestedModel(NESTED_MODEL_PROJECT_CREATION);
-		return projModel.validateProperty(IProjectCreationProperties.PROJECT_LOCATION);
-	}
-
-	private String getDefaultLocation() {
-		IPath path = getRootLocation();
-		String projectName = (String) getProperty(PROJECT_NAME);
-		if (projectName != null)
-			path = path.append(projectName);
-		return path.toOSString();
-	}
-
-	private IPath getRootLocation() {
-		return ResourcesPlugin.getWorkspace().getRoot().getLocation();
-	}
-
-	//	
-	// protected void initNestedModels() {
-	// super.initNestedModels();
-	// initProjectModel();
-	// addNestedModel(NESTED_MODEL_PROJECT_CREATION, projectDataModel);
-	//
-	// serverTargetDataModel = new J2EEProjectServerTargetDataModel();
-	// addNestedModel(NESTED_MODEL_SERVER_TARGET, serverTargetDataModel);
-	// }
-
-	// protected void initProjectModel() {
-	// projectDataModel = new ProjectCreationDataModel();
-	// }
-	//	
-	public IDataModelOperation getDefaultOperation() {
-		return new FlexibleProjectCreationOperation(model);
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/ProjectMigratorDataModelProvider.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/ProjectMigratorDataModelProvider.java
deleted file mode 100644
index 21c3ca3..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/ProjectMigratorDataModelProvider.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.datamodel;
-
-import java.util.Set;
-
-import org.eclipse.wst.common.componentcore.datamodel.properties.IProjectMigratorDataModelProperties;
-import org.eclipse.wst.common.componentcore.internal.operation.ProjectMigratorDataModelOperation;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelProvider;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
-
-public class ProjectMigratorDataModelProvider extends AbstractDataModelProvider implements IProjectMigratorDataModelProperties {
-
-	public Set getPropertyNames() {
-		Set names = super.getPropertyNames();
-		names.add(PROJECT_NAME);
-		return names;
-	}
-
-	public final IDataModelOperation getDefaultOperation() {
-		return new ProjectMigratorDataModelOperation(model);
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IComponentCreationDataModelProperties.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IComponentCreationDataModelProperties.java
deleted file mode 100644
index 4bb516b..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IComponentCreationDataModelProperties.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.datamodel.properties;
-
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelProperties;
-
-/**
- * <p>
- * IComponentCreationDataModelProperties provides properties to the DataModel associated with the
- * ComponentCreationDataModelProvider as well as all extending interfaces extending
- * IComponentCreationDataModelProperties specifically, but not limited to all J2EE component related
- * creation.
- * 
- * @see org.eclipse.wst.common.componentcore.internal.operation.ComponentCreationDataModelProvider
- *      </p>
- *      <p>
- *      This interface is not intended to be implemented by clients.
- *      </p>
- * 
- * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider
- * @see org.eclipse.wst.common.frameworks.datamodel.DataModelFactory
- * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProperties
- * 
- * @plannedfor 1.0
- */
-public interface IComponentCreationDataModelProperties extends IDataModelProperties {
-
-	/**
-	 * Required, type String. The user defined name of the target project for the component to be
-	 * created.
-	 */
-	public static final String PROJECT_NAME = "IComponentCreationDataModelProperties.PROJECT_NAME"; //$NON-NLS-1$
-	/**
-	 * Required, type String. The user defined name of the component to be created.
-	 */
-	public static final String COMPONENT_NAME = "IComponentCreationDataModelProperties.COMPONENT_NAME"; //$NON-NLS-1$
-	/**
-	 * Required, type String. The user defined location on disk of the target project for the
-	 * component to be created. Defaulted to default eclipse workspace location
-	 */
-	public static final String LOCATION = "IFlexibleProjectCreationDataModelProperties.LOCATION"; //$NON-NLS-1$
-
-
-	/**
-	 * Required, type String. The user defined deploy name of the component to be created. The
-	 * DataModelProvider will default the name to the COMPONENT_NAME.
-	 */
-	public static final String COMPONENT_DEPLOY_NAME = "IComponentCreationDataModelProperties.COMPONENT_DEPLOY_NAME"; //$NON-NLS-1$
-	/**
-	 * Required, type String. Nested operation to create a new project.
-	 */
-	public static final String NESTED_PROJECT_CREATION_DM = "IComponentCreationDataModelProperties.NESTED_PROJECT_CREATION_DM"; //$NON-NLS-1$
-	// TODO delete this
-	/**
-	 * Optional, type Boolean The default value is <code>Boolean.TRUE</code>. If this property is
-	 * set to <code>Boolean.TRUE</code> then a default deployment descriptor and supporting
-	 * bindings files will be generated.
-	 */
-	public static final String CREATE_DEFAULT_FILES = "IComponentCreationDataModelProperties.CREATE_DEFAULT_FILES"; //$NON-NLS-1$
-
-	/**
-	 * An unsettable result property used to retreive the created virtual component after the
-	 * operation has executed.
-	 */
-	public static final String COMPONENT = "IComponentCreationDataModelProperties.COMPONENT"; //$NON-NLS-1$
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/ICreateReferenceComponentsDataModelProperties.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/ICreateReferenceComponentsDataModelProperties.java
deleted file mode 100644
index 78f3cb2..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/ICreateReferenceComponentsDataModelProperties.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.datamodel.properties;
-
-public interface ICreateReferenceComponentsDataModelProperties {
-	
-    /**
-     * Required, type IVirtualComponent
-     */	
-	public static final String SOURCE_COMPONENT = "ICreateReferenceComponentsDataModelProperties.SOURCE_COMPONENT";
-	
-    /**
-     * Required, type ArrayList, ArrayList  should contain list of IVirtualComponent
-     */
-	public static final String TARGET_COMPONENT_LIST = "ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT"; //$NON-NLS-1$
-	
-	/**
-     * Optional, deploy path for the dependent component, default is "/"
-     */
-	public static final String TARGET_COMPONENTS_DEPLOY_PATH = "ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_DEPLOY_PATH"; //$NON-NLS-1$
-	
-	
-	
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IFacetDataModelProperties.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IFacetDataModelProperties.java
deleted file mode 100644
index b775f39..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IFacetDataModelProperties.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.datamodel.properties;
-
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelProperties;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject.Action;
-
-public interface IFacetDataModelProperties extends IDataModelProperties {
-
-	public static final Object FACET_TYPE_INSTALL = Action.Type.INSTALL;
-	public static final Object FACET_TYPE_UNINSTALL = Action.Type.UNINSTALL;
-	public static final Object FACET_TYPE_VERSION_CHANGE = Action.Type.VERSION_CHANGE;
-
-	public static final String FACET_PROJECT_NAME = "IFacetDataModelPropeties.FACET_PROJECT_NAME"; //$NON-NLS-1$
-
-	public static final String FACET_TYPE = "IFacetDataModelPropeties.FACET_TYPE"; //$NON-NLS-1$
-
-	public static final String FACET_ID = "IFacetDataModelPropeties.FACET_ID"; //$NON-NLS-1$
-
-	public static final String FACET_VERSION_STR = "IFacetDataModelPropeties.FACET_VERSION_STR"; //$NON-NLS-1$
-
-	/**
-	 * an IProjectFacetVersion
-	 */
-	public static final String FACET_VERSION = "IFacetDataModelPropeties.FACET_VERSION"; //$NON-NLS-1$
-	
-	/**
-	 * an IFacetedProject.Action
-	 */
-	public static final String FACET_ACTION = "IFacetDataModelProperties.FACET_ACTION"; //$NON-NLS-1$
-
-	public static final String SHOULD_EXECUTE = "IFacetDataModelProperties.SHOULD_EXECUTE"; //$NON-NLS-1$
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IFacetInstallDataModelProperties.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IFacetInstallDataModelProperties.java
deleted file mode 100644
index 1ae3fa7..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IFacetInstallDataModelProperties.java
+++ /dev/null
@@ -1,15 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.datamodel.properties;
-
-public interface IFacetInstallDataModelProperties extends IFacetDataModelProperties {
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IFacetProjectCreationDataModelProperties.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IFacetProjectCreationDataModelProperties.java
deleted file mode 100644
index c92d8c6..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IFacetProjectCreationDataModelProperties.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.datamodel.properties;
-
-import java.util.Map;
-
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelProperties;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject;
-
-public interface IFacetProjectCreationDataModelProperties extends IDataModelProperties {
-
-	/**
-	 * A String
-	 */
-	public static final String FACET_PROJECT_NAME = IFacetDataModelProperties.FACET_PROJECT_NAME;
-
-	/**
-	 * A Nested IDataModel of type IProjectCreationDataModelProperties
-	 */
-	public static final String NESTED_PROJECT_DM = "IFacetProjectCreationDataModelProperties.NESTED_PROJECT_DM"; //$NON-NLS-1$";
-
-	/**
-	 * An instanceof FacetDataModelMap.
-	 */
-	public static final String FACET_DM_MAP = "IFacetProjectCreationDataModelProperties.FACET_DM_MAP"; //$NON-NLS-1$
-
-	/**
-	 * An instance of FacetActionMap
-	 */
-	public static final String FACET_ACTION_MAP = "IFacetProjectCreationDataModelProperties.FACET_ACTION_MAP"; //$NON-NLS-1$
-
-	
-	/**
-	 * An instanceof of IRuntime
-	 */
-	public static final String FACET_RUNTIME = "IFacetProjectCreationDataModelProperties.FACET_RUNTIME"; //$NON-NLS-1$
-
-	
-	/**
-	 * This map is used for tracking individual IDataModels implementing IFacetDataModelProperties.
-	 * The facet ids are the keys for retieving the specific IFacetataModelProperties IDataModels
-	 */
-	public interface FacetDataModelMap extends Map {
-		public void add(IDataModel facetDataModel);
-		public IDataModel getFacetDataModel(String facetID);
-	}
-
-	/**
-	 * This map is used for tracing indivdual IFacetedProject.Actions for facets that either do not
-	 * have any config data, or facets whose config data is not an IDataModel.
-	 */
-	public interface FacetActionMap extends Map {
-		public void add(IFacetedProject.Action action);
-		public IFacetedProject.Action getAction(String facetID);
-	}
-	
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IFlexibleProjectCreationDataModelProperties.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IFlexibleProjectCreationDataModelProperties.java
deleted file mode 100644
index 6a9a06d..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IFlexibleProjectCreationDataModelProperties.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.datamodel.properties;
-
-import org.eclipse.wst.common.frameworks.internal.operations.IProjectCreationProperties;
-/**
- * <p>
- * IFlexibleProjectCreationDataModelProperties provides properties to the DataModel associated with the 
- * FlexibleProjectCreationDataModelProperties as well as all extending interfaces extending 
- * IFlexibleProjectCreationDataModelProperties specifically, but not limited to the Java releated creatoin in the 
- * JST layer. 
- * @see FlexibleJavaProjectCreationDataModelProvider
- * </p>
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * 
- * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider
- * @see org.eclipse.wst.common.frameworks.datamodel.DataModelFactory
- * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProperties
- * 
- * @plannedfor 1.0
- */
-public interface IFlexibleProjectCreationDataModelProperties extends IProjectCreationProperties {
-   
-    /**
-     * Required, type IDataModel. The user set IDataModel used to create the initial project.  Providers which currently exist for
-     * this IDataModel include IProjectCreationProperties.
-     * @see org.eclipse.wst.common.frameworks.internal.operations.IProjectCreationProperties
-     */
-    public static final String NESTED_MODEL_PROJECT_CREATION = "IFlexibleProjectCreationDataModelProperties.NESTED_MODEL_PROJECT_CREATION"; //$NON-NLS-1$
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IProjectMigratorDataModelProperties.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IProjectMigratorDataModelProperties.java
deleted file mode 100644
index 1e93fff..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IProjectMigratorDataModelProperties.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.datamodel.properties;
-
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelProperties;
-
-public interface IProjectMigratorDataModelProperties extends IDataModelProperties {
-
-
-	public static final String PROJECT_NAME = "IProjectMigratorDataModelProperties.PROJECT_NAME"; //$NON-NLS-1$
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/package.xml b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/package.xml
deleted file mode 100644
index 535937f..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/package.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<html>
-    <head>
-        <meta
-            name="root"
-            content="../../../../../../../" />
-        <title>Component creation and Referenced Component api overview</title>
-    </head>
-
-    <body>  
-		<abstract>
-        This package includes API  for creating components in a Flexible project and 
-        adding referenced components to existing components.(see <a href="ComponentCore.html">ComponentCore</a>). 
-        Clients should also review the <b>org.eclipse.wst.common.componentcore.resources</b>
-        package.
-		</abstract>
-
-	<a href="#top">top</a>
-    </body>
-</html>    
-    
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ArtifactEditModel.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ArtifactEditModel.java
deleted file mode 100644
index 6d8552a..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ArtifactEditModel.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal;
-
-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.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.UnresolveableURIException;
-import org.eclipse.wst.common.componentcore.internal.impl.PlatformURLModuleConnection;
-import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
-import org.eclipse.wst.common.frameworks.internal.enablement.EnablementManager;
-import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
-import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
-import org.eclipse.wst.common.internal.emfworkbench.integration.EditModel;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject;
-import org.eclipse.wst.common.project.facet.core.IFacetedProjectListener;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-
-/**
- * 
- * Provides resource life cycle management between an EditModel and a WTP flexible module pattern.
- * <p>
- * ArtifactEditModel provides a framework for managing a set of EMF resources within a unit of work.
- * Management of these resources includes basic services such as loads, saves, and synchronization
- * for the managed resources. ArtifactEditModels are reference counted so that a single instance can
- * be shared by more than one operation or editor.
- * </p>
- * <p>
- * AritfactEditModel utilizes
- * {@see org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext}&nbsp; to manage the life
- * cycle of an EMF {@see org.eclipse.emf.ecore.resource.Resource}&nbsp; in a given EMF
- * {@see org.eclipse.emf.ecore.resource.ResourceSet}. There is one ArtifactEditModel per
- * {@see org.eclipse.wst.common.modulecore.WorkbenchComponent}&nbsp;in each project.
- * </p>
- * 
- * @see org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext
- * @see org.eclipse.emf.ecore.resource.Resource
- * @see org.eclipse.emf.ecore.resource.ResourceSet
- * @see org.eclipse.wst.common.componentcore.internal.StructureEdit
- * @see org.eclipse.wst.common.componentcore.internal.WorkbenchComponent
- * @see org.eclipse.wst.common.componentcore.internal.ComponentResource
- */
-
-public class ArtifactEditModel extends EditModel implements IAdaptable, IFacetedProjectListener {
-
-	public static final Class ADAPTER_TYPE = ArtifactEditModel.class;
-	private final IProject componentProject; 
-	private final IPath modulePath;
-	private final IVirtualComponent virtualComponent;
-	private final URI componentURI;
-
-	/**
-	 * <p>
-	 * Creates a ArtifactEditModel instance that uses information from the
-	 * <b>org.eclipse.wst.common.emfworkbench.integration.editModelFactory </b> extension point
-	 * associated with anEditModelId attached to the project managed by aContext for a specific
-	 * module referenced by aModuleURI. Resoures that are not recognized as defined Resources via
-	 * the appropriate EditModel extension points will be accessed as read-only.
-	 * </p>
-	 * <p>
-	 * This method is functionally equivalent to:
-	 * </p>
-	 * <p>
-	 * <code>ArtifactEditModel(anEditModelId, aContext, toMakeReadOnly, true, aModuleURI)</code>
-	 * </p>
-	 * 
-	 * @param anEditModelId
-	 *            A unique identifier for the EditModel defined by the appropriate
-	 *            <b>org.eclipse.wst.common.emfworkbench.integration.editModelFactory </b> extension
-	 *            point.
-	 * @param aContext
-	 *            A valid EMFWorkbenchContext which helps manage the lifecycle of EMF resources for
-	 *            a given project.
-	 * @param toMakeReadOnly
-	 *            True indicates that Resources loaded by the EditModel will not allow
-	 *            modifications.
-	 * @param aModuleURI
-	 *            A fully-qualified URI that conforms to the "module:" format.
-	 */
-
-	public ArtifactEditModel(String anEditModelId, EMFWorkbenchContext aContext, boolean toMakeReadOnly, URI aModuleURI) {
-		this(anEditModelId, aContext, toMakeReadOnly, true, aModuleURI);
-	}
-
-	/**
-	 * 
-	 * <p>
-	 * Creates a ArtifactEditModel instance that uses information from the
-	 * <b>org.eclipse.wst.common.emfworkbench.integration.editModelFactory </b> extension point
-	 * associated with anEditModelId attached to the project managed by aContext for a specific
-	 * module referenced by aModuleURI. Resoures that are not recognized as defined
-	 * </p>*
-	 * 
-	 * @param anEditModelId
-	 *            A unique identifier for the EditModel defined by the appropriate
-	 *            <b>org.eclipse.wst.common.emfworkbench.integration.editModelFactory </b> extension
-	 *            point.
-	 * @param aContext
-	 *            A valid EMFWorkbenchContext which helps manage the lifecycle of EMF resources for
-	 *            a given project.
-	 * @param toMakeReadOnly
-	 *            True indicates that Resources loaded by the EditModel will not allow
-	 *            modifications.
-	 * @param toAccessUnknownResourcesAsReadOnly
-	 *            True indicates that Resources not recognized by the EditModel be loaded as
-	 *            read-only - such those loaded via {@see #getResource(URI)}.
-	 * @param aModuleURI
-	 *            A fully-qualified URI that conforms to the "module:" format.
-	 *  
-	 */
-
-	public ArtifactEditModel(String anEditModelId, EMFWorkbenchContext aContext, boolean toMakeReadOnly, boolean toAccessUnknownResourcesAsReadOnly, URI aModuleURI) {
-		super(anEditModelId, aContext, toMakeReadOnly, toAccessUnknownResourcesAsReadOnly);
-		IProject aProject = null;
-		try {
-			aProject = StructureEdit.getContainingProject(aModuleURI);
-			IFacetedProject facetProj;
-			facetProj = ProjectFacetsManager.create(project);
-			if (facetProj != null)
-				facetProj.addListener(this);
-		} catch (UnresolveableURIException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		} catch (CoreException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}finally {
-			componentProject = aProject;
-		}
-		
-		virtualComponent = ComponentCore.createComponent(componentProject);
-		componentURI = aModuleURI;
-		modulePath = new Path(aModuleURI.path());
-		processLoadedResources(componentProject);
-	}
-
-	/**
-	 * <p>
-	 * Accesses resources within the underlying resource set. Takes a standard URI attaches module
-	 * protocol and information. This data can be used to determine if the resource is part of a
-	 * flexible module structure. If the resource does not exist in the resource set it will try and
-	 * load the resource.
-	 * </p>
-	 * 
-	 * @param aUri -
-	 *            location of resource
-	 * 
-	 * @return Resource (@see Resource)
-	 */
-	public Resource getResource(URI aUri) {
-		// First check if passed URI is already normalized...
-		IPath requestPath = modulePath.append(new Path(aUri.path()));
-		URI resourceURI = URI.createURI(PlatformURLModuleConnection.MODULE_PROTOCOL + requestPath.toString());
-		return super.getResource(resourceURI);
-	}
-
-	public IProject getComponentProject() { 
-		return componentProject;
-	}
-
-	public URI getModuleURI() {
-		return componentURI;
-	}
-
-	/**
-	 * <p>
-	 * Accesses resoureces within the underlying resource set. Takes a starndard URI attaches module
-	 * information. This data can be used to determine if the resource is part of a flexible module
-	 * structure.
-	 * </p>
-	 * 
-	 * @param aUri -
-	 *            location of resource
-	 * 
-	 * @return Resource (@see Resource)
-	 */
-
-	public Resource getOrCreateResource(URI aUri) {
-
-		return super.getOrCreateResource(aUri);
-	}
-
-	/**
-	 * <p>
-	 * Overridden to prevent super() implementation, processLoadedResources(aModuleURI) used
-	 * instead. (@link processLoadedResources(URI aModuleURI)
-	 * </p>
-	 * 
-	 * @param aUri -
-	 *            location of resource
-	 */
-
-
-
-	protected void processLoadedResources() {
-	}
-
-	/**
-	 * <p>
-	 * Gathers resources from the underlying resource set, determines if interested (@link
-	 * processLoadedResources(URI aModuleURI))and request access (@link access(ReferencedResource
-	 * aResource))to each resource incrementing the write/read count.
-	 * </p>
-	 * 
-	 * @param aUri -
-	 *            location of resource
-	 */
-
-
-	protected void processLoadedResources(IProject aComponentProject) {
-		List loadedResources = getResourceSet().getResources();
-		if (!loadedResources.isEmpty()) {
-			processResourcesIfInterrested(loadedResources);
-		}
-	}
-
-	/**
-	 * <p>
-	 * Checks to make sure a flexible module structure exist for the resources in the resource set.
-	 * This is achieved by querying ModuleCore(@see ModuleCore) for existing
-	 * WorkbenchModuleResources (@see WorkbenchModuleResources). If the resource exist it processes
-	 * the resource (@link processResource(Resource aResource)). Processing the resource increments
-	 * the read/write count.
-	 * </p>*
-	 * 
-	 * @param theResources -
-	 *            list of resources to verify flexible module status, and process
-	 * @throws UnresolveableURIException
-	 *             could not WorkbenchResource with the corresponding URI.
-	 */
-	protected boolean processResourcesIfInterrested(List theResources) {
-		int size = theResources.size();
-		Resource resourceToProcess;
-		boolean processed = false; 
- 
-		IResource resourceResource;
-		IVirtualResource[] virtualResources;
-		for (int i = 0; i < size; i++) { 
-			resourceToProcess = (Resource) theResources.get(i);
-			if (resourceToProcess == null) continue;
-			String lastSegment = resourceToProcess.getURI().lastSegment();
-			if (null != lastSegment && lastSegment.equals(IModuleConstants.COMPONENT_FILE_NAME)) continue;
-			resourceResource = WorkbenchResourceHelper.getFile(resourceToProcess);
-			if (resourceResource != null) {
-				virtualResources = ComponentCore.createResources(resourceResource); 
-				for (int resourcesIndex = 0; resourcesIndex < virtualResources.length; resourcesIndex++) {
-					if (virtualComponent.equals(virtualResources[resourcesIndex].getComponent())) {
-						if (resourceToProcess !=null && isInterrestedInResource(resourceToProcess)) {
-							processResource(resourceToProcess);
-							processed = true;
-						}
-					}
-				}
-			}
-		}  
-		return processed;
-	}
-
-	/**
-	 * 
-	 * <p>
-	 * Generic way to retrieve containing information, within the platform.
-	 * </p>
-	 * 
-	 * @return instance of the adapterType for this adapter class from adapter factory stored in the
-	 *         adapter manager (@see AdapterManager)
-	 *  
-	 */
-
-	public Object getAdapter(Class adapterType) {
-		return Platform.getAdapterManager().getAdapter(this, adapterType);
-	}
-
-	public IVirtualComponent getVirtualComponent() {
-		return virtualComponent;
-	}
-
-	public void projectChanged() {
-		try {
-			EnablementManager.INSTANCE.notifyFunctionGroupChanged(null,getComponentProject());
-		} catch (CoreException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ComponentResource.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ComponentResource.java
deleted file mode 100644
index 2fdfb39..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ComponentResource.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/**
- * <copyright></copyright>
- * 
- * $Id: ComponentResource.java,v 1.3.2.1 2006/01/10 19:16:57 cbridgha Exp $
- */
-package org.eclipse.wst.common.componentcore.internal;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc --> Provides an abstract mapping of workbench resources to deployable
- * resources.
- * <p>
- * The underlying eclipse resource could be a container or a file. However, if the
- * {@see #getSourcePath()}&nbsp; is a container, then the {@see #getDeployedPath()}&nbsp; will be
- * a container as well.
- * </p>Clients that require access to the underlying Eclipse Resource for a given
- * ComponentResource should use 
- * {@see org.eclipse.wst.common.modulecore.ModuleCore#getEclipseResource(ComponentResource)}&nbsp;
- * <p>
- * See the package overview for an <a href="package-summary.html">overview of the model components </a>.
- * </p>
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.ComponentResource#getSourcePath <em>Source Path</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.ComponentResource#getRuntimePath <em>Runtime Path</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.ComponentResource#getExclusions <em>Exclusions</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.ComponentResource#getComponent <em>Component</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.ComponentResource#getResourceType <em>Resource Type</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.wst.common.componentcore.internal.ComponentcorePackage#getComponentResource()
- * @model
- * @generated
- */
-public interface ComponentResource extends EObject{
-	/**
-	 * Returns the value of the '<em><b>Source Path</b></em>' attribute.
-	 * <!-- begin-user-doc
-	 * -->
-	 * <p>
-	 * If the meaning of the '<em>Source 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>Source Path</em>' attribute.
-	 * @see #setSourcePath(IPath)
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentcorePackage#getComponentResource_SourcePath()
-	 * @model dataType="org.eclipse.wst.common.componentcore.internal.IPath" required="true"
-	 * @generated
-	 */
-	IPath getSourcePath();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.wst.common.componentcore.internal.ComponentResource#getSourcePath <em>Source Path</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Source Path</em>' attribute.
-	 * @see #getSourcePath()
-	 * @generated
-	 */
-	void setSourcePath(IPath value);
-
-	/**
-	 * Returns the value of the '<em><b>Runtime Path</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Runtime 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>Runtime Path</em>' attribute.
-	 * @see #setRuntimePath(IPath)
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentcorePackage#getComponentResource_RuntimePath()
-	 * @model dataType="org.eclipse.wst.common.componentcore.internal.IPath" required="true"
-	 * @generated
-	 */
-	IPath getRuntimePath();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.wst.common.componentcore.internal.ComponentResource#getRuntimePath <em>Runtime Path</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Runtime Path</em>' attribute.
-	 * @see #getRuntimePath()
-	 * @generated
-	 */
-	void setRuntimePath(IPath value);
-
-	/**
-	 * Returns the value of the '<em><b>Exclusions</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Exclusions</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>Exclusions</em>' attribute list.
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentcorePackage#getComponentResource_Exclusions()
-	 * @model type="java.lang.String" default=""
-	 * @generated
-	 */
-	EList getExclusions();
-
-	/**
-	 * Returns the value of the '<em><b>Component</b></em>' container reference.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.wst.common.componentcore.internal.WorkbenchComponent#getResources <em>Resources</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Component</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>Component</em>' container reference.
-	 * @see #setComponent(WorkbenchComponent)
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentcorePackage#getComponentResource_Component()
-	 * @see org.eclipse.wst.common.componentcore.internal.WorkbenchComponent#getResources
-	 * @model opposite="resources" required="true"
-	 * @generated
-	 */
-	WorkbenchComponent getComponent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.wst.common.componentcore.internal.ComponentResource#getComponent <em>Component</em>}' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Component</em>' container reference.
-	 * @see #getComponent()
-	 * @generated
-	 */
-	void setComponent(WorkbenchComponent value);
-
-	/**
-	 * Returns the value of the '<em><b>Resource Type</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Resource 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>Resource Type</em>' attribute.
-	 * @see #setResourceType(String)
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentcorePackage#getComponentResource_ResourceType()
-	 * @model default="" required="true"
-	 * @generated
-	 */
-	String getResourceType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.wst.common.componentcore.internal.ComponentResource#getResourceType <em>Resource Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Resource Type</em>' attribute.
-	 * @see #getResourceType()
-	 * @generated
-	 */
-	void setResourceType(String value);
-	
-	IProject getOwningProject();
-	void setOwningProject(IProject aProject);
-
-} // ComponentResource
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ComponentType.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ComponentType.java
deleted file mode 100644
index d4f7df3..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ComponentType.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc --> 
- * Indicates how the {@see org.eclipse.wst.common.modulecore.WorkbenchComponent}&nbsp;should be handled by
- * the tooling.  
- * <p>
- * In particular, the {@see #getModuleTypeId()}&nbsp; is used to coordinate other
- * extensions such as EditModels and the module structure preparation builder.
- * </p>
- * 
- * <p>
- * See the package overview for an <a href="package-summary.html">overview of the model components </a>.
- * </p>
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.ComponentType#getComponentTypeId <em>Component Type Id</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.ComponentType#getVersion <em>Version</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.ComponentType#getProperties <em>Properties</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.ComponentType#getMetadataResources <em>Metadata Resources</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.wst.common.componentcore.internal.ComponentcorePackage#getComponentType()
- * @model
- * @generated
- */
-public interface ComponentType extends EObject{
-	/**
-	 * Returns the value of the '<em><b>Component Type Id</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Component Type Id</em>' 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 Id</em>' attribute.
-	 * @see #setComponentTypeId(String)
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentcorePackage#getComponentType_ComponentTypeId()
-	 * @model default="" required="true"
-	 * @generated
-	 */
-	String getComponentTypeId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.wst.common.componentcore.internal.ComponentType#getComponentTypeId <em>Component Type Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Component Type Id</em>' attribute.
-	 * @see #getComponentTypeId()
-	 * @generated
-	 */
-	void setComponentTypeId(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Metadata Resources</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.core.runtime.IPath}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Metadata Resources</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>Metadata Resources</em>' attribute list.
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentcorePackage#getComponentType_MetadataResources()
-	 * @model type="org.eclipse.core.runtime.IPath" dataType="org.eclipse.wst.common.componentcore.internal.IPath"
-	 * @generated
-	 */
-	EList getMetadataResources();
-
-	/**
-	 * Returns the value of the '<em><b>Version</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Version</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Version</em>' attribute.
-	 * @see #setVersion(String)
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentcorePackage#getComponentType_Version()
-	 * @model default="" required="true"
-	 * @generated
-	 */
-	String getVersion();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.wst.common.componentcore.internal.ComponentType#getVersion <em>Version</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Version</em>' attribute.
-	 * @see #getVersion()
-	 * @generated
-	 */
-	void setVersion(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Properties</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.wst.common.componentcore.internal.Property}.
-	 * <!-- 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.wst.common.componentcore.internal.ComponentcorePackage#getComponentType_Properties()
-	 * @model type="org.eclipse.wst.common.componentcore.internal.Property"
-	 * @generated
-	 */
-	EList getProperties();
-
-} // ComponentType
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ComponentcoreFactory.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ComponentcoreFactory.java
deleted file mode 100644
index 2d8f4da..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ComponentcoreFactory.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ComponentcoreFactory.java,v 1.1 2005/04/04 07:05:00 cbridgha Exp $
- */
-package org.eclipse.wst.common.componentcore.internal;
-
-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.wst.common.componentcore.internal.ComponentcorePackage
- * @generated
- */
-public interface ComponentcoreFactory extends EFactory {
-	/**
-	 * The singleton instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	ComponentcoreFactory eINSTANCE = new org.eclipse.wst.common.componentcore.internal.impl.ComponentcoreFactoryImpl();
-
-	/**
-	 * Returns a new object of class '<em>Workbench Component</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Workbench Component</em>'.
-	 * @generated
-	 */
-	WorkbenchComponent createWorkbenchComponent();
-
-	/**
-	 * Returns a new object of class '<em>Component Resource</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Component Resource</em>'.
-	 * @generated
-	 */
-	ComponentResource createComponentResource();
-
-	/**
-	 * 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>Property</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Property</em>'.
-	 * @generated
-	 */
-	Property createProperty();
-
-	/**
-	 * Returns a new object of class '<em>Referenced Component</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Referenced Component</em>'.
-	 * @generated
-	 */
-	ReferencedComponent createReferencedComponent();
-
-	/**
-	 * Returns a new object of class '<em>Project Components</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Project Components</em>'.
-	 * @generated
-	 */
-	ProjectComponents createProjectComponents();
-
-	/**
-	 * Returns the package supported by this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the package supported by this factory.
-	 * @generated
-	 */
-	ComponentcorePackage getComponentcorePackage();
-
-} //ComponentcoreFactory
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ComponentcorePackage.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ComponentcorePackage.java
deleted file mode 100644
index 25530ca..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ComponentcorePackage.java
+++ /dev/null
@@ -1,772 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ComponentcorePackage.java,v 1.6 2005/10/18 22:25:43 cbridgha Exp $
- */
-package org.eclipse.wst.common.componentcore.internal;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EEnum;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Package</b> for the model.
- * It contains accessors for the meta objects to represent
- * <ul>
- *   <li>each class,</li>
- *   <li>each feature of each class,</li>
- *   <li>each enum,</li>
- *   <li>and each data type</li>
- * </ul>
- * <!-- end-user-doc -->
- * @see org.eclipse.wst.common.componentcore.internal.ComponentcoreFactory
- * @model kind="package"
- * @generated
- */
-public interface ComponentcorePackage extends EPackage{
-	/**
-	 * The package name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNAME = "componentcore";
-
-	/**
-	 * The package namespace URI.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_URI = "componentcore.xmi";
-
-	/**
-	 * The package namespace name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_PREFIX = "org.eclipse.wst.common.componentcore";
-
-	/**
-	 * The singleton instance of the package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	ComponentcorePackage eINSTANCE = org.eclipse.wst.common.componentcore.internal.impl.ComponentcorePackageImpl.init();
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.wst.common.componentcore.internal.impl.WorkbenchComponentImpl <em>Workbench Component</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.wst.common.componentcore.internal.impl.WorkbenchComponentImpl
-	 * @see org.eclipse.wst.common.componentcore.internal.impl.ComponentcorePackageImpl#getWorkbenchComponent()
-	 * @generated
-	 */
-	int WORKBENCH_COMPONENT = 0;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORKBENCH_COMPONENT__NAME = 0;
-
-	/**
-	 * The feature id for the '<em><b>Resources</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORKBENCH_COMPONENT__RESOURCES = 1;
-
-	/**
-	 * The feature id for the '<em><b>Component Type</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORKBENCH_COMPONENT__COMPONENT_TYPE = 2;
-
-	/**
-	 * The feature id for the '<em><b>Referenced Components</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORKBENCH_COMPONENT__REFERENCED_COMPONENTS = 3;
-
-	/**
-	 * The feature id for the '<em><b>Properties</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORKBENCH_COMPONENT__PROPERTIES = 4;
-
-	/**
-	 * The feature id for the '<em><b>Metadata Resources</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORKBENCH_COMPONENT__METADATA_RESOURCES = 5;
-
-	/**
-	 * The number of structural features of the the '<em>Workbench Component</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORKBENCH_COMPONENT_FEATURE_COUNT = 6;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.wst.common.componentcore.internal.impl.ComponentResourceImpl <em>Component Resource</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.wst.common.componentcore.internal.impl.ComponentResourceImpl
-	 * @see org.eclipse.wst.common.componentcore.internal.impl.ComponentcorePackageImpl#getComponentResource()
-	 * @generated
-	 */
-	int COMPONENT_RESOURCE = 1;
-
-	/**
-	 * The feature id for the '<em><b>Source Path</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_RESOURCE__SOURCE_PATH = 0;
-
-	/**
-	 * The feature id for the '<em><b>Runtime Path</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_RESOURCE__RUNTIME_PATH = 1;
-
-	/**
-	 * The feature id for the '<em><b>Exclusions</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_RESOURCE__EXCLUSIONS = 2;
-
-	/**
-	 * The feature id for the '<em><b>Component</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_RESOURCE__COMPONENT = 3;
-
-	/**
-	 * The feature id for the '<em><b>Resource Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_RESOURCE__RESOURCE_TYPE = 4;
-
-	/**
-	 * The number of structural features of the the '<em>Component Resource</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_RESOURCE_FEATURE_COUNT = 5;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.wst.common.componentcore.internal.impl.ComponentTypeImpl <em>Component Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.wst.common.componentcore.internal.impl.ComponentTypeImpl
-	 * @see org.eclipse.wst.common.componentcore.internal.impl.ComponentcorePackageImpl#getComponentType()
-	 * @generated
-	 */
-	int COMPONENT_TYPE = 2;
-
-	/**
-	 * The feature id for the '<em><b>Component Type Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE__COMPONENT_TYPE_ID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE__VERSION = 1;
-
-	/**
-	 * The feature id for the '<em><b>Properties</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE__PROPERTIES = 2;
-
-	/**
-	 * The feature id for the '<em><b>Metadata Resources</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE__METADATA_RESOURCES = 3;
-
-	/**
-	 * The number of structural features of the the '<em>Component Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE_FEATURE_COUNT = 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.wst.common.componentcore.internal.impl.PropertyImpl <em>Property</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.wst.common.componentcore.internal.impl.PropertyImpl
-	 * @see org.eclipse.wst.common.componentcore.internal.impl.ComponentcorePackageImpl#getProperty()
-	 * @generated
-	 */
-	int PROPERTY = 3;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY__NAME = 0;
-
-	/**
-	 * The feature id for the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY__VALUE = 1;
-
-	/**
-	 * The number of structural features of the the '<em>Property</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_FEATURE_COUNT = 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.wst.common.componentcore.internal.impl.ReferencedComponentImpl <em>Referenced Component</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.wst.common.componentcore.internal.impl.ReferencedComponentImpl
-	 * @see org.eclipse.wst.common.componentcore.internal.impl.ComponentcorePackageImpl#getReferencedComponent()
-	 * @generated
-	 */
-	int REFERENCED_COMPONENT = 4;
-
-	/**
-	 * The feature id for the '<em><b>Handle</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCED_COMPONENT__HANDLE = 0;
-
-	/**
-	 * The feature id for the '<em><b>Runtime Path</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCED_COMPONENT__RUNTIME_PATH = 1;
-
-	/**
-	 * The feature id for the '<em><b>Dependency Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCED_COMPONENT__DEPENDENCY_TYPE = 2;
-
-	/**
-	 * The feature id for the '<em><b>Dependent Object</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCED_COMPONENT__DEPENDENT_OBJECT = 3;
-
-	/**
-	 * The number of structural features of the the '<em>Referenced Component</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCED_COMPONENT_FEATURE_COUNT = 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.wst.common.componentcore.internal.impl.ProjectComponentsImpl <em>Project Components</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.wst.common.componentcore.internal.impl.ProjectComponentsImpl
-	 * @see org.eclipse.wst.common.componentcore.internal.impl.ComponentcorePackageImpl#getProjectComponents()
-	 * @generated
-	 */
-	int PROJECT_COMPONENTS = 5;
-
-	/**
-	 * The feature id for the '<em><b>Project Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT_COMPONENTS__PROJECT_NAME = 0;
-
-	/**
-	 * The feature id for the '<em><b>Components</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT_COMPONENTS__COMPONENTS = 1;
-
-	/**
-	 * The number of structural features of the the '<em>Project Components</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT_COMPONENTS_FEATURE_COUNT = 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.wst.common.componentcore.internal.DependencyType <em>Dependency Type</em>}' enum.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.wst.common.componentcore.internal.DependencyType
-	 * @see org.eclipse.wst.common.componentcore.internal.impl.ComponentcorePackageImpl#getDependencyType()
-	 * @generated
-	 */
-	int DEPENDENCY_TYPE = 6;
-
-	/**
-	 * The meta object id for the '<em>IPath</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.core.runtime.IPath
-	 * @see org.eclipse.wst.common.componentcore.internal.impl.ComponentcorePackageImpl#getIPath()
-	 * @generated
-	 */
-	int IPATH = 7;
-
-	/**
-	 * The meta object id for the '<em>URI</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.emf.common.util.URI
-	 * @see org.eclipse.wst.common.componentcore.internal.impl.ComponentcorePackageImpl#getURI()
-	 * @generated
-	 */
-	int URI = 8;
-
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.wst.common.componentcore.internal.WorkbenchComponent <em>Workbench Component</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Workbench Component</em>'.
-	 * @see org.eclipse.wst.common.componentcore.internal.WorkbenchComponent
-	 * @generated
-	 */
-	EClass getWorkbenchComponent();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.wst.common.componentcore.internal.WorkbenchComponent#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Name</em>'.
-	 * @see org.eclipse.wst.common.componentcore.internal.WorkbenchComponent#getName()
-	 * @see #getWorkbenchComponent()
-	 * @generated
-	 */
-	EAttribute getWorkbenchComponent_Name();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.wst.common.componentcore.internal.WorkbenchComponent#getResources <em>Resources</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Resources</em>'.
-	 * @see org.eclipse.wst.common.componentcore.internal.WorkbenchComponent#getResources()
-	 * @see #getWorkbenchComponent()
-	 * @generated
-	 */
-	EReference getWorkbenchComponent_Resources();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.wst.common.componentcore.internal.WorkbenchComponent#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.wst.common.componentcore.internal.WorkbenchComponent#getComponentType()
-	 * @see #getWorkbenchComponent()
-	 * @generated
-	 */
-	EReference getWorkbenchComponent_ComponentType();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.wst.common.componentcore.internal.WorkbenchComponent#getReferencedComponents <em>Referenced Components</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Referenced Components</em>'.
-	 * @see org.eclipse.wst.common.componentcore.internal.WorkbenchComponent#getReferencedComponents()
-	 * @see #getWorkbenchComponent()
-	 * @generated
-	 */
-	EReference getWorkbenchComponent_ReferencedComponents();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.wst.common.componentcore.internal.WorkbenchComponent#getProperties <em>Properties</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Properties</em>'.
-	 * @see org.eclipse.wst.common.componentcore.internal.WorkbenchComponent#getProperties()
-	 * @see #getWorkbenchComponent()
-	 * @generated
-	 */
-	EReference getWorkbenchComponent_Properties();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.wst.common.componentcore.internal.WorkbenchComponent#getMetadataResources <em>Metadata Resources</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Metadata Resources</em>'.
-	 * @see org.eclipse.wst.common.componentcore.internal.WorkbenchComponent#getMetadataResources()
-	 * @see #getWorkbenchComponent()
-	 * @generated
-	 */
-	EAttribute getWorkbenchComponent_MetadataResources();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.wst.common.componentcore.internal.ComponentResource <em>Component Resource</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Component Resource</em>'.
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentResource
-	 * @generated
-	 */
-	EClass getComponentResource();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.wst.common.componentcore.internal.ComponentResource#getSourcePath <em>Source Path</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Source Path</em>'.
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentResource#getSourcePath()
-	 * @see #getComponentResource()
-	 * @generated
-	 */
-	EAttribute getComponentResource_SourcePath();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.wst.common.componentcore.internal.ComponentResource#getRuntimePath <em>Runtime Path</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Runtime Path</em>'.
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentResource#getRuntimePath()
-	 * @see #getComponentResource()
-	 * @generated
-	 */
-	EAttribute getComponentResource_RuntimePath();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.wst.common.componentcore.internal.ComponentResource#getExclusions <em>Exclusions</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Exclusions</em>'.
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentResource#getExclusions()
-	 * @see #getComponentResource()
-	 * @generated
-	 */
-	EAttribute getComponentResource_Exclusions();
-
-	/**
-	 * Returns the meta object for the container reference '{@link org.eclipse.wst.common.componentcore.internal.ComponentResource#getComponent <em>Component</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the container reference '<em>Component</em>'.
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentResource#getComponent()
-	 * @see #getComponentResource()
-	 * @generated
-	 */
-	EReference getComponentResource_Component();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.wst.common.componentcore.internal.ComponentResource#getResourceType <em>Resource Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Resource Type</em>'.
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentResource#getResourceType()
-	 * @see #getComponentResource()
-	 * @generated
-	 */
-	EAttribute getComponentResource_ResourceType();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.wst.common.componentcore.internal.ComponentType <em>Component Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Component Type</em>'.
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentType
-	 * @generated
-	 */
-	EClass getComponentType();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.wst.common.componentcore.internal.ComponentType#getComponentTypeId <em>Component Type Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Component Type Id</em>'.
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentType#getComponentTypeId()
-	 * @see #getComponentType()
-	 * @generated
-	 */
-	EAttribute getComponentType_ComponentTypeId();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.wst.common.componentcore.internal.ComponentType#getVersion <em>Version</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Version</em>'.
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentType#getVersion()
-	 * @see #getComponentType()
-	 * @generated
-	 */
-	EAttribute getComponentType_Version();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.wst.common.componentcore.internal.ComponentType#getProperties <em>Properties</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Properties</em>'.
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentType#getProperties()
-	 * @see #getComponentType()
-	 * @generated
-	 */
-	EReference getComponentType_Properties();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.wst.common.componentcore.internal.ComponentType#getMetadataResources <em>Metadata Resources</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Metadata Resources</em>'.
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentType#getMetadataResources()
-	 * @see #getComponentType()
-	 * @generated
-	 */
-	EAttribute getComponentType_MetadataResources();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.wst.common.componentcore.internal.Property <em>Property</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Property</em>'.
-	 * @see org.eclipse.wst.common.componentcore.internal.Property
-	 * @generated
-	 */
-	EClass getProperty();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.wst.common.componentcore.internal.Property#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Name</em>'.
-	 * @see org.eclipse.wst.common.componentcore.internal.Property#getName()
-	 * @see #getProperty()
-	 * @generated
-	 */
-	EAttribute getProperty_Name();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.wst.common.componentcore.internal.Property#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Value</em>'.
-	 * @see org.eclipse.wst.common.componentcore.internal.Property#getValue()
-	 * @see #getProperty()
-	 * @generated
-	 */
-	EAttribute getProperty_Value();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.wst.common.componentcore.internal.ReferencedComponent <em>Referenced Component</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Referenced Component</em>'.
-	 * @see org.eclipse.wst.common.componentcore.internal.ReferencedComponent
-	 * @generated
-	 */
-	EClass getReferencedComponent();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.wst.common.componentcore.internal.ReferencedComponent#getHandle <em>Handle</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Handle</em>'.
-	 * @see org.eclipse.wst.common.componentcore.internal.ReferencedComponent#getHandle()
-	 * @see #getReferencedComponent()
-	 * @generated
-	 */
-	EAttribute getReferencedComponent_Handle();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.wst.common.componentcore.internal.ReferencedComponent#getRuntimePath <em>Runtime Path</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Runtime Path</em>'.
-	 * @see org.eclipse.wst.common.componentcore.internal.ReferencedComponent#getRuntimePath()
-	 * @see #getReferencedComponent()
-	 * @generated
-	 */
-	EAttribute getReferencedComponent_RuntimePath();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.wst.common.componentcore.internal.ReferencedComponent#getDependencyType <em>Dependency Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Dependency Type</em>'.
-	 * @see org.eclipse.wst.common.componentcore.internal.ReferencedComponent#getDependencyType()
-	 * @see #getReferencedComponent()
-	 * @generated
-	 */
-	EAttribute getReferencedComponent_DependencyType();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.wst.common.componentcore.internal.ReferencedComponent#getDependentObject <em>Dependent Object</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Dependent Object</em>'.
-	 * @see org.eclipse.wst.common.componentcore.internal.ReferencedComponent#getDependentObject()
-	 * @see #getReferencedComponent()
-	 * @generated
-	 */
-	EReference getReferencedComponent_DependentObject();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.wst.common.componentcore.internal.ProjectComponents <em>Project Components</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Project Components</em>'.
-	 * @see org.eclipse.wst.common.componentcore.internal.ProjectComponents
-	 * @generated
-	 */
-	EClass getProjectComponents();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.wst.common.componentcore.internal.ProjectComponents#getProjectName <em>Project Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Project Name</em>'.
-	 * @see org.eclipse.wst.common.componentcore.internal.ProjectComponents#getProjectName()
-	 * @see #getProjectComponents()
-	 * @generated
-	 */
-	EAttribute getProjectComponents_ProjectName();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.wst.common.componentcore.internal.ProjectComponents#getComponents <em>Components</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Components</em>'.
-	 * @see org.eclipse.wst.common.componentcore.internal.ProjectComponents#getComponents()
-	 * @see #getProjectComponents()
-	 * @generated
-	 */
-	EReference getProjectComponents_Components();
-
-	/**
-	 * Returns the meta object for enum '{@link org.eclipse.wst.common.componentcore.internal.DependencyType <em>Dependency Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for enum '<em>Dependency Type</em>'.
-	 * @see org.eclipse.wst.common.componentcore.internal.DependencyType
-	 * @generated
-	 */
-	EEnum getDependencyType();
-
-	/**
-	 * Returns the meta object for data type '{@link org.eclipse.core.runtime.IPath <em>IPath</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>IPath</em>'.
-	 * @see org.eclipse.core.runtime.IPath
-	 * @model instanceClass="org.eclipse.core.runtime.IPath"
-	 *        annotation="keywords datatype='null'" 
-	 * @generated
-	 */
-	EDataType getIPath();
-
-	/**
-	 * Returns the meta object for data type '{@link org.eclipse.emf.common.util.URI <em>URI</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>URI</em>'.
-	 * @see org.eclipse.emf.common.util.URI
-	 * @model instanceClass="org.eclipse.emf.common.util.URI"
-	 *        annotation="keywords datatype='null'" 
-	 * @generated
-	 */
-	EDataType getURI();
-
-	/**
-	 * 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
-	 */
-	ComponentcoreFactory getComponentcoreFactory();
-
-} //ComponentcorePackage
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/DependencyType.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/DependencyType.java
deleted file mode 100644
index d9cf17a..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/DependencyType.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.emf.common.util.AbstractEnumerator;
-
-/**
- * 
- * <!-- begin-user-doc --> 
- * Indicates how a particular {@see org.eclipse.wst.common.modulecore.ReferencedComponent}&nbsp;should be
- * absorbed by a {@see org.eclipse.wst.common.modulecore.WorkbenchComponent}. 
- * <p>
- * Provides two types ("uses", "consumes") which are used by
- * {@see org.eclipse.wst.common.modulecore.ReferencedComponent}s to specify how the
- * {@see org.eclipse.wst.common.modulecore.ReferencedComponent}&nbsp; should be absorbed by the
- * containing {@see org.eclipse.wst.common.modulecore.WorkbenchComponent}.
- * </p>
- * For clients that need to create one of these objects from scratch,
- * {@see org.eclipse.wst.common.modulecore.ModuleCoreFactory}.
- * <p>
- * A representation of the literals of the enumeration '<em><b>Dependency Type</b></em>', and
- * utility methods for working with them.
- * </p>
- * <p> 
- * See the package overview for an <a href="package-summary.html">overview of the model components</a>.
- * </p>
- * <!-- end-user-doc --> <!-- end-user-doc --> <!-- begin-model-doc --> uses=0 consumes=1 <!--
- * end-model-doc -->
- * 
- * @see org.eclipse.wst.common.componentcore.internal.ModuleCorePackage#getDependencyType()
- * @model
- * @generated
- */
-public final class DependencyType extends AbstractEnumerator {
-	/**
-	 * The '<em><b>Uses</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Uses</b></em>' literal object isn't clear, there really should
-	 * be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #USES_LITERAL
-	 * @model name="uses"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int USES = 0;
-
-	/**
-	 * The '<em><b>Consumes</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Consumes</b></em>' literal object isn't clear, there really
-	 * should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #CONSUMES_LITERAL
-	 * @model name="consumes"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int CONSUMES = 1;
-
-	/**
-	 * The '<em><b>Uses</b></em>' literal object.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @see #USES
-	 * @generated
-	 * @ordered
-	 */
-	public static final DependencyType USES_LITERAL = new DependencyType(USES, "uses");
-
-	/**
-	 * The '<em><b>Consumes</b></em>' literal object. <!-- begin-user-doc --> <!-- end-user-doc
-	 * -->
-	 * 
-	 * @see #CONSUMES
-	 * @generated
-	 * @ordered
-	 */
-	public static final DependencyType CONSUMES_LITERAL = new DependencyType(CONSUMES, "consumes");
-
-	/**
-	 * An array of all the '<em><b>Dependency Type</b></em>' enumerators.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final DependencyType[] VALUES_ARRAY =
-		new DependencyType[] {
-			USES_LITERAL,
-			CONSUMES_LITERAL,
-		};
-
-	/**
-	 * A public read-only list of all the '<em><b>Dependency Type</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>Dependency Type</b></em>' literal with the specified name. 
-	 * <!-- begin-user-doc --> 
-	 * @param name passes literal name
-	 * @return literal instance
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public static DependencyType get(String name) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			DependencyType result = VALUES_ARRAY[i];
-			if (result.toString().equals(name)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>Dependency Type</b></em>' literal with the specified value. 
-	 *  <!-- begin-user-doc -->
-	 * @param value passes literal value
-	 * @return literal instance
-	 *  <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public static DependencyType get(int value) {
-		switch (value) {
-			case USES: return USES_LITERAL;
-			case CONSUMES: return CONSUMES_LITERAL;
-		}
-		return null;	
-	}
-
-	/**
-	 * Only this class can construct instances.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	private DependencyType(int value, String name) {
-		super(value, name);
-	}
-
-} //DependencyType
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/IComponentProjectMigrator.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/IComponentProjectMigrator.java
deleted file mode 100644
index 0f66ad1..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/IComponentProjectMigrator.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal;
-
-import org.eclipse.core.resources.IProject;
-
-public interface IComponentProjectMigrator {
-	public void migrateProject(IProject project);
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleMigratorManager.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleMigratorManager.java
deleted file mode 100644
index d3b341b..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleMigratorManager.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal;
-
-import java.util.HashSet;
-
-import org.eclipse.core.commands.ExecutionException;
-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.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.wst.common.componentcore.ModuleCoreNature;
-import org.eclipse.wst.common.componentcore.datamodel.ProjectMigratorDataModelProvider;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IProjectMigratorDataModelProperties;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.internal.datamodel.IWorkspaceRunnableWithStatus;
-import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-
-public class ModuleMigratorManager {
-	private static ModuleMigratorManager manager;
-	private HashSet migrated = new HashSet();
-	private boolean migrating;
-	private HashSet moved = new HashSet();
-	public ModuleMigratorManager() {
-		super();
-	}
-	public static ModuleMigratorManager getManager() {
-		if (manager == null) {
-			manager = new ModuleMigratorManager();
-		}
-		return manager;
-	}
-	private void migrateComponentsIfNecessary(IProject project, boolean multiComps) {
-		if (multiComps) {
-			setupAndMigrateComponentProject(project);
-		} else {
-	        	  
-	        	  IProject[] projects = WorkbenchResourceHelper.getWorkspace().getRoot().getProjects();
-			      for (int i = 0; i < projects.length; i++) {
-						IProject proj = projects[i];
-						setupAndMigrateComponentProject(proj);
-			      }
-		}
-						
-		
-	}
-	private void setupAndMigrateComponentProject(IProject proj) {
-		migrated.add(proj);
-		IDataModel dm = DataModelFactory.createDataModel(new ProjectMigratorDataModelProvider());
-		dm.setStringProperty(IProjectMigratorDataModelProperties.PROJECT_NAME,proj.getName());
-		try {
-			dm.getDefaultOperation().execute(null,null);
-		} catch (ExecutionException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-	}
-	public synchronized void migrateOldMetaData(IProject aProject, final boolean multiComps) throws CoreException {
-		
-		IWorkspaceRunnableWithStatus workspaceRunnable = new IWorkspaceRunnableWithStatus(aProject) {
-			public void run(IProgressMonitor pm) throws CoreException {
-				IProject aProj = (IProject)this.getInfo();
-				migrating = true;
-				try {
-					if (aProj.isAccessible() && ModuleCoreNature.isFlexibleProject(aProj)) {
-						if (aProj.findMember(".wtpmodules") != null) {
-							if (!moved.contains(aProj))
-								moveOldMetaDataFile();
-						} else moved.add(aProj);
-						if (needsComponentMigration(aProj,multiComps))
-							migrateComponentsIfNecessary(aProj,multiComps);
-					}
-				} finally {
-					migrating = false;
-				}
-			}
-
-			private boolean needsComponentMigration(IProject aProj,boolean multiComps) throws CoreException {
-				
-			boolean needs = !migrated.contains(aProj);
-			if (multiComps)
-				return (needs && multiComps);
-			else
-				return (aProj.findMember(".settings/.component") != null) && 
-						(ProjectFacetsManager.create(aProj) == null) && needs;
-			}
-		};
-		
-		ResourcesPlugin.getWorkspace().run(workspaceRunnable, null,IWorkspace.AVOID_UPDATE,null);
-		
-		
-		
-		
-	}
-	private void moveMetaDataFile(IProject project) {
-		IResource oldfile = project.findMember(".wtpmodules");
-		if (oldfile != null && oldfile.exists()) {
-			
-			try {
-					IFolder settingsFolder = project.getFolder(".settings");
-					if (!settingsFolder.exists())
-						settingsFolder.create(true,true,null);
-					oldfile.move(new Path(".settings/.component"),true,null);
-			} catch (CoreException e) {
-				Platform.getLog(ModulecorePlugin.getDefault().getBundle()).log(new Status(IStatus.ERROR, ModulecorePlugin.PLUGIN_ID, IStatus.ERROR, e.getMessage(), e));
-			}
-		}
-	}
-	private void moveOldMetaDataFile() {
-//		WorkspaceJob job = new WorkspaceJob("Migrating metadata")
-//	      {
-//	        
-//	        public IStatus runInWorkspace(IProgressMonitor monitor)
-//	        {
-	          try
-	          {
-	        	IProject[] projects = WorkbenchResourceHelper.getWorkspace().getRoot().getProjects();
-	      		for (int i = 0; i < projects.length; i++) {
-	      			IProject project = projects[i];
-	      			if (!moved.contains(project))
-		      			moveMetaDataFile(project);
-	      				IFolder depFolder = project.getFolder(".deployables");
-	      				if (depFolder.exists())
-	      					depFolder.delete(true,null);
-		      			project.refreshLocal(IResource.DEPTH_INFINITE,null);
-		      			moved.add(project);
-	      			}
-	      		
-	          } catch (Exception e) {
-	          }
-//	          return Status.OK_STATUS;
-//	        }
-//	      };
-//	      job.setRule(ResourcesPlugin.getWorkspace().getRuleFactory().buildRule());
-//	      job.schedule();
-	}
-	protected boolean isMigrating() {
-		return migrating;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleStructuralModel.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleStructuralModel.java
deleted file mode 100644
index 12f017e..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleStructuralModel.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal;
-
-import java.io.IOException;
-import java.util.Collections;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.xmi.XMIResource;
-import org.eclipse.wst.common.componentcore.internal.impl.WTPModulesResource;
-import org.eclipse.wst.common.componentcore.internal.impl.WTPModulesResourceFactory;
-import org.eclipse.wst.common.internal.emf.resource.ReferencedResource;
-import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
-import org.eclipse.wst.common.internal.emfworkbench.integration.EditModel;
-import org.eclipse.wst.common.project.facet.core.internal.FacetedProjectNature;
-/**
- * Manages the underlying Module Structural Metamodel.
-* <a name="module-structural-model"/>
-* <p>
-* Each ModuleCoreNature from a given project can provide access to the
-* {@see org.eclipse.wst.common.modulecore.ModuleStructuralModel}&nbsp; of the project.
-* {@see org.eclipse.wst.common.modulecore.ModuleStructuralModel}&nbsp; is a subclass of
-* {@see org.eclipse.wst.common.internal.emfworkbench.integration.EditModel}&nbsp;that manages
-* resources associated with the Module Structural Metamodel. As an EditModel, the
-* {@see org.eclipse.wst.common.modulecore.ModuleStructuralModel}&nbsp; references EMF resources,
-* that contain EMF models -- in this case, the EMF model of <i>.component </i> file.
-* </p>
-* <p>
-* Clients are encouraged to use the Edit Facade pattern (via
-* {@see org.eclipse.wst.common.modulecore.ModuleCore}&nbsp; or one if its relevant subclasses)
-* to work directly with the Module Structural Metamodel.
-* </p> 
-* <p>
-* <a href="ModuleCoreNature.html#model-discussion">See the discussion</a> of how ModuleStructuralModel relates to the ArtifactEditModel and ModuleCoreNature.
-* <a name="accessor-key"/>
-* <p>
-* All EditModels have a lifecycle that must be enforced to keep the resources loaded that are in
-* use, and to unload resources that are not in use. To access an EditModel, clients are required to
-* supply an object token referred to as an accessor key. The accessor key allows the framework to
-* better track which clients are using the EditModel, and to ensure that only a client which has
-* accessed the EditModel with an accessor key may invoke save*()s on that EditModel.
-* </p>
-*/ 
-public class ModuleStructuralModel extends EditModel implements IAdaptable {
-	
-	public static final String MODULE_CORE_ID = "moduleCoreId"; //$NON-NLS-1$ 
-	private boolean multiComps;
-	public ModuleStructuralModel(String editModelID, EMFWorkbenchContext context, boolean readOnly) {
-        super(editModelID, context, readOnly);
-    }
-    /**
-	 * Release each of the referenced resources.
-	 */
-	protected void release(ReferencedResource aResource) {
-		if (isReadOnly() && aResource.getReadCount() != 0)
-			aResource.releaseFromRead();
-		else
-			aResource.releaseFromWrite();
-
-	}
-	protected boolean removeResource(Resource aResource) {
-		if (aResource != null) {
-			synchronized (aResource) {
-				aResource.eAdapters().remove(resourceAdapter);
-				return getResources().remove(aResource);
-			}
-		}
-		return false;
-	}
-    
-    /* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emfworkbench.integration.EditModel#getPrimaryRootObject()
-	 */
-	public EObject getPrimaryRootObject() {
-		try {
-			prepareProjectModulesIfNecessary();
-		} catch (CoreException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		EObject modelRoot = null;
-		synchronized (this) {
-			modelRoot = super.getPrimaryRootObject();
-		}
-		return modelRoot;
-	}
-       
-	public WTPModulesResource  makeWTPModulesResource() {
-		return (WTPModulesResource) createResource(WTPModulesResourceFactory.WTP_MODULES_URI_OBJ);
-	}
-
-	public Resource prepareProjectModulesIfNecessary() throws CoreException {
-		ModuleMigratorManager manager = ModuleMigratorManager.getManager();
-		XMIResource res = (XMIResource) getPrimaryResource();
-		if (resNeedsMigrating(res)) {
-			try {
-				if (!manager.isMigrating())
-					manager.migrateOldMetaData(getProject(),multiComps);
-			} catch (CoreException e) {
-				// TODO Auto-generated catch block
-				e.printStackTrace();
-			}
-			res = (XMIResource) getPrimaryResource();
-		}
-		if(res == null)
-			res = makeWTPModulesResource();		
-		try {
-			addProjectModulesIfNecessary(res);
-		} catch (IOException e) {		
-			Platform.getLog(ModulecorePlugin.getDefault().getBundle()).log(new Status(IStatus.ERROR, ModulecorePlugin.PLUGIN_ID, IStatus.ERROR, e.getMessage(), e));
-		} 
-		return res;
-	}
-	private boolean resNeedsMigrating(XMIResource res) throws CoreException {
-		multiComps = false;
-		if (project==null)
-			return false;
-		boolean needsMigrating =  (!project.hasNature(FacetedProjectNature.NATURE_ID)) || (res!=null && !res.isLoaded());
-		if (!needsMigrating) {
-			if (res != null && ((WTPModulesResource)res).getRootObject() != null) {
-				ProjectComponents components = (ProjectComponents) ((WTPModulesResource)res).getRootObject();
-				if (components.getComponents() != null) {
-					multiComps = components.getComponents().size() > 1;
-					return multiComps;
-				}
-			}
-		}
-		return needsMigrating;
-	}
-	
-	public Object getAdapter(Class anAdapter) {
-		return Platform.getAdapterManager().getAdapter(this, anAdapter); 
-	}
-	
-	protected void addProjectModulesIfNecessary(XMIResource aResource) throws IOException {
-		
-		if (aResource != null) { 
-			if(aResource.getContents().isEmpty()) {
-				ProjectComponents projectModules = ComponentcorePackage.eINSTANCE.getComponentcoreFactory().createProjectComponents();
-				projectModules.setProjectName(project.getName());
-				aResource.getContents().add(projectModules); 
-				aResource.setID(projectModules, MODULE_CORE_ID);
-			}
-		}
-	}
-	protected Resource getAndLoadLocalResource(URI aUri) {
-		
-			Resource resource = getLocalResource(aUri);
-			if (null != resource) {
-				synchronized (resource) {
-					if (!resource.isLoaded()) {
-						try {
-							resource.load(Collections.EMPTY_MAP); // reload it
-						} catch (IOException e) {
-							// Ignore
-						}
-					}
-				}
-			}
-			return resource;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModulecorePlugin.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModulecorePlugin.java
deleted file mode 100644
index 2b1c4bb..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModulecorePlugin.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdapterManager;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.wst.common.componentcore.ArtifactEdit;
-import org.eclipse.wst.common.componentcore.internal.impl.PlatformURLModuleConnection;
-import org.eclipse.wst.common.componentcore.internal.impl.WTPModulesInit;
-import org.eclipse.wst.common.componentcore.internal.util.ArtifactEditAdapterFactory;
-import org.eclipse.wst.common.componentcore.internal.util.ModuleCoreEclipseAdapterFactory;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.osgi.framework.BundleContext;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class ModulecorePlugin extends Plugin {
-	//The shared instance.
-	private static ModulecorePlugin plugin;
-	//Resource bundle.
-	private ResourceBundle resourceBundle;
-	//plugin id
-	public static final String PLUGIN_ID = "org.eclipse.wst.common.modulecore"; //$NON-NLS-1$
-	
-	/**
-	 * The constructor.
-	 */
-	public ModulecorePlugin() {
-		super();
-		plugin = this;
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		IAdapterManager manager = Platform.getAdapterManager();
-		
-		manager.registerAdapters(new ModuleCoreEclipseAdapterFactory(), ModuleStructuralModel.class);
-		manager.registerAdapters(new ArtifactEditAdapterFactory(), ArtifactEditModel.class);
-		manager.registerAdapters(new ArtifactEditAdapterFactory(), ArtifactEdit.class);
-		manager.registerAdapters(new ArtifactEditAdapterFactory(), IVirtualComponent.class);
-		manager.registerAdapters(new ModuleCoreEclipseAdapterFactory(), IResource.class);
-		
-		PlatformURLModuleConnection.startup();
-		WTPModulesInit.init();
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-		resourceBundle = null;
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static ModulecorePlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns the string from the plugin's resource bundle,
-	 * or 'key' if not found.
-	 */
-	public static String getResourceString(String key) {
-		ResourceBundle bundle = ModulecorePlugin.getDefault().getResourceBundle();
-		try {
-			return (bundle != null) ? bundle.getString(key) : key;
-		} catch (MissingResourceException e) {
-			return key;
-		}
-	}
-
-	/**
-	 * Returns the plugin's resource bundle,
-	 */
-	public ResourceBundle getResourceBundle() {
-		try {
-			if (resourceBundle == null)
-				resourceBundle = ResourceBundle.getBundle("modulecore"); //$NON-NLS-1$
-		} catch (MissingResourceException x) {
-			resourceBundle = null;
-		}
-		return resourceBundle;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ProjectComponents.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ProjectComponents.java
deleted file mode 100644
index bf7649a..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ProjectComponents.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc --> 
- * Provides a root object to store and manage the
- * {@see org.eclipse.wst.common.modulecore.WorkbenchComponent}s. * 
- * <p>
- * See the package overview for an <a href="package-summary.html">overview of the model components </a>.
- * </p>
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.ProjectComponents#getProjectName <em>Project Name</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.ProjectComponents#getComponents <em>Components</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.wst.common.componentcore.internal.ComponentcorePackage#getProjectComponents()
- * @model
- * @generated
- */
-public interface ProjectComponents extends EObject{
-	/**
-	 * Returns the value of the '<em><b>Project Name</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc
-	 * -->
-	 * <p>
-	 * If the meaning of the '<em>Project 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>Project Name</em>' attribute.
-	 * @see #setProjectName(String)
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentcorePackage#getProjectComponents_ProjectName()
-	 * @model default="" required="true"
-	 * @generated
-	 */
-	String getProjectName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.wst.common.componentcore.internal.ProjectComponents#getProjectName <em>Project Name</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Project Name</em>' attribute.
-	 * @see #getProjectName()
-	 * @generated
-	 */
-	void setProjectName(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Components</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.wst.common.componentcore.internal.WorkbenchComponent}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Components</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Components</em>' containment reference list.
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentcorePackage#getProjectComponents_Components()
-	 * @model type="org.eclipse.wst.common.componentcore.internal.WorkbenchComponent" containment="true"
-	 * @generated
-	 */
-	EList getComponents();
-
-	public WorkbenchComponent findWorkbenchModule(String aDeployName);
-
-} // ProjectComponents
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ProjectMigratorRegistry.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ProjectMigratorRegistry.java
deleted file mode 100644
index f6883ca..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ProjectMigratorRegistry.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Oct 29, 2003
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.wst.common.componentcore.internal;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jem.util.RegistryReader;
-
-/**
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public class ProjectMigratorRegistry extends RegistryReader {
-
-	static final String EXTENSION_NAME = "ComponentProjectMigrator"; //$NON-NLS-1$
-	static final String ELEMENT_MIGRATOR_EXTENSION = "migratorExtension"; //$NON-NLS-1$
-	static final String MIGRATOR_CLASS = "class"; //$NON-NLS-1$
-	private List projectMigrators = new ArrayList();
-	private static ProjectMigratorRegistry INSTANCE = null;
-
-	public ProjectMigratorRegistry() {
-		super(ModulecorePlugin.PLUGIN_ID, EXTENSION_NAME);
-	}
-
-	public static ProjectMigratorRegistry getInstance() {
-		if (INSTANCE == null) {
-			INSTANCE = new ProjectMigratorRegistry();
-			INSTANCE.readRegistry();
-		}
-		return INSTANCE;
-	}
-
-	/**
-	 * readElement() - parse and deal w/ an extension like: <earModuleExtension extensionClass =
-	 * "com.ibm.etools.web.plugin.WebModuleExtensionImpl"/>
-	 */
-	public boolean readElement(IConfigurationElement element) {
-		if (!element.getName().equals(ELEMENT_MIGRATOR_EXTENSION))
-			return false;
-
-		IComponentProjectMigrator migrator = null;
-		try {
-			migrator = (IComponentProjectMigrator) element.createExecutableExtension(MIGRATOR_CLASS);
-		} catch (CoreException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		if (migrator != null)
-			addModuleExtension(migrator);
-		return true;
-	}
-
-	public IComponentProjectMigrator[] getProjectMigrators(){
-		return (IComponentProjectMigrator[])projectMigrators.toArray(new IComponentProjectMigrator[projectMigrators.size()]);
-	}
-	private void addModuleExtension(IComponentProjectMigrator ext) {
-		projectMigrators.add(ext);
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/Property.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/Property.java
deleted file mode 100644
index 5549bd5..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/Property.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Property.java,v 1.1 2005/04/04 07:05:00 cbridgha Exp $
- */
-package org.eclipse.wst.common.componentcore.internal;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Property</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.Property#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.Property#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.wst.common.componentcore.internal.ComponentcorePackage#getProperty()
- * @model
- * @generated
- */
-public interface Property extends EObject{
-	/**
-	 * Returns the value of the '<em><b>Name</b></em>' attribute.
-	 * The default value is <code>""</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.wst.common.componentcore.internal.ComponentcorePackage#getProperty_Name()
-	 * @model default="" required="true"
-	 * @generated
-	 */
-	String getName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.wst.common.componentcore.internal.Property#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.
-	 * The default value is <code>""</code>.
-	 * <!-- 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.wst.common.componentcore.internal.ComponentcorePackage#getProperty_Value()
-	 * @model default="" required="true"
-	 * @generated
-	 */
-	String getValue();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.wst.common.componentcore.internal.Property#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);
-
-} // Property
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ReferencedComponent.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ReferencedComponent.java
deleted file mode 100644
index 7caa133..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ReferencedComponent.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc --> 
- * Used to reference {@see org.eclipse.wst.common.modulecore.WorkbenchComponent}s either contained in
- * the same project or remotely. 
- * <p>
- * Each {@see org.eclipse.wst.common.modulecore.WorkbenchComponent}&nbsp; contains a list of its
- * DependentModules.
- * </p> 
- * <p>
- * The referenced {@see WorkbenchComponent}&nbsp; may be in the same project as the
- * {@see WorkbenchComponent}&nbsp; that contains the current ReferencedComponent. Use
- * {@see ModuleCore#isLocalDependency(ReferencedComponent)}&nbsp; to make the determination.
- * </p> 
- * <p>
- * See the package overview for an <a href="package-summary.html">overview of the model components </a>.
- * </p>
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.ReferencedComponent#getHandle <em>Handle</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.ReferencedComponent#getRuntimePath <em>Runtime Path</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.ReferencedComponent#getDependencyType <em>Dependency Type</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.ReferencedComponent#getDependentObject <em>Dependent Object</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.wst.common.componentcore.internal.ComponentcorePackage#getReferencedComponent()
- * @model
- * @generated
- */
-public interface ReferencedComponent extends EObject{
-	/**
-	 * Returns the value of the '<em><b>Handle</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * Returns a fully-qualified URI that conforms to the standard "module:" URI format. The handle
-	 * references the {@see WorkbenchComponent}represented by the current ReferencedComponent.
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Handle</em>' attribute.
-	 * @see #setHandle(URI)
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentcorePackage#getReferencedComponent_Handle()
-	 * @model dataType="org.eclipse.wst.common.componentcore.internal.URI" required="true"
-	 * @generated
-	 */
-	URI getHandle();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.wst.common.componentcore.internal.ReferencedComponent#getHandle <em>Handle</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Handle</em>' attribute.
-	 * @see #getHandle()
-	 * @generated
-	 */
-	void setHandle(URI value);
-
-	/**
-	 * Returns the value of the '<em><b>Runtime Path</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Runtime 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>Runtime Path</em>' attribute.
-	 * @see #setRuntimePath(IPath)
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentcorePackage#getReferencedComponent_RuntimePath()
-	 * @model dataType="org.eclipse.wst.common.componentcore.internal.IPath" required="true"
-	 * @generated
-	 */
-	IPath getRuntimePath();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.wst.common.componentcore.internal.ReferencedComponent#getRuntimePath <em>Runtime Path</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Runtime Path</em>' attribute.
-	 * @see #getRuntimePath()
-	 * @generated
-	 */
-	void setRuntimePath(IPath value);
-
-	/**
-	 * Returns the value of the '<em><b>Dependency Type</b></em>' attribute. The literals are
-	 * from the enumeration {@link org.eclipse.wst.common.componentcore.internal.DependencyType}. <!--
-	 * begin-user-doc -->
-	 * <p>
-	 * See the class documentation {@see DependencyType}for information on the purpose of this
-	 * field.
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Dependency Type</em>' attribute.
-	 * @see org.eclipse.wst.common.componentcore.internal.DependencyType
-	 * @see #setDependencyType(DependencyType)
-	 * @see org.eclipse.wst.common.componentcore.internal.ModuleCorePackage#getDependentModule_DependencyType()
-	 * @model
-	 * @generated
-	 */
-	DependencyType getDependencyType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.wst.common.componentcore.internal.ReferencedComponent#getDependencyType <em>Dependency Type</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Dependency Type</em>' attribute.
-	 * @see org.eclipse.wst.common.componentcore.internal.DependencyType
-	 * @see #getDependencyType()
-	 * @generated
-	 */
-	void setDependencyType(DependencyType value);
-
-	/**
-	 * Returns the value of the '<em><b>Dependent Object</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Dependent Object</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Dependent Object</em>' reference.
-	 * @see #setDependentObject(EObject)
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentcorePackage#getReferencedComponent_DependentObject()
-	 * @model
-	 * @generated
-	 */
-	EObject getDependentObject();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.wst.common.componentcore.internal.ReferencedComponent#getDependentObject <em>Dependent Object</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Dependent Object</em>' reference.
-	 * @see #getDependentObject()
-	 * @generated
-	 */
-	void setDependentObject(EObject value);
-
-} // ReferencedComponent
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/StructureEdit.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/StructureEdit.java
deleted file mode 100644
index 491351c..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/StructureEdit.java
+++ /dev/null
@@ -1,919 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-
-package org.eclipse.wst.common.componentcore.internal;
-
-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.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.IProgressMonitor;
-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.util.EcoreUtil;
-import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.IEditModelHandler;
-import org.eclipse.wst.common.componentcore.ModuleCoreNature;
-import org.eclipse.wst.common.componentcore.UnresolveableURIException;
-import org.eclipse.wst.common.componentcore.internal.impl.ModuleURIUtil;
-import org.eclipse.wst.common.componentcore.internal.impl.PlatformURLModuleConnection;
-import org.eclipse.wst.common.componentcore.internal.impl.ResourceTreeNode;
-import org.eclipse.wst.common.componentcore.internal.resources.VirtualReference;
-import org.eclipse.wst.common.componentcore.internal.util.EclipseResourceAdapter;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
-
-/**
- * <p>
- * Provides a Facade pattern for accessing the Web Tools Platform EMF Module Model. ModuleCore can
- * be used as a static utility or an instance adapter.
- * </p>
- * <p>
- * ModuleCore hides the management of accessing EditModels (
- * {@see org.eclipse.wst.common.modulecore.ModuleStructuralModel}) correctly. Each project has
- * exactly one ({@see org.eclipse.wst.common.modulecore.ModuleStructuralModel}) for read and
- * exactly one for write. Each of these is shared among all clients and reference counted as
- * necessary. Clients should use ModuleCore when working with the WTP Modules Strcutrual Model.
- * </p>
- * 
- * <p>
- * Each ModuleCore edit facade is designed to manage the EditModel lifecycle for clients. However,
- * while each ModuleCore is designed to be passed around as needed, clients must enforce the
- * ModuleCore lifecycle. The most common method of acquiring a ModuleCore edit facade is to use
- * {@see #getModuleCoreForRead(IProject)}&nbsp;or {@see #getModuleCoreForWrite(IProject)}.
- * </p>
- * <p>
- * When clients have concluded their use of their ModuleCore instance adapter , <b>clients must call
- * {@see #dispose()}</b>.
- * </p>
- * <p>
- * For more information about the underlying EditModel, see <a
- * href="ModuleCoreNature.html#module-structural-model">the discussion of the ModuleStructuralModel
- * </a>.
- * <p>
- * The following class is experimental until fully documented.
- * </p>
- * 
- * @see org.eclipse.wst.common.componentcore.ModuleCoreNature
- * @see org.eclipse.wst.common.componentcore.internal.ModuleStructuralModel
- */
-public class StructureEdit implements IEditModelHandler {
-
-	public static final Class ADAPTER_TYPE = StructureEdit.class;
-
-	static String MODULE_META_FILE_NAME = ".settings/.component"; //$NON-NLS-1$
-
-	private final static ComponentcoreFactory COMPONENT_FACTORY = ComponentcoreFactory.eINSTANCE;
-	private static final ComponentResource[] NO_RESOURCES = new ComponentResource[0];
-	
-	private final ModuleStructuralModel structuralModel;
-	private final Map dependentCores = new HashMap();
-	private IProject aProject;
-	private boolean isStructuralModelSelfManaged;
-	private boolean isReadOnly;
-
-	private static final WorkbenchComponent[] NO_COMPONENTS = new WorkbenchComponent[0];
-
-	/**
-	 * 
-	 * <p>
-	 * Each ModuleCore edit facade is tied to a specific project. A project
-	 * may have multiple ModuleCore edit facades live at any given time.
-	 * </p>
-	 * <p>
-	 * Use to acquire a ModuleCore facade for a specific project that will not
-	 * be used for editing. Invocations of any save*() API on an instance
-	 * returned from This method will throw exceptions.
-	 * </p>
-	 * 
-	 * @param aProject
-	 *            The IProject that contains the WTP Modules model to load
-	 * @return A ModuleCore edit facade to access the WTP Modules Model, null
-	 *         for non-flexible projects
-	 */
-	public static StructureEdit getStructureEditForRead(IProject aProject) {
-		ModuleCoreNature nature = ModuleCoreNature.getModuleCoreNature(aProject);
-		return nature != null ? new StructureEdit(nature, true) : null;
-	}
-
-	/**
-	 * 
-	 * <p>
-	 * Each ModuleCore edit facade is tied to a specific project. A project may have multiple
-	 * ModuleCore edit facades live at any given time.
-	 * </p>
-	 * <p>
-	 * Use to acquire a ModuleCore facade for a specific project that may be used to modify the
-	 * model.
-	 * </p>
-	 * 
-	 * @param aProject
-	 *            The IProject that contains the WTP Modules model to load
-	 * @return A ModuleCore edit facade to access the WTP Modules Model
-	 */
-	public static StructureEdit getStructureEditForWrite(IProject aProject) {
-		ModuleCoreNature nature = ModuleCoreNature.getModuleCoreNature(aProject);
-		return nature != null ? new StructureEdit(nature, false) : null;
-	}
-
-	/**
-	 * <p>
-	 * A convenience API to fetch the {@see ModuleCoreNature}&nbsp;for a particular module URI. The
-	 * module URI must be of the valid form, or an exception will be thrown. The module URI must be
-	 * contained by a project that has a {@see ModuleCoreNature}&nbsp;or null will be returned.
-	 * </p>
-	 * <p>
-	 * <b>This method may return null. </b>
-	 * </p>
-	 * 
-	 * @param aModuleURI
-	 *            A valid, fully-qualified module URI
-	 * @return The ModuleCoreNature of the project associated with aModuleURI
-	 * @throws UnresolveableURIException
-	 *             If the supplied module URI is invalid or unresolveable.
-	 */
-	public static ModuleCoreNature getModuleCoreNature(URI aModuleURI) throws UnresolveableURIException {
-		IProject container = getContainingProject(aModuleURI);
-		if (container != null)
-			return ModuleCoreNature.getModuleCoreNature(container);
-		return null;
-	}
-
-	/**
-	 * <p>
-	 * For {@see WorkbenchComponent}s that are contained within a project, the containing project
-	 * can be determined with the {@see WorkbenchComponent}'s fully-qualified module URI.
-	 * </p>
-	 * <p>
-	 * The following method will return the the corresponding project for the supplied module URI,
-	 * if it can be determined.
-	 * </p>
-	 * <p>
-	 * The method will not return an inaccessible project.
-	 * </p>
-	 * <p>
-	 * <b>This method may return null. </b>
-	 * </p>
-	 * 
-	 * @param aModuleURI
-	 *            A valid, fully-qualified module URI
-	 * @return The project that contains the module referenced by the module URI
-	 * @throws UnresolveableURIException
-	 *             If the supplied module URI is invalid or unresolveable.
-	 */
-	public static IProject getContainingProject(WorkbenchComponent aComponent) {	
-		IProject project = ProjectUtilities.getProject(aComponent);
-		if (project != null && project.isAccessible())
-			return project;
-		return null;
-	}
-	
-	/**
-	 * <p>
-	 * For {@see WorkbenchComponent}s that are contained within a project, the containing project
-	 * can be determined with the {@see WorkbenchComponent}'s fully-qualified module URI.
-	 * </p>
-	 * <p>
-	 * The following method will return the the corresponding project for the supplied module URI,
-	 * if it can be determined.
-	 * </p>
-	 * <p>
-	 * The method will not return an inaccessible project.
-	 * </p>
-	 * <p>
-	 * <b>This method may return null. </b>
-	 * </p>
-	 * 
-	 * @param aModuleURI
-	 *            A valid, fully-qualified module URI
-	 * @return The project that contains the module referenced by the module URI
-	 * @throws UnresolveableURIException
-	 *             If the supplied module URI is invalid or unresolveable.
-	 */
-	public static IProject getContainingProject(URI aModuleURI) throws UnresolveableURIException {
-		ModuleURIUtil.ensureValidFullyQualifiedModuleURI(aModuleURI);
-		String projectName = aModuleURI.segment(ModuleURIUtil.ModuleURI.PROJECT_NAME_INDX);
-		if (projectName == null || projectName.length() == 0)
-			throw new UnresolveableURIException(aModuleURI);
-		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
-		if (project.isAccessible())
-			return project;
-		return null;
-	}
-
-	/**
-	 * <p>
-	 * Returns the corresponding Eclipse IResource, if it can be determined, for the given
-	 * {@see ComponentResource}. The {@see ComponentResource#getSourcePath()} &nbsp;must return a
-	 * valid resource path for This method to return a valid value. The returned value may be either
-	 * an {@see org.eclipse.core.resources.IFile}&nbsp;or {@see org.eclipse.core.resources.IFolder}.
-	 * A client may use the return value of {@see IResource#getType()}&nbsp;to determine what type
-	 * of resource was returned. (@see IResource#FILE} or {@see IResource#FOLDER}).
-	 * </p>
-	 * <p>
-	 * <b>This method may return null. </b>
-	 * </p>
-	 * 
-	 * @param aModuleResource
-	 *            A ComponentResource with a valid sourcePath
-	 * @return The corresponding Eclipse IResource, if available.
-	 */
-	public static IResource getEclipseResource(ComponentResource aModuleResource) {
-		EclipseResourceAdapter eclipseResourceAdapter = (EclipseResourceAdapter) EcoreUtil.getAdapter(aModuleResource.eAdapters(), EclipseResourceAdapter.ADAPTER_TYPE);
-		if (eclipseResourceAdapter != null)
-			return eclipseResourceAdapter.getEclipseResource();
-		eclipseResourceAdapter = new EclipseResourceAdapter();
-		aModuleResource.eAdapters().add(eclipseResourceAdapter);
-		return eclipseResourceAdapter.getEclipseResource();
-	}
-
-	/**
-	 * <p>
-	 * Parses the supplied URI for the deployed name name of the {@see WorkbenchComponent}&nbsp;referenced
-	 * by the URI.
-	 * </p>
-	 * 
-	 * @param aFullyQualifiedModuleURI
-	 *            A valid, fully-qualified module URI
-	 * @return The deployed name of the referenced {@see WorkbenchComponent}
-	 * @throws UnresolveableURIException
-	 *             If the supplied URI is invalid or unresolveable
-	 */
-	public static String getDeployedName(URI aFullyQualifiedModuleURI) throws UnresolveableURIException {
-		return ModuleURIUtil.getDeployedName(aFullyQualifiedModuleURI);
-	}
-
-	//public static ComponentType getComponentType(IVirtualContainer aComponent) {
-	public static ComponentType getComponentType(IVirtualComponent aComponent) {
-		StructureEdit componentCore = null;
-		ComponentType componentType = null;
-		try {
-			componentCore = StructureEdit.getStructureEditForRead(aComponent.getProject());
-			WorkbenchComponent wbComponent = componentCore.getComponent();
-			componentType = wbComponent.getComponentType();
-		} finally {
-			if (componentCore != null)
-				componentCore.dispose();
-		}
-		return componentType;
-	}
-
-	public static IVirtualReference createVirtualReference(IVirtualComponent context, ReferencedComponent referencedComponent) {
-
-		IVirtualComponent targetComponent = null;
-		IProject targetProject = null;
-		URI uri = referencedComponent.getHandle();
-		if (uri == null)
-			return null;
-		boolean isClassPathURI = ModuleURIUtil.isClassPathURI(uri);
-		if( !isClassPathURI ){
-			try { 
-				targetProject = StructureEdit.getContainingProject(uri);
-			} catch(UnresolveableURIException uurie) {
-				//Ignore
-			} 
-			// if the project cannot be resolved, assume it's local - really it probably deleted 
-			
-			targetComponent = ComponentCore.createComponent(targetProject);  
-				
-
-		}else{
-			String archiveType = ""; //$NON-NLS-1$
-			String archiveName = ""; //$NON-NLS-1$
-			try {
-				archiveType = ModuleURIUtil.getArchiveType(uri);
-				archiveName = ModuleURIUtil.getArchiveName(uri);
-				
-			} catch (UnresolveableURIException e) {
-				//Ignore
-			}
-			targetComponent = ComponentCore.createArchiveComponent(context.getProject(), archiveType + IPath.SEPARATOR + archiveName ); 
-		}
-		return new VirtualReference(context, targetComponent, referencedComponent.getRuntimePath(), referencedComponent.getDependencyType().getValue());
-	}
-
-	protected StructureEdit(ModuleCoreNature aNature, boolean toAccessAsReadOnly) {
-		if (toAccessAsReadOnly)
-			structuralModel = aNature.getModuleStructuralModelForRead(this);
-		else
-			structuralModel = aNature.getModuleStructuralModelForWrite(this);
-		aProject = aNature.getProject();
-		isReadOnly = toAccessAsReadOnly;
-		isStructuralModelSelfManaged = true;
-	}
-
-	/**
-	 * <p>
-	 * The following constructor is used to manage an already loaded model. Clients should use the
-	 * following line if they intend to use this constructor: <br>
-	 * <br>
-	 * <code>ModuleCore componentCore = (ModuleCore) aStructuralModel.getAdapter(ModuleCore.ADAPTER_TYPE)</code>.
-	 * </p>
-	 * 
-	 * @param aStructuralModel
-	 *            The edit model to be managed by this ModuleCore
-	 */
-	public StructureEdit(ModuleStructuralModel aStructuralModel) {
-		structuralModel = aStructuralModel;
-		aProject = aStructuralModel.getProject();
-	}
-
-	/**
-	 * <p>
-	 * Force a save of the underlying model. The following method should be used with care. Unless
-	 * required, use {@see #saveIfNecessary(IProgressMonitor) instead.
-	 * </p>
-	 * {@inheritDoc}
-	 * 
-	 * @see org.eclipse.wst.common.componentcore.IEditModelHandler#save()
-	 * @throws IllegalStateException
-	 *             If the ModuleCore object was created as read-only
-	 */
-	public void save(IProgressMonitor aMonitor) {
-		if (isReadOnly)
-			throwAttemptedReadOnlyModification();
-		synchronized (structuralModel) {
-			if (!structuralModel.isDisposed())
-				structuralModel.save(aMonitor, this);
-		}
-	}
-
-	/**
-	 * <p>
-	 * Save the underlying model only if no other clients are currently using the model. If the
-	 * model is not shared, it will be saved. If it is shared, the save will be deferred.
-	 * </p>
-	 * {@inheritDoc}
-	 * 
-	 * @see org.eclipse.wst.common.componentcore.IEditModelHandler#saveIfNecessary()
-	 * @throws IllegalStateException
-	 *             If the ModuleCore object was created as read-only
-	 */
-	public void saveIfNecessary(IProgressMonitor aMonitor) {
-		if (isReadOnly)
-			throwAttemptedReadOnlyModification();
-		synchronized (structuralModel) {
-			if (!structuralModel.isDisposed())
-				structuralModel.saveIfNecessary(aMonitor, this);
-		}
-	}
-
-	/**
-	 * <p>
-	 * Clients must call the following method when they have finished using the model, even if the
-	 * ModuleCore edit facade was created as read-only.
-	 * </p>
-	 * {@inheritDoc}
-	 * 
-	 * @see org.eclipse.wst.common.componentcore.IEditModelHandler#dispose()
-	 */
-	public void dispose() {
-		
-		if (isStructuralModelSelfManaged) {
-			synchronized (structuralModel) {
-				if (!structuralModel.isDisposed()) {
-					structuralModel.releaseAccess(this);
-				}
-			}
-			
-		}
-		if (dependentCores.size() > 0) {
-			synchronized (dependentCores) {
-				for (Iterator cores = dependentCores.values().iterator(); cores.hasNext();)
-					((StructureEdit) cores.next()).dispose();
-			}
-		}
-	}
-
-	/**
-	 * <p>
-	 * Creates a default WTP Module Structural Metamodel file if necessary.
-	 * </p>
-	 */
-	public void prepareProjectComponentsIfNecessary() {
-		
-		synchronized (structuralModel) {
-			if (!structuralModel.isDisposed()) {
-				try {
-					structuralModel.prepareProjectModulesIfNecessary();
-				} catch (CoreException e) {
-					// TODO Auto-generated catch block
-					e.printStackTrace();
-				}
-			}
-		}
-	}
-
-	/**
-	 * <p>
-	 * When loaded for write, the current ModuleCore may return the root object, which can be used
-	 * to add or remove {@see WorkbenchComponent}s. If a client needs to just read the existing
-	 * {@see WorkbenchComponent}s, use {@see #getWorkbenchModules()}.
-	 * </p>
-	 * 
-	 * @return The root object of the underlying model
-	 */
-	public ProjectComponents getComponentModelRoot() {
-		ProjectComponents comps = null;
-		synchronized (structuralModel) {
-			if (!structuralModel.isDisposed())
-				comps = (ProjectComponents) structuralModel.getPrimaryRootObject();
-		}
-		return comps;
-	}
-
-	/**
-	 * <p>
-	 * Return the an array of ComponentResource which basically represent the source containers of a
-	 * WorkbenchResource.
-	 * <p>
-	 * 
-	 * @param component
-	 * @return
-	 */
-	public ComponentResource[] getSourceContainers(WorkbenchComponent component) {
-		// TODO Api in progress: Need to return the Java Source containers of the project
-		// TODO MDE: I don't know if I agree with the placement of this method.
-		return null;
-	}
-
-	/**
-	 * <p>
-	 * Clients that wish to modify the individual {@see WorkbenchComponent}&nbsp;instances may use
-	 * this method. If clients need to add or remove {@see WorkbenchComponent}&nbsp;instances, use
-	 * {@see #getProjectModules()}&nbsp;to get the root object and then access the contained
-	 * {@see WorkbenchComponent}s through {@see ProjectComponents#getWorkbenchModules()}.
-	 * 
-	 * @return The WorkbenchModules of the underlying model, if any.
-	 */
-	public WorkbenchComponent[] getWorkbenchModules() {
-		ProjectComponents pc = getComponentModelRoot();
-		if(pc != null) {
-			List wbModules = pc.getComponents();
-			return (WorkbenchComponent[]) wbModules.toArray(new WorkbenchComponent[wbModules.size()]);
-		}
-		return NO_COMPONENTS;
-	}
-
-	/**
-	 * <p>
-	 * Create a {@see WorkbenchComponent}&nbsp;with the given deployed name. The returned module
-	 * will be contained by the root object of the current ModuleCore (so no need to re-add it to
-	 * the Module Module root object). The current ModuleCore must not be read-only to invoke This
-	 * method.
-	 * </p>
-	 * 
-	 * @param aDeployName
-	 *            A non-null String that will be assigned as the deployed-name
-	 * @return A {@see WorkbenchComponent}associated with the current ModuleCore with the supplied
-	 *         deployed name
-	 * @throws IllegalStateException
-	 *             If the current ModuleCore was created as read-only
-	 */
-	public WorkbenchComponent createWorkbenchModule(String aDeployName) {
-		if (isReadOnly)
-			throwAttemptedReadOnlyModification();
-		WorkbenchComponent module = COMPONENT_FACTORY.createWorkbenchComponent();
-		module.setName(aDeployName);
-		getComponentModelRoot().getComponents().add(module);
-		return module;
-	}
-
-	/**
-	 * <p>
-	 * Create a {@see ComponentResource}&nbsp;with the sourcePath of aResource. The current
-	 * ModuleCore must not be read-only to invoke This method.
-	 * </p>
-	 * 
-	 * @param aModule
-	 *            A non-null {@see WorkbenchComponent}to contain the created
-	 *            {@see ComponentResource}
-	 * @param aResource
-	 *            A non-null IResource that will be used to set the sourcePath
-	 * @return A {@see ComponentResource}associated with the current ModuleCore with its sourcePath
-	 *         equivalent to aResource
-	 * @throws IllegalStateException
-	 *             If the current ModuleCore was created as read-only
-	 */
-	public ComponentResource createWorkbenchModuleResource(IResource aResource) {
-		if (isReadOnly)
-			throwAttemptedReadOnlyModification();
-
-		ComponentResource moduleResource = COMPONENT_FACTORY.createComponentResource(); 
-		moduleResource.setSourcePath(aResource.getProjectRelativePath().makeAbsolute());
-		return moduleResource;
-	}
-
-	/**
-	 * <p>
-	 * Create a {@see ComponentType}&nbsp;with the sourcePath of aResource. The returned resource
-	 * will be associated with the current ModuleCore. The current ModuleCore must not be read-only
-	 * to invoke This method.
-	 * </p>
-	 * 
-	 * @param aResource
-	 *            A non-null IResource that will be used to set the sourcePath
-	 * @return A {@see ComponentResource}associated with the current ModuleCore with its sourcePath
-	 *         equivalent to aResource
-	 * @throws IllegalStateException
-	 *             If the current ModuleCore was created as read-only
-	 */
-	public ComponentType createModuleType(String aModuleTypeId) {
-		if (isReadOnly)
-			throwAttemptedReadOnlyModification();
-
-		ComponentType moduleType = COMPONENT_FACTORY.createComponentType();
-		moduleType.setComponentTypeId(aModuleTypeId);
-		return moduleType;
-	}
-
-	/**
-	 * <p>
-	 * Search the given module (indicated by aModuleURI) for the {@see ComponentResource}s
-	 * identified by the module-relative path (indicated by aDeployedResourcePath).
-	 * </p>
-	 * @deprecated To be removed at next Integration Build 04/14/05 MDE. No substitute. (No clients).
-	 * 
-	 * @param aModuleURI
-	 *            A valid, fully-qualified module URI
-	 * @param aDeployedResourcePath
-	 *            A module-relative path to a deployed file
-	 * @return An array of WorkbenchModuleResources that contain the URI specified by the
-	 *         module-relative aDeployedResourcePath
-	 * @throws UnresolveableURIException
-	 *             If the supplied module URI is invalid or unresolveable.
-	 */
-	public ComponentResource[] findResourcesByRuntimePath(URI aModuleURI, URI aDeployedResourcePath) throws UnresolveableURIException {
-		WorkbenchComponent module = getComponent();
-		return module.findResourcesByRuntimePath(new Path(aDeployedResourcePath.path()));
-	} 
-
-	/**
-	 * <p>
-	 * Search the the module (indicated by the root of aModuleResourcePath) for the
-	 * {@see ComponentResource}s identified by the module-qualified path (indicated by
-	 * aDeployedResourcePath).
-	 * </p>
-	 * @deprecated To be removed at next Integration Build 04/14/05 MDE Use IPath Signature instead.
-	 * 
-	 * @param aModuleResourcePath
-	 *            A valid fully-qualified URI of a deployed resource within a specific
-	 *            WorkbenchComponent
-	 * @return An array of WorkbenchModuleResources that contain the URI specified by
-	 *         aModuleResourcePath
-	 * @throws UnresolveableURIException
-	 *             If the supplied module URI is invalid or unresolveable.
-	 */
-	public ComponentResource[] findResourcesByRuntimePath(URI aModuleResourcePath) throws UnresolveableURIException {
-
-		URI deployedURI = ModuleURIUtil.trimToDeployPathSegment(aModuleResourcePath);
-		IPath deployedPath = new Path(deployedURI.path());
-		return findResourcesByRuntimePath(ModuleURIUtil.getDeployedName(aModuleResourcePath), deployedPath);
-	}
-	
-	/**
-	 * <p>
-	 * Search the the module (indicated by the root of aModuleResourcePath) for the
-	 * {@see ComponentResource}s identified by the module-qualified path (indicated by
-	 * aDeployedResourcePath).
-	 * </p> 
-	 * 
-	 * @param aModuleResourcePath
-	 *            A valid fully-qualified URI of a deployed resource within a specific
-	 *            WorkbenchComponent
-	 * @return An array of WorkbenchModuleResources that contain the URI specified by
-	 *         aModuleResourcePath
-	 * @throws UnresolveableURIException
-	 *             If the supplied module URI is invalid or unresolveable.
-	 */
-	public ComponentResource[] findResourcesByRuntimePath(String aModuleName, IPath aModuleResourcePath) {   
-		WorkbenchComponent module = getComponent();
-		return module.findResourcesByRuntimePath(aModuleResourcePath);
-	}
-	public ComponentResource[] findResourcesBySourcePath(URI aWorkspaceRelativePath) throws UnresolveableURIException {
-		return findResourcesBySourcePath(aWorkspaceRelativePath,ResourceTreeNode.CREATE_NONE);
-	}
-	/**
-	 * <p>
-	 * Locates the {@see ComponentResource}s that contain the supplied resource in their source
-	 * path. There are no representations about the containment of the {@see ComponentResource}s
-	 * which are returned. The only guarantee is that the returned elements are contained within the
-	 * same project.
-	 * </p>
-	 * <p>
-	 * The sourcePath of each {@see ComponentResource}&nbsp;will be mapped to either an IFile or an
-	 * IFolder. As a result, if the {@see ComponentResource}&nbsp;is a container mapping, the path
-	 * of the supplied resource may not be identical the sourcePath of the {@see ComponentResource}.
-	 * </p>
-	 * @deprecated To be removed at next Integration Build 04/14/05 MDE Use IPath Signature instead.
-	 * 
-	 * @param aWorkspaceRelativePath
-	 *            A valid fully-qualified workspace-relative path of a given resource
-	 * @return An array of WorkbenchModuleResources which have sourcePaths that contain the given
-	 *         resource
-	 * @throws UnresolveableURIException
-	 *             If the supplied module URI is invalid or unresolveable.
-	 */
-	public ComponentResource[] findResourcesBySourcePath(URI aWorkspaceRelativePath, int resourceFlag) throws UnresolveableURIException {
-		return findResourcesBySourcePath(new Path(aWorkspaceRelativePath.path()),resourceFlag);
-	}	
-	public ComponentResource[] findResourcesBySourcePath(IPath aProjectRelativePath) throws UnresolveableURIException {
-		return findResourcesBySourcePath(aProjectRelativePath,ResourceTreeNode.CREATE_NONE);
-	}
-	/**
-	 * <p>
-	 * Locates the {@see WorkbenchComponent}s that contains the resource with the given source
-	 * path. There are no representations about the containment of the {@see ComponentResource}s
-	 * which are returned. The only guarantee is that the returned elements are contained within the
-	 * same project.
-	 * </p>
-	 * <p>
-	 * The sourcePath of each {@see ComponentResource}&nbsp;will be mapped to either an IFile or an
-	 * IFolder. As a result, if the {@see ComponentResource}&nbsp;is a container mapping, the path
-	 * of the supplied resource may not be identical the sourcePath of the {@see ComponentResource}.
-	 * </p> 
-	 * 
-	 * @param aProjectRelativePath
-	 *            A valid project-relative path of a given resource
-	 *        resourceFlag
-	 *        	  A bit flag that determines if Resources should be created during the search
-	 *        		CREATE_NONE 
-	 * 				CREATE_RESOURCE_ALWAYS
-	 * 				CREATE_TREENODE_IFNEC
-	 * @return An array of WorkbenchModuleResources which have sourcePaths that contain the given
-	 *         resource
-	 * @throws UnresolveableURIException
-	 *             If the supplied module URI is invalid or unresolveable.
-	 */
-	public WorkbenchComponent findComponent(IPath aProjectRelativeResourcePath, int resourceFlag) throws UnresolveableURIException {
-		ProjectComponents projectModules = getComponentModelRoot();
-		EList modules = projectModules.getComponents();
-
-		WorkbenchComponent module = null;
-		boolean resourceExists = false;
-		for (int i = 0; i < modules.size(); i++) {
-			module = (WorkbenchComponent) modules.get(i);
-			resourceExists = module.exists(aProjectRelativeResourcePath,resourceFlag);
-			if (!resourceExists && aProjectRelativeResourcePath.segments().length > 1) { 
-				resourceExists = module.exists(aProjectRelativeResourcePath.removeFirstSegments(1),resourceFlag);
-			}
-		if (resourceExists)
-			return module;
-		}
-		return null;
-	}
-	/**
-	 * <p>
-	 * Locates the {@see ComponentResource}s that contain the supplied resource in their source
-	 * path. There are no representations about the containment of the {@see ComponentResource}s
-	 * which are returned. The only guarantee is that the returned elements are contained within the
-	 * same project.
-	 * </p>
-	 * <p>
-	 * The sourcePath of each {@see ComponentResource}&nbsp;will be mapped to either an IFile or an
-	 * IFolder. As a result, if the {@see ComponentResource}&nbsp;is a container mapping, the path
-	 * of the supplied resource may not be identical the sourcePath of the {@see ComponentResource}.
-	 * </p> 
-	 * 
-	 * @param aProjectRelativePath
-	 *            A valid project-relative path of a given resource
-	 *         resourceFlag
-	 *        	  A bit flag that determines if Resources should be created during the search
-	 *        		CREATE_NONE 
-	 * 				CREATE_RESOURCE_ALWAYS
-	 * 				CREATE_TREENODE_IFNEC
-	 * @return An array of WorkbenchModuleResources which have sourcePaths that contain the given
-	 *         resource
-	 * @throws UnresolveableURIException
-	 *             If the supplied module URI is invalid or unresolveable.
-	 */
-	public ComponentResource[] findResourcesBySourcePath(IPath aProjectRelativePath, int resourceFlag) throws UnresolveableURIException {
-		ProjectComponents projectModules = getComponentModelRoot();
-		if (projectModules==null)
-			return NO_RESOURCES;
-		EList modules = projectModules.getComponents();
-
-		WorkbenchComponent module = null;
-		ComponentResource[] resources = null;
-		List foundResources = new ArrayList();
-		for (int i = 0; i < modules.size(); i++) {
-			module = (WorkbenchComponent) modules.get(i);
-			resources = module.findResourcesBySourcePath(aProjectRelativePath,resourceFlag);
-			if (resources != null && resources.length != 0)
-				foundResources.addAll(Arrays.asList(resources));
-			else if (aProjectRelativePath.segments().length > 1) { 
-				resources = module.findResourcesBySourcePath(aProjectRelativePath.removeFirstSegments(1),resourceFlag);
-				if (resources != null && resources.length != 0)
-					foundResources.addAll(Arrays.asList(resources));
-			}
-		}
-		if (foundResources.size() > 0)
-			return (ComponentResource[]) foundResources.toArray(new ComponentResource[foundResources.size()]);
-		return NO_RESOURCES;
-	}
-
-	/**
-	 * <p>
-	 * Returns the {@see WorkbenchComponent}&nbsp;contained by the current ModuleCore with the
-	 * deploy name aModuleName.
-	 * </p>
-	 * <p>
-	 * <b>This method may return null. </b>
-	 * </p>
-	 * 
-	 * @param aModuleName
-	 * @return The {@see WorkbenchComponent}contained by the current ModuleCore with the deploy
-	 *         name aModuleName
-	 * @see WorkbenchComponent#getDeployedName()
-	 * @deprecated - Use getComponent() - Only one component per project
-	 */
-	public WorkbenchComponent findComponentByName(String aModuleName) {
-		return getComponentModelRoot() != null ? getComponentModelRoot().findWorkbenchModule(aModuleName) : null;
-	}
-
-	/**
-	 * <p>
-	 * Locate and return the {@see WorkbenchComponent}&nbsp;referenced by the fully-qualified
-	 * aModuleURI. The method will work correctly even if the requested {@see WorkbenchComponent}
-	 * &nbsp;is contained by another project.
-	 * </p>
-	 * 
-	 * @param aModuleURI
-	 *            A valid, fully-qualified module URI
-	 * @return The {@see WorkbenchComponent}referenced by aModuleURI
-	 * @throws UnresolveableURIException
-	 *             If the supplied module URI is invalid or unresolveable.
-	 * @see WorkbenchComponent#getHandle()
-	 */
-	public WorkbenchComponent findComponentByURI(URI aModuleURI) throws UnresolveableURIException {
-		if(aModuleURI.scheme() == null && aModuleURI.segmentCount() == 1)
-			return getComponent();
-		ModuleURIUtil.ensureValidFullyQualifiedModuleURI(aModuleURI);
-		String projectName = aModuleURI.segment(ModuleURIUtil.ModuleURI.PROJECT_NAME_INDX);
-		/* Accessing a local module */
-		if (getProject().getName().equals(projectName)) {
-			return getComponent();
-		}
-		return getDependentModuleCore(aModuleURI).getComponent();
-	}
-
-	/**
-	 * <p>
-	 * Searches the available {@see WorkbenchComponent}s as available through
-	 * {@see #getWorkbenchModules()}&nbsp;for {@see WorkbenchComponent}s that have a
-	 * {@see WorkbenchComponent#getModuleType()}with a a module type Id as specified by
-	 * aModuleTypeId.
-	 * </p>
-	 * 
-	 * @param aModuleTypeId
-	 *            A non-null module type id ({@see ComponentType#getModuleTypeId()})
-	 * @return A non-null array of the {@see WorkbenchComponent}s that match the given module type
-	 *         id
-	 */
-//	public WorkbenchComponent[] findComponentsByType(String aModuleTypeId) {
-//		WorkbenchComponent[] availableModules = getWorkbenchModules();
-//		ComponentType moduleType;
-//		List results = new ArrayList();
-//		for (int i = 0; i < availableModules.length; i++) {
-//			moduleType = availableModules[i].getComponentType();
-//			if (moduleType != null && aModuleTypeId.equals(moduleType.getComponentTypeId()))
-//				results.add(availableModules[i]);
-//		}
-//		if (results.size() == 0)
-//			return NO_MODULES;
-//		return (WorkbenchComponent[]) results.toArray(new WorkbenchComponent[results.size()]);
-//	}
-	
-	/**
-	 * Find and return the ReferencedComponent that represents the depedency from aComponent to aReferencedComponent.
-	 * <p>This method could return null.</p>
-	 * @param aComponent
-	 * @param aReferencedComponent
-	 * @return
-	 */
-	public ReferencedComponent findReferencedComponent(WorkbenchComponent aComponent, WorkbenchComponent aReferencedComponent) {
-		if(aComponent == null || aReferencedComponent == null)
-			return null;
-		
-		IProject referencedProject = getContainingProject(aReferencedComponent);
-		EList referencedComponents = aComponent.getReferencedComponents();
-		String dependentProjectName = null;
-		for (Iterator iter = referencedComponents.iterator(); iter.hasNext();) {
-			ReferencedComponent referencedComponent = (ReferencedComponent) iter.next();
-			dependentProjectName = referencedComponent.getHandle().segment(ModuleURIUtil.ModuleURI.PROJECT_NAME_INDX);
-			if(referencedProject.getName().equals(dependentProjectName)) 
-				return referencedComponent;			
-			
-		}
-		return null;
-	}
-
-	/**
-	 * <p>
-	 * Returns true if the {@see ReferencedComponent}&nbsp;references a {@see WorkbenchComponent}(
-	 * {@see ReferencedComponent#getHandle()}) which is contained by the project that the current
-	 * ModuleCore is managing. The following method will determine if the dependency can be
-	 * satisfied by the current project.
-	 * </p>
-	 * 
-	 * @param aDependentModule
-	 * @return True if the {@see ReferencedComponent}references a {@see WorkbenchComponent}managed
-	 *         directly by the current ModuleCore
-	 */
-	public boolean isLocalDependency(ReferencedComponent aDependentModule) {
-		if (aDependentModule == null || aDependentModule.getHandle()==null)
-			return false;
-		URI dependentHandle = aDependentModule.getHandle();
-		// with no scheme and a simple name, the referenced component must be local
-		if(dependentHandle.scheme() == null && dependentHandle.segmentCount() == 1)  
-			return true; 
-		try {
-
-			String localProjectName = getProject().getName();
-			if(ModuleURIUtil.ensureValidFullyQualifiedModuleURI(dependentHandle, false)) {
-				String dependentProjectName = aDependentModule.getHandle().segment(ModuleURIUtil.ModuleURI.PROJECT_NAME_INDX);
-				return localProjectName.equals(dependentProjectName);
-			}
-		} catch (UnresolveableURIException e) {
-			// Ignore
-		}
-		return false;
-	}
-
-	/**
-	 * @param aModuleURI
-	 *            A valid, fully-qualified module URI
-	 * @return The ModuleCore facade for the supplied URI
-	 * @throws UnresolveableURIException
-	 *             If the supplied module URI is invalid or unresolveable.
-	 */
-	private StructureEdit getDependentModuleCore(URI aModuleURI) throws UnresolveableURIException {
-		StructureEdit dependentCore = (StructureEdit) dependentCores.get(aModuleURI);
-		if (dependentCore != null)
-			return dependentCore;
-		synchronized (dependentCores) {
-			dependentCore = (StructureEdit) dependentCores.get(aModuleURI);
-			if (dependentCore == null) {
-				IProject container = getContainingProject(aModuleURI);
-				if (container != null) {
-					dependentCore = getStructureEditForRead(container);
-					dependentCores.put(aModuleURI, dependentCore);
-				} else
-					throw new UnresolveableURIException(aModuleURI);
-			}
-		}
-		return dependentCore;
-	}
-
-	private void throwAttemptedReadOnlyModification() {
-		throw new IllegalStateException("Attempt to modify a ModuleCore edit facade that was loaded as read-only.");
-	}
-
-	/**
-	 * temporary method to return first module in the project
-	 * 
-	 * @return first module in the project
-	 * @deprecated
-	 */
-	public WorkbenchComponent getFirstModule() {
-		return getComponent();
-	}
-	/**
-	 * returns the one and only component in the project
-	 * 
-	 * @return the component in the project if exists or null
-	 * 
-	 */
-	public WorkbenchComponent getComponent() {
-		if (getWorkbenchModules().length > 0)
-			return getWorkbenchModules()[0];
-		return null;
-	}
-
-	public static URI createComponentURI(IProject aContainingProject, String aComponentName) {
-		return URI.createURI(PlatformURLModuleConnection.MODULE_PROTOCOL + IPath.SEPARATOR + PlatformURLModuleConnection.RESOURCE_MODULE + aContainingProject.getName() + IPath.SEPARATOR + aComponentName);
-	}
-
-	
-	protected IProject getProject() {
-		return aProject;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/WorkbenchComponent.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/WorkbenchComponent.java
deleted file mode 100644
index f84bbf8..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/WorkbenchComponent.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc --> 
- * An EMF representation of a development-time module contained by an Eclipse project. 
- * <p> 
- * See the package overview for an <a href="package-summary.html">overview of the model components</a>.
- * </p>
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.WorkbenchComponent#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.WorkbenchComponent#getResources <em>Resources</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.WorkbenchComponent#getComponentType <em>Component Type</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.WorkbenchComponent#getReferencedComponents <em>Referenced Components</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.WorkbenchComponent#getProperties <em>Properties</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.WorkbenchComponent#getMetadataResources <em>Metadata Resources</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.wst.common.componentcore.internal.ComponentcorePackage#getWorkbenchComponent()
- * @model
- * @generated
- */
-public interface WorkbenchComponent extends EObject{
-	/**
-	 * Returns the value of the '<em><b>Name</b></em>' attribute.
-	 * The default value is <code>""</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.wst.common.componentcore.internal.ComponentcorePackage#getWorkbenchComponent_Name()
-	 * @model default="" required="true"
-	 * @generated
-	 */
-	String getName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.wst.common.componentcore.internal.WorkbenchComponent#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>Resources</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.wst.common.componentcore.internal.ComponentResource}.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.wst.common.componentcore.internal.ComponentResource#getComponent <em>Component</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Resources</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>Resources</em>' containment reference list.
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentcorePackage#getWorkbenchComponent_Resources()
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentResource#getComponent
-	 * @model type="org.eclipse.wst.common.componentcore.internal.ComponentResource" opposite="component" containment="true"
-	 * @generated
-	 */
-	EList getResources();
-
-	/**
-	 * 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>' 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(ComponentType)
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentcorePackage#getWorkbenchComponent_ComponentType()
-	 * @model containment="true" required="true"
-	 * @generated
-	 */
-	ComponentType getComponentType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.wst.common.componentcore.internal.WorkbenchComponent#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(ComponentType value);
-
-	/**
-	 * Returns the value of the '<em><b>Referenced Components</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.wst.common.componentcore.internal.ReferencedComponent}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Referenced Components</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>Referenced Components</em>' containment reference list.
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentcorePackage#getWorkbenchComponent_ReferencedComponents()
-	 * @model type="org.eclipse.wst.common.componentcore.internal.ReferencedComponent" containment="true"
-	 * @generated
-	 */
-	EList getReferencedComponents();
-
-	/**
-	 * Returns the value of the '<em><b>Properties</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.wst.common.componentcore.internal.Property}.
-	 * <!-- 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.wst.common.componentcore.internal.ComponentcorePackage#getWorkbenchComponent_Properties()
-	 * @model type="org.eclipse.wst.common.componentcore.internal.Property"
-	 * @generated
-	 */
-	EList getProperties();
-
-	/**
-	 * Returns the value of the '<em><b>Metadata Resources</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.core.runtime.IPath}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Metadata Resources</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>Metadata Resources</em>' attribute list.
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentcorePackage#getWorkbenchComponent_MetadataResources()
-	 * @model type="org.eclipse.core.runtime.IPath" dataType="org.eclipse.wst.common.componentcore.internal.IPath"
-	 * @generated
-	 */
-	EList getMetadataResources();
-
-	URI getHandle();
-
-	ComponentResource[] findResourcesByRuntimePath(IPath aDeployPath);
-	
-	ComponentResource[] findResourcesBySourcePath(IPath aSourcePath, int resourceFlag);
-	
-	boolean exists(IPath aSourcePath, int resourceFlag);
-
-} // WorkbenchComponent
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraph.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraph.java
deleted file mode 100644
index e811f34..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraph.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.builder;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.resources.IProject;
-
-public class DependencyGraph {
-	
-	private static final DependencyGraph INSTANCE = new DependencyGraph();
-	
-	private final Map dependencies = new HashMap();
-	
-	public static DependencyGraph getInstance() {
-		return INSTANCE;
-	}
-
-	public IProject[] getReferencingComponents(IProject target) {
-		Set referencingComponents = internalGetReferencingComponents(target);
-		return (IProject[]) referencingComponents.toArray(new IProject[referencingComponents.size()]);
-	}
-	
-	public void addReference(IProject target, IProject referencingComponent) {
-		internalGetReferencingComponents(target).add(referencingComponent);
-	}
-	
-	public void removeReference(IProject target, IProject referencingComponent) {
-		internalGetReferencingComponents(target).remove(referencingComponent);
-		
-	}
-	
-	protected Set internalGetReferencingComponents(IProject target) {
-		Set referencingComponents = (Set) dependencies.get(target);
-		if(referencingComponents == null) 
-			dependencies.put(target, (referencingComponents = new HashSet()));
-		return referencingComponents;
-	}
-	
-	public void clear() {
-		dependencies.clear();
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraphManager.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraphManager.java
deleted file mode 100644
index b646364..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraphManager.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.builder;
-
-import java.util.HashMap;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
-
-public class DependencyGraphManager {
-
-	private static DependencyGraphManager INSTANCE = null;
-	private HashMap wtpModuleTimeStamps = null;
-	
-	private DependencyGraphManager() {
-		super();
-	}
-	
-	public static final DependencyGraphManager getInstance() {
-		if (INSTANCE == null) {
-			INSTANCE = new DependencyGraphManager();
-			INSTANCE.constructIfNecessary();
-		}
-		return INSTANCE;
-	}
-	
-	public void construct(IProject project) {
-		if (project!=null && project.isAccessible() && project.findMember(IModuleConstants.COMPONENT_FILE_PATH) !=null) //$NON-NLS-1$
-			constructIfNecessary();
-	}
-	
-	private void constructIfNecessary() {
-		// Block other clients here while we are building
-		synchronized (this) {
-			if (moduleTimeStampsChanged()) {
-				cleanDependencyGraph();
-				buildDependencyGraph();
-			}
-		}
-	}
-	
-	private boolean moduleTimeStampsChanged() {
-		HashMap workspaceTimeStamps = collectModuleTimeStamps();
-		if (getWtpModuleTimeStamps().equals(workspaceTimeStamps))
-			return false;
-		return true;
-	}
-	
-	private HashMap collectModuleTimeStamps() {
-		HashMap timeStamps = new HashMap();
-		IProject[] projects = ProjectUtilities.getAllProjects();
-		for (int i=0; i<projects.length; i++) {
-			if (projects[i]==null || !projects[i].isAccessible())
-				continue;
-			IResource wtpModulesFile = projects[i].findMember(IModuleConstants.COMPONENT_FILE_PATH); //$NON-NLS-1$
-			if (wtpModulesFile != null) {
-				Long currentTimeStamp = new Long(wtpModulesFile.getLocalTimeStamp());
-				timeStamps.put(projects[i],currentTimeStamp);
-			}
-		}
-		return timeStamps;
-	}
-	
-	private void buildDependencyGraph() {
-		IProject[] projects = ProjectUtilities.getAllProjects();
-		for (int k=0; k<projects.length; k++) {
-			
-			if (!projects[k].isAccessible() || !addTimeStamp(projects[k])) 
-				continue;
-			IVirtualComponent component= ComponentCore.createComponent(projects[k]);
-			if (component == null) continue;
-			addDependencyReference(component);
-		}
-	}
-	
-	private void addDependencyReference(IVirtualComponent component) {
-		IProject componentProject = component.getProject();
-		IVirtualReference[] depRefs = component.getReferences();
-		for(int i = 0; i<depRefs.length; i++){
-			IVirtualComponent targetComponent = depRefs[i].getReferencedComponent();
-			if (targetComponent!=null) {
-				IProject targetProject = targetComponent.getProject();
-				DependencyGraph.getInstance().addReference(targetProject,componentProject);
-			}	
-		}
-		
-	}
-	
-	private boolean addTimeStamp(IProject project) {
-		// Get the .component file for the given project
-		IResource wtpModulesFile = project.findMember(IModuleConstants.COMPONENT_FILE_PATH); //$NON-NLS-1$
-		if (wtpModulesFile==null)
-			return false;
-		Long currentTimeStamp = new Long(wtpModulesFile.getLocalTimeStamp());
-		getWtpModuleTimeStamps().put(project,currentTimeStamp);
-		return true;
-	}
-	
-	private void cleanDependencyGraph() {
-		DependencyGraph.getInstance().clear();
-		getWtpModuleTimeStamps().clear();
-	}
-
-	/**
-	 * Lazy initialization and return of the key valued pair of projects and wtp modules file
-	 * timestamps.
-	 * 
-	 * @return HashMap of projects to .component file stamps
-	 */
-	private HashMap getWtpModuleTimeStamps() {
-		if (wtpModuleTimeStamps == null)
-			wtpModuleTimeStamps = new HashMap();
-		return wtpModuleTimeStamps;
-	}
-	
-	/**
-	 * Return the dependency graph which was initialized if need be in the 
-	 * singleton manager method.
-	 */ 
-	public DependencyGraph getDependencyGraph() {
-		constructIfNecessary();
-		return DependencyGraph.getInstance();
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ArtifactEditModelFactory.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ArtifactEditModelFactory.java
deleted file mode 100644
index aad88e4..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ArtifactEditModelFactory.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.impl;
-
-import java.util.Map;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.wst.common.componentcore.internal.ArtifactEditModel;
-import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
-import org.eclipse.wst.common.internal.emfworkbench.integration.EditModel;
-import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelFactory;
-
-/**
- * <p>
- * The following class is experimental until fully documented.
- * </p>
- */
-public class ArtifactEditModelFactory extends EditModelFactory {
-	
-	public static final String MODULE_EDIT_MODEL_ID = "org.eclipse.wst.modulecore.editModel"; //$NON-NLS-1$
-	
-	public static final String PARAM_MODULE_URI = "MODULE_URI"; //$NON-NLS-1$
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emfworkbench.integration.EditModelFactory#createEditModelForRead(java.lang.String, org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext, java.util.Map)
-	 */
-	public EditModel createEditModelForRead(String editModelID, EMFWorkbenchContext context, Map params) {
-		URI moduleURI = (URI) ((params != null) ? params.get(PARAM_MODULE_URI) : null);
-		if(moduleURI == null)
-			throw new IllegalStateException("A Module URI must be provided");
-		
-		return  new ArtifactEditModel(editModelID, context, true, moduleURI);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emfworkbench.integration.EditModelFactory#createEditModelForWrite(java.lang.String, org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext, java.util.Map)
-	 */
-	public EditModel createEditModelForWrite(String editModelID, EMFWorkbenchContext context, Map params) {
-		URI moduleURI = (URI) ((params != null) ? params.get(PARAM_MODULE_URI) : null);
-		if(moduleURI == null)
-			throw new IllegalStateException("A Module URI must be provided");
-		return  new ArtifactEditModel(editModelID, context, false,false, moduleURI);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emfworkbench.integration.EditModelFactory#getCacheID(java.lang.String, java.util.Map)
-	 */
-	public String getCacheID(String editModelID, Map params) { 
-		URI moduleURI = (URI)params.get(PARAM_MODULE_URI);
-		if(moduleURI != null)
-			return editModelID+":"+moduleURI.toString(); //$NON-NLS-1$
-		return editModelID+":NOURI"; //$NON-NLS-1$
-	}
-
-	
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ComponentCoreURIConverter.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ComponentCoreURIConverter.java
deleted file mode 100644
index 1b94880..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ComponentCoreURIConverter.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.impl;
-
-import java.io.IOException;
-import java.util.Collections;
-
-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.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.jem.util.emf.workbench.ResourceSetWorkbenchSynchronizer;
-import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.internal.StructureEdit;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
-import org.eclipse.wst.common.internal.emfworkbench.CompatibilityWorkbenchURIConverterImpl;
-import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
-
-/**
- * <p>
- * The following class is experimental until fully documented.
- * </p>
- */
-public class ComponentCoreURIConverter extends CompatibilityWorkbenchURIConverterImpl {
-	
-	private IProject containingProject;
-	private IFolder archiveRoot;
-	/**
-	 *  
-	 */
-	public ComponentCoreURIConverter() {
-		super();
-	}
-
-	/**
-	 * @param anInputContainer
-	 */
-	public ComponentCoreURIConverter(IProject aContainingProject) {
-		super();
-		containingProject = aContainingProject;
-	}
-
-	/**
-	 * @param aContainer
-	 * @param aSynchronizer
-	 */
-	public ComponentCoreURIConverter(IProject aContainingProject, ResourceSetWorkbenchSynchronizer aSynchronizer) {
-		super(aContainingProject, aSynchronizer);
-		containingProject = aContainingProject;
-	} 
- 
-	public IVirtualComponent findComponent(IResource res) {
-		
-		if (res != null && res.exists())
-			return ComponentCore.createComponent(res.getProject());
-		return null;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jem.util.emf.workbench.WorkbenchURIConverterImpl#normalize(org.eclipse.emf.common.util.URI)
-	 */
-	public URI normalize(URI aURI) {
-		URI normalizedURI = null;
-		if(PlatformURLModuleConnection.MODULE.equals(aURI.scheme())) { 		
-			try {
-				normalizedURI = PlatformURLModuleConnection.resolve(aURI);
-			} catch(IOException ioe) {
-				ioe.printStackTrace();
-			} 
-		} else {
-			normalizedURI = super.normalize(aURI);
-		}
-		if(normalizedURI == null) {
-			normalizedURI = newPlatformURI(aURI);
-		}
-		else if(normalizedURI.scheme() == null || normalizedURI.scheme().length() == 0) {
-			normalizedURI = URI.createPlatformResourceURI(getInputContainer().getFullPath().append(normalizedURI.toString()).toString());	
-		}
-		return normalizedURI;
-	}
-	
-	private URI newPlatformURI(URI aNewURI) {
-		
-		try {
-			String componentName = StructureEdit.getDeployedName(aNewURI);
-			IVirtualComponent component = ComponentCore.createComponent(containingProject);
-
-			URI deployPathSegment = ModuleURIUtil.trimToDeployPathSegment(aNewURI);
-			
-			//IVirtualFile newFile = component.getFile(new Path(deployPathSegment.path()));			
-			IVirtualFolder rootFolder = component.getRootFolder();
-			IVirtualFile newFile = rootFolder.getFile(new Path(deployPathSegment.path()));
-			
-			return URI.createPlatformResourceURI(newFile.getWorkspaceRelativePath().toString());
-			 
-		} catch(Exception e) {
-			e.printStackTrace();
-		}
-		return null;
-	}
-
-	/**
-	 * @see com.ibm.etools.xmi.helpers.CompatibilityURIConverter#deNormalize(URI)
-	 */
-	public URI deNormalize(URI uri) {
-		if (WorkbenchResourceHelperBase.isPlatformResourceURI(uri)) {
-			IFile aFile = WorkbenchResourceHelper.getPlatformFile(uri);
-			
-			if (aFile != null) {
-				IVirtualComponent component = findComponent(aFile);
-				if (component != null) {
-					IProject fileProject = aFile.getProject();
-					//If it is not in the same project then just return the URI as is.
-					if (resourceSetSynchronizer.getProject() == fileProject)
-						return getArchiveRelativeURI(aFile,component.getRootFolder().getUnderlyingFolder());
-				} else
-					return super.deNormalize(uri);
-			}
-		}
-		return uri;
-	}
-	
-	protected URI getContainerRelativeURI(IFile aFile) {
-		IPath path = WorkbenchResourceHelperBase.getPathFromContainers(inputContainers, aFile.getFullPath());
-		if (path != null)
-			return URI.createURI(path.toString());
-		return null;
-	}
-	protected URI getArchiveRelativeURI(IFile aFile, IContainer aContainer) {
-		IPath path = WorkbenchResourceHelperBase.getPathFromContainers(Collections.singletonList(aContainer), aFile.getFullPath());
-		if (path != null)
-			return URI.createURI(path.toString());
-		return null;
-	}
-
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ComponentResourceImpl.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ComponentResourceImpl.java
deleted file mode 100644
index 6b96ae1..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ComponentResourceImpl.java
+++ /dev/null
@@ -1,434 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ComponentResourceImpl.java,v 1.2.2.1 2006/01/10 19:16:57 cbridgha Exp $
- */
-package org.eclipse.wst.common.componentcore.internal.impl;
-
-import java.util.Collection;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-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.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EDataTypeUniqueEList;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.wst.common.componentcore.internal.ComponentResource;
-import org.eclipse.wst.common.componentcore.internal.ComponentcorePackage;
-import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Workbench Module Resource</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.impl.ComponentResourceImpl#getSourcePath <em>Source Path</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.impl.ComponentResourceImpl#getRuntimePath <em>Runtime Path</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.impl.ComponentResourceImpl#getExclusions <em>Exclusions</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.impl.ComponentResourceImpl#getComponent <em>Component</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.impl.ComponentResourceImpl#getResourceType <em>Resource Type</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ComponentResourceImpl extends EObjectImpl implements ComponentResource {
-	/**
-	 * The default value of the '{@link #getSourcePath() <em>Source Path</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSourcePath()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final IPath SOURCE_PATH_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getSourcePath() <em>Source Path</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSourcePath()
-	 * @generated
-	 * @ordered
-	 */
-	protected IPath sourcePath = SOURCE_PATH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRuntimePath() <em>Runtime Path</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRuntimePath()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final IPath RUNTIME_PATH_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRuntimePath() <em>Runtime Path</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRuntimePath()
-	 * @generated
-	 * @ordered
-	 */
-	protected IPath runtimePath = RUNTIME_PATH_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getExclusions() <em>Exclusions</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getExclusions()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList exclusions = null;
-	
-	/**
-	 * The default value of the '{@link #getResourceType() <em>Resource Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getResourceType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String RESOURCE_TYPE_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getResourceType() <em>Resource Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getResourceType()
-	 * @generated
-	 * @ordered
-	 */
-	protected String resourceType = RESOURCE_TYPE_EDEFAULT;
-
-	protected IProject owningProject;
-	protected static final int VIRTUAL = 0;
-	protected static final int PERSISTED = 1;
-	
-	private int type = PERSISTED;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ComponentResourceImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return ComponentcorePackage.eINSTANCE.getComponentResource();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IPath getSourcePath() {
-		return sourcePath;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSourcePath(IPath newSourcePath) {
-		IPath oldSourcePath = sourcePath;
-		sourcePath = newSourcePath;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ComponentcorePackage.COMPONENT_RESOURCE__SOURCE_PATH, oldSourcePath, sourcePath));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IPath getRuntimePath() {
-		return runtimePath;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRuntimePath(IPath newRuntimePath) {
-		IPath oldRuntimePath = runtimePath;
-		runtimePath = newRuntimePath;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ComponentcorePackage.COMPONENT_RESOURCE__RUNTIME_PATH, oldRuntimePath, runtimePath));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getExclusions() {
-		if (exclusions == null) {
-			exclusions = new EDataTypeUniqueEList(String.class, this, ComponentcorePackage.COMPONENT_RESOURCE__EXCLUSIONS);
-		}
-		return exclusions;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkbenchComponent getComponent() {
-		if (eContainerFeatureID != ComponentcorePackage.COMPONENT_RESOURCE__COMPONENT) return null;
-		return (WorkbenchComponent)eContainer;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setComponent(WorkbenchComponent newComponent) {
-		if (newComponent != eContainer || (eContainerFeatureID != ComponentcorePackage.COMPONENT_RESOURCE__COMPONENT && newComponent != null)) {
-			if (EcoreUtil.isAncestor(this, newComponent))
-				throw new IllegalArgumentException("Recursive containment not allowed for " + toString());
-			NotificationChain msgs = null;
-			if (eContainer != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			if (newComponent != null)
-				msgs = ((InternalEObject)newComponent).eInverseAdd(this, ComponentcorePackage.WORKBENCH_COMPONENT__RESOURCES, WorkbenchComponent.class, msgs);
-			msgs = eBasicSetContainer((InternalEObject)newComponent, ComponentcorePackage.COMPONENT_RESOURCE__COMPONENT, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ComponentcorePackage.COMPONENT_RESOURCE__COMPONENT, newComponent, newComponent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getResourceType() {
-		return resourceType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setResourceType(String newResourceType) {
-		String oldResourceType = resourceType;
-		resourceType = newResourceType;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ComponentcorePackage.COMPONENT_RESOURCE__RESOURCE_TYPE, oldResourceType, resourceType));
-	}
-
-	/**
-	 * <!-- 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 ComponentcorePackage.COMPONENT_RESOURCE__COMPONENT:
-					if (eContainer != null)
-						msgs = eBasicRemoveFromContainer(msgs);
-					return eBasicSetContainer(otherEnd, ComponentcorePackage.COMPONENT_RESOURCE__COMPONENT, 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 ComponentcorePackage.COMPONENT_RESOURCE__COMPONENT:
-					return eBasicSetContainer(null, ComponentcorePackage.COMPONENT_RESOURCE__COMPONENT, 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 ComponentcorePackage.COMPONENT_RESOURCE__COMPONENT:
-					return eContainer.eInverseRemove(this, ComponentcorePackage.WORKBENCH_COMPONENT__RESOURCES, WorkbenchComponent.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 ComponentcorePackage.COMPONENT_RESOURCE__SOURCE_PATH:
-				return getSourcePath();
-			case ComponentcorePackage.COMPONENT_RESOURCE__RUNTIME_PATH:
-				return getRuntimePath();
-			case ComponentcorePackage.COMPONENT_RESOURCE__EXCLUSIONS:
-				return getExclusions();
-			case ComponentcorePackage.COMPONENT_RESOURCE__COMPONENT:
-				return getComponent();
-			case ComponentcorePackage.COMPONENT_RESOURCE__RESOURCE_TYPE:
-				return getResourceType();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case ComponentcorePackage.COMPONENT_RESOURCE__SOURCE_PATH:
-				setSourcePath((IPath)newValue);
-				return;
-			case ComponentcorePackage.COMPONENT_RESOURCE__RUNTIME_PATH:
-				setRuntimePath((IPath)newValue);
-				return;
-			case ComponentcorePackage.COMPONENT_RESOURCE__EXCLUSIONS:
-				getExclusions().clear();
-				getExclusions().addAll((Collection)newValue);
-				return;
-			case ComponentcorePackage.COMPONENT_RESOURCE__COMPONENT:
-				setComponent((WorkbenchComponent)newValue);
-				return;
-			case ComponentcorePackage.COMPONENT_RESOURCE__RESOURCE_TYPE:
-				setResourceType((String)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case ComponentcorePackage.COMPONENT_RESOURCE__SOURCE_PATH:
-				setSourcePath(SOURCE_PATH_EDEFAULT);
-				return;
-			case ComponentcorePackage.COMPONENT_RESOURCE__RUNTIME_PATH:
-				setRuntimePath(RUNTIME_PATH_EDEFAULT);
-				return;
-			case ComponentcorePackage.COMPONENT_RESOURCE__EXCLUSIONS:
-				getExclusions().clear();
-				return;
-			case ComponentcorePackage.COMPONENT_RESOURCE__COMPONENT:
-				setComponent((WorkbenchComponent)null);
-				return;
-			case ComponentcorePackage.COMPONENT_RESOURCE__RESOURCE_TYPE:
-				setResourceType(RESOURCE_TYPE_EDEFAULT);
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case ComponentcorePackage.COMPONENT_RESOURCE__SOURCE_PATH:
-				return SOURCE_PATH_EDEFAULT == null ? sourcePath != null : !SOURCE_PATH_EDEFAULT.equals(sourcePath);
-			case ComponentcorePackage.COMPONENT_RESOURCE__RUNTIME_PATH:
-				return RUNTIME_PATH_EDEFAULT == null ? runtimePath != null : !RUNTIME_PATH_EDEFAULT.equals(runtimePath);
-			case ComponentcorePackage.COMPONENT_RESOURCE__EXCLUSIONS:
-				return exclusions != null && !exclusions.isEmpty();
-			case ComponentcorePackage.COMPONENT_RESOURCE__COMPONENT:
-				return getComponent() != null;
-			case ComponentcorePackage.COMPONENT_RESOURCE__RESOURCE_TYPE:
-				return RESOURCE_TYPE_EDEFAULT == null ? resourceType != null : !RESOURCE_TYPE_EDEFAULT.equals(resourceType);
-		}
-		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(" (sourcePath: ");
-		result.append(sourcePath);
-		result.append(", runtimePath: ");
-		result.append(runtimePath);
-		result.append(", exclusions: ");
-		result.append(exclusions);
-		result.append(", resourceType: ");
-		result.append(resourceType);
-		result.append(')');
-		return result.toString();
-	}
-
-	public int getType() {
-		return type;
-	}
-	
-	
-	public void setType(int type) {
-		this.type = type;
-	}
-
-	public IProject getOwningProject() {
-		return owningProject;
-	}
-
-	public void setOwningProject(IProject aProject) {
-		owningProject = aProject;
-	}
-	
-
-} //ComponentResourceImpl
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ComponentTypeImpl.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ComponentTypeImpl.java
deleted file mode 100644
index b0c2f21..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ComponentTypeImpl.java
+++ /dev/null
@@ -1,290 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ComponentTypeImpl.java,v 1.1 2005/04/04 07:04:59 cbridgha Exp $
- */
-package org.eclipse.wst.common.componentcore.internal.impl;
-
-import java.util.Collection;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EDataTypeUniqueEList;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.wst.common.componentcore.internal.ComponentType;
-import org.eclipse.wst.common.componentcore.internal.ComponentcorePackage;
-import org.eclipse.wst.common.componentcore.internal.Property;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Module Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.impl.ComponentTypeImpl#getComponentTypeId <em>Component Type Id</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.impl.ComponentTypeImpl#getVersion <em>Version</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.impl.ComponentTypeImpl#getProperties <em>Properties</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.impl.ComponentTypeImpl#getMetadataResources <em>Metadata Resources</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ComponentTypeImpl extends EObjectImpl implements ComponentType {
-	/**
-	 * The default value of the '{@link #getComponentTypeId() <em>Component Type Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getComponentTypeId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String COMPONENT_TYPE_ID_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getComponentTypeId() <em>Component Type Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getComponentTypeId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String componentTypeId = COMPONENT_TYPE_ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getVersion() <em>Version</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVersion()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String VERSION_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getVersion() <em>Version</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVersion()
-	 * @generated
-	 * @ordered
-	 */
-	protected String version = VERSION_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getProperties() <em>Properties</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getProperties()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList properties = null;
-
-	/**
-	 * The cached value of the '{@link #getMetadataResources() <em>Metadata Resources</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMetadataResources()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList metadataResources = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ComponentTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return ComponentcorePackage.eINSTANCE.getComponentType();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getComponentTypeId() {
-		return componentTypeId;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setComponentTypeId(String newComponentTypeId) {
-		String oldComponentTypeId = componentTypeId;
-		componentTypeId = newComponentTypeId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ComponentcorePackage.COMPONENT_TYPE__COMPONENT_TYPE_ID, oldComponentTypeId, componentTypeId));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getMetadataResources() {
-		if (metadataResources == null) {
-			metadataResources = new EDataTypeUniqueEList(IPath.class, this, ComponentcorePackage.COMPONENT_TYPE__METADATA_RESOURCES);
-		}
-		return metadataResources;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getVersion() {
-		return version;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setVersion(String newVersion) {
-		String oldVersion = version;
-		version = newVersion;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ComponentcorePackage.COMPONENT_TYPE__VERSION, oldVersion, version));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getProperties() {
-		if (properties == null) {
-			properties = new EObjectResolvingEList(Property.class, this, ComponentcorePackage.COMPONENT_TYPE__PROPERTIES);
-		}
-		return properties;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case ComponentcorePackage.COMPONENT_TYPE__COMPONENT_TYPE_ID:
-				return getComponentTypeId();
-			case ComponentcorePackage.COMPONENT_TYPE__VERSION:
-				return getVersion();
-			case ComponentcorePackage.COMPONENT_TYPE__PROPERTIES:
-				return getProperties();
-			case ComponentcorePackage.COMPONENT_TYPE__METADATA_RESOURCES:
-				return getMetadataResources();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case ComponentcorePackage.COMPONENT_TYPE__COMPONENT_TYPE_ID:
-				setComponentTypeId((String)newValue);
-				return;
-			case ComponentcorePackage.COMPONENT_TYPE__VERSION:
-				setVersion((String)newValue);
-				return;
-			case ComponentcorePackage.COMPONENT_TYPE__PROPERTIES:
-				getProperties().clear();
-				getProperties().addAll((Collection)newValue);
-				return;
-			case ComponentcorePackage.COMPONENT_TYPE__METADATA_RESOURCES:
-				getMetadataResources().clear();
-				getMetadataResources().addAll((Collection)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case ComponentcorePackage.COMPONENT_TYPE__COMPONENT_TYPE_ID:
-				setComponentTypeId(COMPONENT_TYPE_ID_EDEFAULT);
-				return;
-			case ComponentcorePackage.COMPONENT_TYPE__VERSION:
-				setVersion(VERSION_EDEFAULT);
-				return;
-			case ComponentcorePackage.COMPONENT_TYPE__PROPERTIES:
-				getProperties().clear();
-				return;
-			case ComponentcorePackage.COMPONENT_TYPE__METADATA_RESOURCES:
-				getMetadataResources().clear();
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case ComponentcorePackage.COMPONENT_TYPE__COMPONENT_TYPE_ID:
-				return COMPONENT_TYPE_ID_EDEFAULT == null ? componentTypeId != null : !COMPONENT_TYPE_ID_EDEFAULT.equals(componentTypeId);
-			case ComponentcorePackage.COMPONENT_TYPE__VERSION:
-				return VERSION_EDEFAULT == null ? version != null : !VERSION_EDEFAULT.equals(version);
-			case ComponentcorePackage.COMPONENT_TYPE__PROPERTIES:
-				return properties != null && !properties.isEmpty();
-			case ComponentcorePackage.COMPONENT_TYPE__METADATA_RESOURCES:
-				return metadataResources != null && !metadataResources.isEmpty();
-		}
-		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(" (componentTypeId: ");
-		result.append(componentTypeId);
-		result.append(", version: ");
-		result.append(version);
-		result.append(", metadataResources: ");
-		result.append(metadataResources);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ComponentTypeImpl
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ComponentcoreFactoryImpl.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ComponentcoreFactoryImpl.java
deleted file mode 100644
index 1e23e37..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ComponentcoreFactoryImpl.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ComponentcoreFactoryImpl.java,v 1.7 2005/10/18 22:27:18 cbridgha Exp $
- */
-package org.eclipse.wst.common.componentcore.internal.impl;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-import org.eclipse.wst.common.componentcore.internal.ComponentResource;
-import org.eclipse.wst.common.componentcore.internal.ComponentType;
-import org.eclipse.wst.common.componentcore.internal.ComponentcoreFactory;
-import org.eclipse.wst.common.componentcore.internal.ComponentcorePackage;
-import org.eclipse.wst.common.componentcore.internal.DependencyType;
-import org.eclipse.wst.common.componentcore.internal.ProjectComponents;
-import org.eclipse.wst.common.componentcore.internal.Property;
-import org.eclipse.wst.common.componentcore.internal.ReferencedComponent;
-import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class ComponentcoreFactoryImpl extends EFactoryImpl implements ComponentcoreFactory {
-	/**
-	 * Creates an instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentcoreFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EObject create(EClass eClass) {
-		switch (eClass.getClassifierID()) {
-			case ComponentcorePackage.WORKBENCH_COMPONENT: return createWorkbenchComponent();
-			case ComponentcorePackage.COMPONENT_RESOURCE: return createComponentResource();
-			case ComponentcorePackage.COMPONENT_TYPE: return createComponentType();
-			case ComponentcorePackage.PROPERTY: return createProperty();
-			case ComponentcorePackage.REFERENCED_COMPONENT: return createReferencedComponent();
-			case ComponentcorePackage.PROJECT_COMPONENTS: return createProjectComponents();
-			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 ComponentcorePackage.DEPENDENCY_TYPE: {
-				DependencyType result = DependencyType.get(initialValue);
-				if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
-				return result;
-			}
-			case ComponentcorePackage.IPATH:
-				return createIPathFromString(eDataType, initialValue);
-			case ComponentcorePackage.URI:
-				return createURIFromString(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 ComponentcorePackage.DEPENDENCY_TYPE:
-				return instanceValue == null ? null : instanceValue.toString();
-			case ComponentcorePackage.IPATH:
-				return convertIPathToString(eDataType, instanceValue);
-			case ComponentcorePackage.URI:
-				return convertURIToString(eDataType, instanceValue);
-			default:
-				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkbenchComponent createWorkbenchComponent() {
-		WorkbenchComponentImpl workbenchComponent = new WorkbenchComponentImpl();
-		return workbenchComponent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentResource createComponentResource() {
-		ComponentResourceImpl componentResource = new ComponentResourceImpl();
-		return componentResource;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentType createComponentType() {
-		ComponentTypeImpl componentType = new ComponentTypeImpl();
-		return componentType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Property createProperty() {
-		PropertyImpl property = new PropertyImpl();
-		return property;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ReferencedComponent createReferencedComponent() {
-		ReferencedComponentImpl referencedComponent = new ReferencedComponentImpl();
-		return referencedComponent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProjectComponents createProjectComponents() {
-		ProjectComponentsImpl projectComponents = new ProjectComponentsImpl();
-		return projectComponents;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IPath createIPathFromString(EDataType eDataType, String initialValue) {
-		return (IPath)super.createFromString(eDataType, initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertIPathToString(EDataType eDataType, Object instanceValue) {
-		return super.convertToString(eDataType, instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public URI createURIFromString(EDataType eDataType, String initialValue) {
-		return (URI)super.createFromString(eDataType, initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertURIToString(EDataType eDataType, Object instanceValue) {
-		return super.convertToString(eDataType, instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentcorePackage getComponentcorePackage() {
-		return (ComponentcorePackage)getEPackage();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @deprecated
-	 * @generated
-	 */
-	public static ComponentcorePackage getPackage() {
-		return ComponentcorePackage.eINSTANCE;
-	}
-
-} //ComponentcoreFactoryImpl
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ComponentcorePackageImpl.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ComponentcorePackageImpl.java
deleted file mode 100644
index 6da7033..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ComponentcorePackageImpl.java
+++ /dev/null
@@ -1,624 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ComponentcorePackageImpl.java,v 1.7 2005/10/18 22:25:44 cbridgha Exp $
- */
-package org.eclipse.wst.common.componentcore.internal.impl;
-
-import org.eclipse.core.runtime.IPath;
-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;
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-import org.eclipse.wst.common.componentcore.internal.ComponentResource;
-import org.eclipse.wst.common.componentcore.internal.ComponentType;
-import org.eclipse.wst.common.componentcore.internal.ComponentcoreFactory;
-import org.eclipse.wst.common.componentcore.internal.ComponentcorePackage;
-import org.eclipse.wst.common.componentcore.internal.DependencyType;
-import org.eclipse.wst.common.componentcore.internal.ProjectComponents;
-import org.eclipse.wst.common.componentcore.internal.Property;
-import org.eclipse.wst.common.componentcore.internal.ReferencedComponent;
-import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class ComponentcorePackageImpl extends EPackageImpl implements ComponentcorePackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass workbenchComponentEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass componentResourceEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass componentTypeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass propertyEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass referencedComponentEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass projectComponentsEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EEnum dependencyTypeEEnum = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType iPathEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType uriEDataType = 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.wst.common.componentcore.internal.ComponentcorePackage#eNS_URI
-	 * @see #init()
-	 * @generated
-	 */
-	private ComponentcorePackageImpl() {
-		super(eNS_URI, ComponentcoreFactory.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 ComponentcorePackage init() {
-		if (isInited) return (ComponentcorePackage)EPackage.Registry.INSTANCE.getEPackage(ComponentcorePackage.eNS_URI);
-
-		// Obtain or create and register package
-		ComponentcorePackageImpl theComponentcorePackage = (ComponentcorePackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof ComponentcorePackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new ComponentcorePackageImpl());
-
-		isInited = true;
-
-		// Create package meta-data objects
-		theComponentcorePackage.createPackageContents();
-
-		// Initialize created meta-data
-		theComponentcorePackage.initializePackageContents();
-
-		// Mark meta-data to indicate it can't be changed
-		theComponentcorePackage.freeze();
-
-		return theComponentcorePackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getWorkbenchComponent() {
-		return workbenchComponentEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkbenchComponent_Name() {
-		return (EAttribute)workbenchComponentEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getWorkbenchComponent_Resources() {
-		return (EReference)workbenchComponentEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getWorkbenchComponent_ComponentType() {
-		return (EReference)workbenchComponentEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getWorkbenchComponent_ReferencedComponents() {
-		return (EReference)workbenchComponentEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getWorkbenchComponent_Properties() {
-		return (EReference)workbenchComponentEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkbenchComponent_MetadataResources() {
-		return (EAttribute)workbenchComponentEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getComponentResource() {
-		return componentResourceEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getComponentResource_SourcePath() {
-		return (EAttribute)componentResourceEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getComponentResource_RuntimePath() {
-		return (EAttribute)componentResourceEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getComponentResource_Exclusions() {
-		return (EAttribute)componentResourceEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getComponentResource_Component() {
-		return (EReference)componentResourceEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getComponentResource_ResourceType() {
-		return (EAttribute)componentResourceEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getComponentType() {
-		return componentTypeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getComponentType_ComponentTypeId() {
-		return (EAttribute)componentTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getComponentType_Version() {
-		return (EAttribute)componentTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getComponentType_Properties() {
-		return (EReference)componentTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getComponentType_MetadataResources() {
-		return (EAttribute)componentTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getProperty() {
-		return propertyEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProperty_Name() {
-		return (EAttribute)propertyEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProperty_Value() {
-		return (EAttribute)propertyEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getReferencedComponent() {
-		return referencedComponentEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getReferencedComponent_Handle() {
-		return (EAttribute)referencedComponentEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getReferencedComponent_RuntimePath() {
-		return (EAttribute)referencedComponentEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getReferencedComponent_DependencyType() {
-		return (EAttribute)referencedComponentEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReferencedComponent_DependentObject() {
-		return (EReference)referencedComponentEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getProjectComponents() {
-		return projectComponentsEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProjectComponents_ProjectName() {
-		return (EAttribute)projectComponentsEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProjectComponents_Components() {
-		return (EReference)projectComponentsEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EEnum getDependencyType() {
-		return dependencyTypeEEnum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getIPath() {
-		return iPathEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getURI() {
-		return uriEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentcoreFactory getComponentcoreFactory() {
-		return (ComponentcoreFactory)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
-		workbenchComponentEClass = createEClass(WORKBENCH_COMPONENT);
-		createEAttribute(workbenchComponentEClass, WORKBENCH_COMPONENT__NAME);
-		createEReference(workbenchComponentEClass, WORKBENCH_COMPONENT__RESOURCES);
-		createEReference(workbenchComponentEClass, WORKBENCH_COMPONENT__COMPONENT_TYPE);
-		createEReference(workbenchComponentEClass, WORKBENCH_COMPONENT__REFERENCED_COMPONENTS);
-		createEReference(workbenchComponentEClass, WORKBENCH_COMPONENT__PROPERTIES);
-		createEAttribute(workbenchComponentEClass, WORKBENCH_COMPONENT__METADATA_RESOURCES);
-
-		componentResourceEClass = createEClass(COMPONENT_RESOURCE);
-		createEAttribute(componentResourceEClass, COMPONENT_RESOURCE__SOURCE_PATH);
-		createEAttribute(componentResourceEClass, COMPONENT_RESOURCE__RUNTIME_PATH);
-		createEAttribute(componentResourceEClass, COMPONENT_RESOURCE__EXCLUSIONS);
-		createEReference(componentResourceEClass, COMPONENT_RESOURCE__COMPONENT);
-		createEAttribute(componentResourceEClass, COMPONENT_RESOURCE__RESOURCE_TYPE);
-
-		componentTypeEClass = createEClass(COMPONENT_TYPE);
-		createEAttribute(componentTypeEClass, COMPONENT_TYPE__COMPONENT_TYPE_ID);
-		createEAttribute(componentTypeEClass, COMPONENT_TYPE__VERSION);
-		createEReference(componentTypeEClass, COMPONENT_TYPE__PROPERTIES);
-		createEAttribute(componentTypeEClass, COMPONENT_TYPE__METADATA_RESOURCES);
-
-		propertyEClass = createEClass(PROPERTY);
-		createEAttribute(propertyEClass, PROPERTY__NAME);
-		createEAttribute(propertyEClass, PROPERTY__VALUE);
-
-		referencedComponentEClass = createEClass(REFERENCED_COMPONENT);
-		createEAttribute(referencedComponentEClass, REFERENCED_COMPONENT__HANDLE);
-		createEAttribute(referencedComponentEClass, REFERENCED_COMPONENT__RUNTIME_PATH);
-		createEAttribute(referencedComponentEClass, REFERENCED_COMPONENT__DEPENDENCY_TYPE);
-		createEReference(referencedComponentEClass, REFERENCED_COMPONENT__DEPENDENT_OBJECT);
-
-		projectComponentsEClass = createEClass(PROJECT_COMPONENTS);
-		createEAttribute(projectComponentsEClass, PROJECT_COMPONENTS__PROJECT_NAME);
-		createEReference(projectComponentsEClass, PROJECT_COMPONENTS__COMPONENTS);
-
-		// Create enums
-		dependencyTypeEEnum = createEEnum(DEPENDENCY_TYPE);
-
-		// Create data types
-		iPathEDataType = createEDataType(IPATH);
-		uriEDataType = createEDataType(URI);
-	}
-
-	/**
-	 * <!-- 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(workbenchComponentEClass, WorkbenchComponent.class, "WorkbenchComponent", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getWorkbenchComponent_Name(), ecorePackage.getEString(), "name", "", 1, 1, WorkbenchComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getWorkbenchComponent_Resources(), this.getComponentResource(), this.getComponentResource_Component(), "resources", null, 0, -1, WorkbenchComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getWorkbenchComponent_ComponentType(), this.getComponentType(), null, "componentType", null, 1, 1, WorkbenchComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getWorkbenchComponent_ReferencedComponents(), this.getReferencedComponent(), null, "referencedComponents", null, 0, -1, WorkbenchComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getWorkbenchComponent_Properties(), this.getProperty(), null, "properties", null, 0, -1, WorkbenchComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getWorkbenchComponent_MetadataResources(), this.getIPath(), "metadataResources", null, 0, -1, WorkbenchComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(componentResourceEClass, ComponentResource.class, "ComponentResource", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getComponentResource_SourcePath(), this.getIPath(), "sourcePath", null, 1, 1, ComponentResource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getComponentResource_RuntimePath(), this.getIPath(), "runtimePath", null, 1, 1, ComponentResource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getComponentResource_Exclusions(), ecorePackage.getEString(), "exclusions", "", 0, -1, ComponentResource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getComponentResource_Component(), this.getWorkbenchComponent(), this.getWorkbenchComponent_Resources(), "component", null, 1, 1, ComponentResource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getComponentResource_ResourceType(), ecorePackage.getEString(), "resourceType", "", 1, 1, ComponentResource.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);
-		initEAttribute(getComponentType_ComponentTypeId(), ecorePackage.getEString(), "componentTypeId", "", 1, 1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getComponentType_Version(), ecorePackage.getEString(), "version", "", 1, 1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getComponentType_Properties(), this.getProperty(), null, "properties", 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_MetadataResources(), this.getIPath(), "metadataResources", null, 0, -1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(propertyEClass, Property.class, "Property", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getProperty_Name(), ecorePackage.getEString(), "name", "", 1, 1, Property.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getProperty_Value(), ecorePackage.getEString(), "value", "", 1, 1, Property.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(referencedComponentEClass, ReferencedComponent.class, "ReferencedComponent", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getReferencedComponent_Handle(), this.getURI(), "handle", null, 1, 1, ReferencedComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getReferencedComponent_RuntimePath(), this.getIPath(), "runtimePath", null, 1, 1, ReferencedComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getReferencedComponent_DependencyType(), this.getDependencyType(), "dependencyType", null, 1, 1, ReferencedComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getReferencedComponent_DependentObject(), ecorePackage.getEObject(), null, "dependentObject", null, 0, 1, ReferencedComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(projectComponentsEClass, ProjectComponents.class, "ProjectComponents", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getProjectComponents_ProjectName(), ecorePackage.getEString(), "projectName", "", 1, 1, ProjectComponents.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getProjectComponents_Components(), this.getWorkbenchComponent(), null, "components", null, 0, -1, ProjectComponents.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		// Initialize enums and add enum literals
-		initEEnum(dependencyTypeEEnum, DependencyType.class, "DependencyType");
-		addEEnumLiteral(dependencyTypeEEnum, DependencyType.USES_LITERAL);
-		addEEnumLiteral(dependencyTypeEEnum, DependencyType.CONSUMES_LITERAL);
-
-		// Initialize data types
-		initEDataType(iPathEDataType, IPath.class, "IPath", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS);
-		initEDataType(uriEDataType, org.eclipse.emf.common.util.URI.class, "URI", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS);
-
-		// Create resource
-		createResource(eNS_URI);
-
-		// Create annotations
-		// keywords
-		createKeywordsAnnotations();
-	}
-
-	/**
-	 * Initializes the annotations for <b>keywords</b>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void createKeywordsAnnotations() {
-		String source = "keywords";		
-		addAnnotation
-		  (iPathEDataType, 
-		   source, 
-		   new String[] {
-			 "datatype", null
-		   });		
-		addAnnotation
-		  (uriEDataType, 
-		   source, 
-		   new String[] {
-			 "datatype", null
-		   });
-	}
-
-} //ComponentcorePackageImpl
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/IModuleStructureListener.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/IModuleStructureListener.java
deleted file mode 100644
index 82a97d7..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/IModuleStructureListener.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.impl;
-
-
-/**
- * 
- * <p>
- * The following class is experimental until fully documented.
- * </p>
- */
-public interface IModuleStructureListener {
-    
-    public void structureChanged(ModuleStructureEvent event);
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/MappedComponentXMIHelper.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/MappedComponentXMIHelper.java
deleted file mode 100644
index 250ccb7..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/MappedComponentXMIHelper.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.impl;
-
-import java.util.Map;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.resource.impl.URIConverterImpl;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
-import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
-import org.eclipse.wst.common.internal.emf.resource.MappedXMIHelper;
-import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
-
-public class MappedComponentXMIHelper extends MappedXMIHelper {
-
-	public MappedComponentXMIHelper(XMLResource resource, Map prefixesToURIs) {
-		super(resource, prefixesToURIs);
-	}
-
-	public URI resolve(URI relative, URI base) {
-		URI resolved = null;
-		if (!isMapped(relative))
-			resolved = resolveURIFromComponent(relative,base);
-		else
-			resolved = relative;
-		
-		return resolved == null ? super.resolve(relative, base) : resolved;
-	}
-	
-	private boolean isMapped(URI relative) {
-		boolean isMapped = false;
-		ResourceSet set = getResource().getResourceSet();
-		if (set != null) {
-			URI localresourceURI = relative;
-			if (relative.hasFragment())
-				localresourceURI = relative.trimFragment();
-			isMapped = !((URIConverterImpl.URIMap) set.getURIConverter().getURIMap()).getURI(localresourceURI).equals(localresourceURI);
-		}
-		return isMapped;
-	}
-	
-	private URI resolveURIFromComponent(URI relative, URI base) {
-		IVirtualComponent component = getComponent(base);
-		if (component != null) {
-			IVirtualFile virtualFile = component.getRootFolder().getFile(new Path(relative.toString()));
-			if (virtualFile != null) {
-				IPath resolvingPath = virtualFile.getWorkspaceRelativePath();
-				if (resolvingPath !=null) 
-					return URI.createPlatformResourceURI(resolvingPath.toString());
-			}
-		}
-		return null;
-	}
-	
-	private IVirtualComponent getComponent(URI base) {
-		ResourceSet set = getResource().getResourceSet();
-		if (set == null || set.getURIConverter()==null)
-			return null;
-		URI normalized = set.getURIConverter().normalize(base);
-		if (WorkbenchResourceHelperBase.isPlatformResourceURI(normalized)) {
-			IFile file = WorkbenchResourceHelper.getPlatformFile(normalized);
-			if (file !=null) {
-				IVirtualResource[] virtualResources = ComponentCore.createResources(file);
-				if (virtualResources.length>0)
-					return virtualResources[0].getComponent();
-			}
-		}
-		return null;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ModuleIndexingAdapter.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ModuleIndexingAdapter.java
deleted file mode 100644
index 5946e50..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ModuleIndexingAdapter.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.wst.common.componentcore.internal.ComponentcorePackage;
-import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-
-/**
- * <p>
- * The following class is experimental until fully documented.
- * </p>
- */
-public class ModuleIndexingAdapter extends AdapterImpl {
-
-	private static final Class MODULE_INDEXING_ADAPTER_CLASS = ModuleIndexingAdapter.class;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification aNotification) {
-		if (aNotification.getNotifier() instanceof EObject) {
-			EObject notifier = (EObject) aNotification.getNotifier();
-			if (notifier.eClass().getClassifierID() == ComponentcorePackage.PROJECT_COMPONENTS) {
-				ProjectComponentsImpl projectModules = (ProjectComponentsImpl) notifier;
-				synchronized (projectModules.getModulesIndex()) {
-					switch (aNotification.getEventType()) {
-						case Notification.ADD :
-							WorkbenchComponent module = (WorkbenchComponent) aNotification.getNewValue();
-							projectModules.getModulesIndex().put(module.getName(), module);
-					}
-				} 
-			}
-		} 
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		return type == MODULE_INDEXING_ADAPTER_CLASS;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ModuleStructuralModelFactory.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ModuleStructuralModelFactory.java
deleted file mode 100644
index 792221e..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ModuleStructuralModelFactory.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.impl;
-
-import java.util.Map;
-
-import org.eclipse.wst.common.componentcore.internal.ModuleStructuralModel;
-import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
-import org.eclipse.wst.common.internal.emfworkbench.integration.EditModel;
-import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelFactory;
-
-/**
- * <p>
- * The following class is experimental until fully documented.
- * </p>
- */
-public class ModuleStructuralModelFactory extends EditModelFactory {
-	
-	public static final String MODULE_STRUCTURAL_MODEL_ID = "org.eclipse.wst.modulecore.structuralModel"; //$NON-NLS-1$
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emfworkbench.integration.EditModelFactory#createEditModelForRead(java.lang.String, org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext, java.util.Map)
-	 */
-	public EditModel createEditModelForRead(String anEditModelId, EMFWorkbenchContext aContext, Map theParams) {
-		return new ModuleStructuralModel(anEditModelId, aContext, true);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emfworkbench.integration.EditModelFactory#createEditModelForWrite(java.lang.String, org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext, java.util.Map)
-	 */
-	public EditModel createEditModelForWrite(String anEditModelId, EMFWorkbenchContext aContext, Map theParams) {
-		return new ModuleStructuralModel(anEditModelId, aContext, false);
-	}
-	
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ModuleStructureEvent.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ModuleStructureEvent.java
deleted file mode 100644
index b692e3b..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ModuleStructureEvent.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- *******************************************************************************/
-/*
- * Created on Jan 26, 2005
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Style - Code Templates
- */
-package org.eclipse.wst.common.componentcore.internal.impl;
-
-import java.util.EventObject;
-
-import org.eclipse.wst.common.componentcore.internal.ComponentResource;
-
-//in progress...
-
-public class ModuleStructureEvent extends EventObject {
-    /**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private ComponentResource[] resources;
-
-    public ModuleStructureEvent(Object source) {
-        super(source);
-    }
-    
-    public ModuleStructureEvent(Object source, ComponentResource[] theModuleResources) {
-        super(source);
-        resources = theModuleResources;
-        
-    }
-
-    public ComponentResource[] getMoudleResources() {
-        return resources;
-    }
-  
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ModuleURIUtil.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ModuleURIUtil.java
deleted file mode 100644
index 7454537..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ModuleURIUtil.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.impl;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.wst.common.componentcore.UnresolveableURIException;
-import org.eclipse.wst.common.componentcore.internal.StructureEdit;
-import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-
-/**
- * 
- * <p>
- * The following class is experimental until fully documented.
- * </p>
- */
-public class ModuleURIUtil {
-
-	protected static final String RESOURCE_URI_PROTOCOL = PlatformURLModuleConnection.MODULE_PROTOCOL+IPath.SEPARATOR+PlatformURLModuleConnection.RESOURCE_MODULE+IPath.SEPARATOR;
-
-	protected static final String ARCHIVE_URI_PROTOCOL = PlatformURLModuleConnection.MODULE_PROTOCOL+IPath.SEPARATOR+PlatformURLModuleConnection.CLASSPATH +IPath.SEPARATOR;
-	
-	public static interface ModuleURI {
-		public static final int SUB_PROTOCOL_INDX = 0;
-		public static final int PROJECT_NAME_INDX = 1;
-		public static final int MODULE_NAME_INDX = 2;
-	}
-
-
-	public static final String PLATFORM_SCHEME = "platform"; //$NON-NLS-1$
-	public static final String RESOURCE_PROTOCOL = "resource"; //$NON-NLS-1$
-
-	
-	/**
-	 * <p>
-	 * A fully-qualified module URI will contain enough information to determine the deployed name
-	 * of the module.
-	 * </p>
-	 * 
-	 * @param aModuleURI
-	 *            A valid, fully-qualified module URI
-	 * @return The deployed name of the {@see WorkbenchComponent}referenced by the module URI
-	 * @throws UnresolveableURIException
-	 *             If the supplied module URI is invalid or unresolveable.
-	 */ 
-	public static String getDeployedName(URI aModuleURI) throws UnresolveableURIException {
-		ensureValidFullyQualifiedModuleURI(aModuleURI);
-		return aModuleURI.segment(ModuleURI.MODULE_NAME_INDX);
-	}
-
-	public static boolean ensureValidFullyQualifiedModuleURI(URI aModuleURI) throws UnresolveableURIException {
-		return ensureValidFullyQualifiedModuleURI(aModuleURI, true);
-	}
-
-	public static boolean ensureValidFullyQualifiedModuleURI(URI aModuleURI, boolean toThrowExceptionIfNecessary) throws UnresolveableURIException {
-		if (aModuleURI.segmentCount() < 3) {
-			if(toThrowExceptionIfNecessary)
-				throw new UnresolveableURIException(aModuleURI);
-			return false;
-		}
-		return true;
-	}
-
-	public static boolean ensureValidFullyQualifiedPlatformURI(URI aFullyQualifiedResourceURI, boolean toThrowExceptionIfNecessary) throws UnresolveableURIException {
-		if (aFullyQualifiedResourceURI.segmentCount() < 2 || !PLATFORM_SCHEME.equals(aFullyQualifiedResourceURI.scheme()) || !RESOURCE_PROTOCOL.equals(aFullyQualifiedResourceURI.segment(0))) {
-			if (toThrowExceptionIfNecessary)
-				throw new UnresolveableURIException(aFullyQualifiedResourceURI);
-			return false;
-		}
-		return true;
-	}
-
-	public static void ensureValidFullyQualifiedPlatformURI(URI aFullyQualifiedResourceURI) throws UnresolveableURIException {
-		ensureValidFullyQualifiedPlatformURI(aFullyQualifiedResourceURI, true);
-	}
-
-	public static URI trimModuleResourcePathToModuleURI(URI aModuleResourcePath) throws UnresolveableURIException {
-		ensureValidFullyQualifiedModuleURI(aModuleResourcePath);
-		return aModuleResourcePath.trimSegments(aModuleResourcePath.segmentCount() - 3);
-	}
-
-	public static URI trimWorkspacePathToProjectRelativeURI(URI aFullyQualifiedResourceURI) throws UnresolveableURIException {
-		URI projectRelativePath = null;
-		/* Check for a non-hierachical Workspace-relative path of the form platform:/resource/<project>/...*/
-		if (ensureValidFullyQualifiedPlatformURI(aFullyQualifiedResourceURI, false)) {
-			if (aFullyQualifiedResourceURI.segmentCount() == 2)
-				/* The URI points to a project, resolve to an empty URI */
-				return URI.createURI(""); //$NON-NLS-1$
-
-			/*
-			 * The URI has to be > 2 since the validation method above checks for < 2, and just
-			 * checked for == 2 so if X NOT < 2 and X NOT == 2, THEN > 2
-			 */
-			projectRelativePath = trimToRelativePath(aFullyQualifiedResourceURI, 2);
-
-		} else if(aFullyQualifiedResourceURI.isHierarchical() && aFullyQualifiedResourceURI.path().startsWith(""+IPath.SEPARATOR)) {
-			projectRelativePath = trimToRelativePath(aFullyQualifiedResourceURI, 1);
-		} else {
-			throw new UnresolveableURIException(aFullyQualifiedResourceURI);
-		}
-		return projectRelativePath;
-	}
-	
-	public static URI trimToRelativePath(URI aURI, int aStartIndex) {
-		StringBuffer relativePath = new StringBuffer();
-		for (int segmentIndex = aStartIndex; segmentIndex < aURI.segmentCount(); segmentIndex++) {
-			relativePath.append(aURI.segment(segmentIndex));
-			if (segmentIndex < (aURI.segmentCount() - 1))
-				relativePath.append(IPath.SEPARATOR);
-		}
-		return URI.createURI(relativePath.toString());
-	}
-	
-	
-	/**
-	 * @param aModuleResourcePath
-	 * @return
-	 */
-	public static URI trimToDeployPathSegment(URI aFullyQualifiedModuleResourcePath) {
-		int segmentCount = aFullyQualifiedModuleResourcePath.segmentCount();
-		URI uri;
-		if(segmentCount > 4){
-			uri = aFullyQualifiedModuleResourcePath.deresolve(aFullyQualifiedModuleResourcePath.trimSegments(segmentCount - 4));
-		} else {
-			uri = URI.createURI(aFullyQualifiedModuleResourcePath.segment(segmentCount-1));
-		}
-		return uri;
-	}
-
-	public static URI concat(URI uri1, URI uri2){
-	    URI concatURI = uri1.appendSegments(uri2.segments());
-	    return concatURI;
-	}
-	
-	public static URI fullyQualifyURI(WorkbenchComponent aComponent) {
-		try {
-			if(ensureValidFullyQualifiedModuleURI(aComponent.getHandle(), false))
-				return aComponent.getHandle(); 
-			IProject project = StructureEdit.getContainingProject(aComponent);
-			if(project != null) {
-				return URI.createURI(RESOURCE_URI_PROTOCOL + project.getName() + IPath.SEPARATOR + aComponent.getName());
-			} 
-		} catch (UnresolveableURIException e) {
-			// Ignore
-		}
-		return null; 
-	}
-	
-
-	public static URI fullyQualifyURI(IProject aProject) {
-		return URI.createURI(RESOURCE_URI_PROTOCOL + aProject.getName() + IPath.SEPARATOR + aProject.getName());
-	}
-
-	public static URI archiveComponentfullyQualifyURI(String aComponentName) {
-		return URI.createURI(ARCHIVE_URI_PROTOCOL + aComponentName);
-	}
-	
-	public static boolean isClassPathURI(URI uri){
-		if(uri !=null && PlatformURLModuleConnection.CLASSPATH.equals(uri.segment(0) )){
-			return true;
-		}
-		return false;
-	}
-	
-	public static String getArchiveType(URI aModuleURI)throws UnresolveableURIException {
-		ensureValidFullyQualifiedModuleURI(aModuleURI);
-		return aModuleURI.segment(ModuleURI.PROJECT_NAME_INDX);		
-	}
-	
-	public static String getArchiveName(URI aModuleURI)throws UnresolveableURIException {
-		ensureValidFullyQualifiedModuleURI(aModuleURI);
-		URI uri = trimToRelativePath(aModuleURI, ModuleURI.MODULE_NAME_INDX);
-		return uri.toString();
-	}
-	public static String getHandleString(IVirtualComponent aComponent){
-		if (aComponent.isBinary())
-			return ModuleURIUtil.archiveComponentfullyQualifyURI(aComponent.getName()).toString();
-		else
-			return "[" + aComponent.getProject().getFullPath() + "]:" + aComponent.getProject().getName();
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/PlatformURLModuleConnection.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/PlatformURLModuleConnection.java
deleted file mode 100644
index 9b95e51..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/PlatformURLModuleConnection.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- *******************************************************************************/
-/*
- * Created on Jan 20, 2005
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Style - Code Templates
- */
-package org.eclipse.wst.common.componentcore.internal.impl;
-
-import java.io.IOException;
-import java.net.URL;
-
-import org.eclipse.core.internal.boot.PlatformURLConnection;
-import org.eclipse.core.internal.boot.PlatformURLHandler;
-import org.eclipse.core.resources.IProject;
-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.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.UnresolveableURIException;
-import org.eclipse.wst.common.componentcore.internal.StructureEdit;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
-
-/**
- * @author mdelder
- * 
- * TODO To change the template for this generated type comment go to Window - Preferences - Java -
- * Code Style - Code Templates
- */
-public class PlatformURLModuleConnection extends PlatformURLConnection {
-
-	public static final String MODULE = "module"; //$NON-NLS-1$
-	public static final String MODULE_PROTOCOL = MODULE + PlatformURLHandler.PROTOCOL_SEPARATOR;
-	
-	public static final String CLASSPATH = "classpath"; //$NON-NLS-1$
-
-	public static final String RESOURCE_MODULE = "resource"; //$NON-NLS-1$
-	public static final String BINARY_MODULE = "binary"; //$NON-NLS-1$
-
-
-	public PlatformURLModuleConnection(URL aURL) {
-		super(aURL);
-	}
- 
-	public static URI resolve(URI aModuleResourceRuntimePath) throws IOException {
-		try {
-			IProject componentProject = StructureEdit.getContainingProject(aModuleResourceRuntimePath);
-			String componentName = ModuleURIUtil.getDeployedName(aModuleResourceRuntimePath);
-			URI runtimeURI = ModuleURIUtil.trimToDeployPathSegment(aModuleResourceRuntimePath);
-			IPath runtimePath = new Path(runtimeURI.path());
-			IVirtualComponent component = ComponentCore.createComponent(componentProject);
-			//IVirtualFile vFile = component.getFile(runtimePath);
-			IVirtualFolder rootFolder = component.getRootFolder();
-			IVirtualFile vFile = rootFolder.getFile(runtimePath);
-			return URI.createPlatformResourceURI(vFile.getWorkspaceRelativePath().toString());
-		} catch (UnresolveableURIException e) {
-		}
-		return aModuleResourceRuntimePath;
-		 
-	}
-
-	private static URI normalizeToWorkspaceRelative(IProject project, IPath sourcePath, URI moduleResourceDeployPath) throws UnresolveableURIException {
-		String projectName = project.getName();
-		return URI.createURI(projectName + '/' + sourcePath.toString());
-	
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.internal.boot.PlatformURLConnection#resolve()
-	 */
-	protected URL resolve() throws IOException {
-		System.out.println("URL: " + getURL());
-		//IPath moduleRelativePath = new Path(getURL().toExternalForm());
-		//String moduleName = moduleRelativePath.segment(1);
-
-		IPath resolvedPath = null; // handle.getResolvedPath().append(moduleRelativePath.removeFirstSegments(2));
-
-		int count = resolvedPath.segmentCount();
-		// if there are two segments then the second is a project name.
-		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(resolvedPath.segment(0));
-		if (!project.exists()) {
-			// TODO Fix this string
-			String message = "Could not resolve URL"; //Policy.bind("url.couldNotResolve", project.getName(), url.toExternalForm()); //$NON-NLS-1$
-			throw new IOException(message);
-		}
-		IPath result = null;
-		if (count == 2)
-			result = project.getLocation();
-		else {
-			resolvedPath = resolvedPath.removeFirstSegments(2);
-			result = project.getFile(resolvedPath).getLocation();
-		}
-		return new URL("file", "", result.toString()); //$NON-NLS-1$ //$NON-NLS-2$
-
-	}
-
-	public static void startup() {
-		PlatformURLHandler.register(PlatformURLModuleConnection.MODULE, PlatformURLModuleConnection.class);
-	}
-
-	// private IProject getRelevantProject(URI aModuleURI) {
-	// aModuleURI.segment()
-	// }
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ProjectComponentsImpl.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ProjectComponentsImpl.java
deleted file mode 100644
index 543a3ab..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ProjectComponentsImpl.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ProjectComponentsImpl.java,v 1.2 2005/08/26 16:45:31 cbridgha Exp $
- */
-package org.eclipse.wst.common.componentcore.internal.impl;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.emf.common.notify.Adapter;
-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.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.wst.common.componentcore.internal.ComponentcorePackage;
-import org.eclipse.wst.common.componentcore.internal.ProjectComponents;
-import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>Project Modules</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.impl.ProjectComponentsImpl#getProjectName <em>Project Name</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.impl.ProjectComponentsImpl#getComponents <em>Components</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ProjectComponentsImpl extends EObjectImpl implements ProjectComponents {
-	/**
-	 * The default value of the '{@link #getProjectName() <em>Project Name</em>}' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getProjectName()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PROJECT_NAME_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getProjectName() <em>Project Name</em>}' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getProjectName()
-	 * @generated
-	 * @ordered
-	 */
-	protected String projectName = PROJECT_NAME_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getComponents() <em>Components</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getComponents()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList components = null;
-
-	private boolean isIndexed;
-
-	private final Map modulesIndex = new HashMap();
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ProjectComponentsImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return ComponentcorePackage.eINSTANCE.getProjectComponents();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getProjectName() {
-		return projectName;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setProjectName(String newProjectName) {
-		String oldProjectName = projectName;
-		projectName = newProjectName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ComponentcorePackage.PROJECT_COMPONENTS__PROJECT_NAME, oldProjectName, projectName));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getComponents() {
-		if (components == null) {
-			components = new EObjectContainmentEList(WorkbenchComponent.class, this, ComponentcorePackage.PROJECT_COMPONENTS__COMPONENTS);
-		}
-		return components;
-	}
-
-	/**
-	 * <!-- 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 ComponentcorePackage.PROJECT_COMPONENTS__COMPONENTS:
-					return ((InternalEList)getComponents()).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 ComponentcorePackage.PROJECT_COMPONENTS__PROJECT_NAME:
-				return getProjectName();
-			case ComponentcorePackage.PROJECT_COMPONENTS__COMPONENTS:
-				return getComponents();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case ComponentcorePackage.PROJECT_COMPONENTS__PROJECT_NAME:
-				setProjectName((String)newValue);
-				return;
-			case ComponentcorePackage.PROJECT_COMPONENTS__COMPONENTS:
-				getComponents().clear();
-				getComponents().addAll((Collection)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case ComponentcorePackage.PROJECT_COMPONENTS__PROJECT_NAME:
-				setProjectName(PROJECT_NAME_EDEFAULT);
-				return;
-			case ComponentcorePackage.PROJECT_COMPONENTS__COMPONENTS:
-				getComponents().clear();
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case ComponentcorePackage.PROJECT_COMPONENTS__PROJECT_NAME:
-				return PROJECT_NAME_EDEFAULT == null ? projectName != null : !PROJECT_NAME_EDEFAULT.equals(projectName);
-			case ComponentcorePackage.PROJECT_COMPONENTS__COMPONENTS:
-				return components != null && !components.isEmpty();
-		}
-		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(" (projectName: ");
-		result.append(projectName);
-		result.append(')');
-		return result.toString();
-	}
-
-	public WorkbenchComponent findWorkbenchModule(String aDeployName) {
-		if (getComponents().size() == 1)
-			return ((WorkbenchComponent)getComponents().get(0)).getName().equals(aDeployName) ? (WorkbenchComponent)getComponents().get(0) : null;
-		if (!isIndexed()) 
-			indexModules(); 
-		return (WorkbenchComponent) getModulesIndex().get(aDeployName);
-	}
-
-	/**
-	 * @return
-	 */
-	private boolean isIndexed() {
-		return isIndexed;
-	}
-
-	/**
-	 * 
-	 */
-	private void indexModules() {
-		if (isIndexed)
-			return;
-
-		synchronized (modulesIndex) {
-			Adapter adapter = EcoreUtil.getAdapter(eAdapters(), ModuleIndexingAdapter.class);
-			if (adapter == null) 
-				eAdapters().add((adapter = new ModuleIndexingAdapter()));
-			
-			WorkbenchComponent module = null;
-			for(Iterator iter = getComponents().iterator(); iter.hasNext(); ) {
-				module = (WorkbenchComponent) iter.next();
-				modulesIndex.put(module.getName(), module);
-			}
-		}
-		isIndexed = true;
-	}
-
-	/**
-	 * @return
-	 */
-	/* package */ Map getModulesIndex() {
-		return modulesIndex;
-	}
-
-} // ProjectComponentsImpl
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/PropertyImpl.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/PropertyImpl.java
deleted file mode 100644
index eae8a93..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/PropertyImpl.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: PropertyImpl.java,v 1.1 2005/04/04 07:04:59 cbridgha Exp $
- */
-package org.eclipse.wst.common.componentcore.internal.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.wst.common.componentcore.internal.ComponentcorePackage;
-import org.eclipse.wst.common.componentcore.internal.Property;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Property</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.impl.PropertyImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.impl.PropertyImpl#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PropertyImpl extends EObjectImpl implements Property {
-	/**
-	 * 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 = "";
-
-	/**
-	 * 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 = "";
-
-	/**
-	 * 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 PropertyImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return ComponentcorePackage.eINSTANCE.getProperty();
-	}
-
-	/**
-	 * <!-- 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, ComponentcorePackage.PROPERTY__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, ComponentcorePackage.PROPERTY__VALUE, oldValue, value));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case ComponentcorePackage.PROPERTY__NAME:
-				return getName();
-			case ComponentcorePackage.PROPERTY__VALUE:
-				return getValue();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case ComponentcorePackage.PROPERTY__NAME:
-				setName((String)newValue);
-				return;
-			case ComponentcorePackage.PROPERTY__VALUE:
-				setValue((String)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case ComponentcorePackage.PROPERTY__NAME:
-				setName(NAME_EDEFAULT);
-				return;
-			case ComponentcorePackage.PROPERTY__VALUE:
-				setValue(VALUE_EDEFAULT);
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case ComponentcorePackage.PROPERTY__NAME:
-				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-			case ComponentcorePackage.PROPERTY__VALUE:
-				return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
-		}
-		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(", value: ");
-		result.append(value);
-		result.append(')');
-		return result.toString();
-	}
-
-} //PropertyImpl
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ReferencedComponentImpl.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ReferencedComponentImpl.java
deleted file mode 100644
index 084b06e..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ReferencedComponentImpl.java
+++ /dev/null
@@ -1,333 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ReferencedComponentImpl.java,v 1.2 2005/09/12 02:48:31 cbridgha Exp $
- */
-package org.eclipse.wst.common.componentcore.internal.impl;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-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.wst.common.componentcore.internal.ComponentcorePackage;
-import org.eclipse.wst.common.componentcore.internal.DependencyType;
-import org.eclipse.wst.common.componentcore.internal.ReferencedComponent;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Dependent Module</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.impl.ReferencedComponentImpl#getHandle <em>Handle</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.impl.ReferencedComponentImpl#getRuntimePath <em>Runtime Path</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.impl.ReferencedComponentImpl#getDependencyType <em>Dependency Type</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.impl.ReferencedComponentImpl#getDependentObject <em>Dependent Object</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ReferencedComponentImpl extends EObjectImpl implements ReferencedComponent {
-	/**
-	 * The default value of the '{@link #getHandle() <em>Handle</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHandle()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final URI HANDLE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getHandle() <em>Handle</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHandle()
-	 * @generated
-	 * @ordered
-	 */
-	protected URI handle = HANDLE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRuntimePath() <em>Runtime Path</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRuntimePath()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final IPath RUNTIME_PATH_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRuntimePath() <em>Runtime Path</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRuntimePath()
-	 * @generated
-	 * @ordered
-	 */
-	protected IPath runtimePath = RUNTIME_PATH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getDependencyType() <em>Dependency Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDependencyType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final DependencyType DEPENDENCY_TYPE_EDEFAULT = DependencyType.USES_LITERAL;
-
-	/**
-	 * The cached value of the '{@link #getDependencyType() <em>Dependency Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDependencyType()
-	 * @generated
-	 * @ordered
-	 */
-	protected DependencyType dependencyType = DEPENDENCY_TYPE_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getDependentObject() <em>Dependent Object</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDependentObject()
-	 * @generated
-	 * @ordered
-	 */
-	protected EObject dependentObject = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ReferencedComponentImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return ComponentcorePackage.eINSTANCE.getReferencedComponent();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public URI getHandle() {
-		return handle;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setHandle(URI newHandle) {
-		URI oldHandle = handle;
-		handle = newHandle;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ComponentcorePackage.REFERENCED_COMPONENT__HANDLE, oldHandle, handle));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IPath getRuntimePath() {
-		return runtimePath;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRuntimePath(IPath newRuntimePath) {
-		IPath oldRuntimePath = runtimePath;
-		runtimePath = newRuntimePath;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ComponentcorePackage.REFERENCED_COMPONENT__RUNTIME_PATH, oldRuntimePath, runtimePath));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DependencyType getDependencyType() {
-		return dependencyType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDependencyType(DependencyType newDependencyType) {
-		DependencyType oldDependencyType = dependencyType;
-		dependencyType = newDependencyType == null ? DEPENDENCY_TYPE_EDEFAULT : newDependencyType;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ComponentcorePackage.REFERENCED_COMPONENT__DEPENDENCY_TYPE, oldDependencyType, dependencyType));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EObject getDependentObject() {
-		if (dependentObject != null && dependentObject.eIsProxy()) {
-			EObject oldDependentObject = dependentObject;
-			dependentObject = (EObject)eResolveProxy((InternalEObject)dependentObject);
-			if (dependentObject != oldDependentObject) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE, ComponentcorePackage.REFERENCED_COMPONENT__DEPENDENT_OBJECT, oldDependentObject, dependentObject));
-			}
-		}
-		return dependentObject;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EObject basicGetDependentObject() {
-		return dependentObject;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDependentObject(EObject newDependentObject) {
-		EObject oldDependentObject = dependentObject;
-		dependentObject = newDependentObject;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ComponentcorePackage.REFERENCED_COMPONENT__DEPENDENT_OBJECT, oldDependentObject, dependentObject));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case ComponentcorePackage.REFERENCED_COMPONENT__HANDLE:
-				return getHandle();
-			case ComponentcorePackage.REFERENCED_COMPONENT__RUNTIME_PATH:
-				return getRuntimePath();
-			case ComponentcorePackage.REFERENCED_COMPONENT__DEPENDENCY_TYPE:
-				return getDependencyType();
-			case ComponentcorePackage.REFERENCED_COMPONENT__DEPENDENT_OBJECT:
-				if (resolve) return getDependentObject();
-				return basicGetDependentObject();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case ComponentcorePackage.REFERENCED_COMPONENT__HANDLE:
-				setHandle((URI)newValue);
-				return;
-			case ComponentcorePackage.REFERENCED_COMPONENT__RUNTIME_PATH:
-				setRuntimePath((IPath)newValue);
-				return;
-			case ComponentcorePackage.REFERENCED_COMPONENT__DEPENDENCY_TYPE:
-				setDependencyType((DependencyType)newValue);
-				return;
-			case ComponentcorePackage.REFERENCED_COMPONENT__DEPENDENT_OBJECT:
-				setDependentObject((EObject)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case ComponentcorePackage.REFERENCED_COMPONENT__HANDLE:
-				setHandle(HANDLE_EDEFAULT);
-				return;
-			case ComponentcorePackage.REFERENCED_COMPONENT__RUNTIME_PATH:
-				setRuntimePath(RUNTIME_PATH_EDEFAULT);
-				return;
-			case ComponentcorePackage.REFERENCED_COMPONENT__DEPENDENCY_TYPE:
-				setDependencyType(DEPENDENCY_TYPE_EDEFAULT);
-				return;
-			case ComponentcorePackage.REFERENCED_COMPONENT__DEPENDENT_OBJECT:
-				setDependentObject((EObject)null);
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case ComponentcorePackage.REFERENCED_COMPONENT__HANDLE:
-				return HANDLE_EDEFAULT == null ? handle != null : !HANDLE_EDEFAULT.equals(handle);
-			case ComponentcorePackage.REFERENCED_COMPONENT__RUNTIME_PATH:
-				return RUNTIME_PATH_EDEFAULT == null ? runtimePath != null : !RUNTIME_PATH_EDEFAULT.equals(runtimePath);
-			case ComponentcorePackage.REFERENCED_COMPONENT__DEPENDENCY_TYPE:
-				return dependencyType != DEPENDENCY_TYPE_EDEFAULT;
-			case ComponentcorePackage.REFERENCED_COMPONENT__DEPENDENT_OBJECT:
-				return dependentObject != 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(" (handle: ");
-		result.append(handle);
-		result.append(", runtimePath: ");
-		result.append(runtimePath);
-		result.append(", dependencyType: ");
-		result.append(dependencyType);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ReferencedComponentImpl
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ReferencedComponentXMIResourceFactory.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ReferencedComponentXMIResourceFactory.java
deleted file mode 100644
index 2a157ad..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ReferencedComponentXMIResourceFactory.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.impl;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.wst.common.internal.emf.resource.ReferencedXMIFactoryImpl;
-
-public class ReferencedComponentXMIResourceFactory extends
-		ReferencedXMIFactoryImpl {
-
-	public ReferencedComponentXMIResourceFactory() {
-		super();
-		// TODO Auto-generated constructor stub
-	}
-	/**
-	 * This is the method that subclasses can override to actually instantiate a new Resource
-	 * 
-	 * @param uri
-	 * @return
-	 */
-	protected Resource doCreateResource(URI uri) {
-		return new ReferencedComponentXMIResourceImpl(uri);
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ReferencedComponentXMIResourceImpl.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ReferencedComponentXMIResourceImpl.java
deleted file mode 100644
index 333b4b0..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ReferencedComponentXMIResourceImpl.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.impl;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.wst.common.internal.emf.resource.MappedXMIHelper;
-import org.eclipse.wst.common.internal.emf.resource.ReferencedXMIResourceImpl;
-
-public class ReferencedComponentXMIResourceImpl extends
-		ReferencedXMIResourceImpl implements Resource {
-
-	public ReferencedComponentXMIResourceImpl() {
-		super();
-		// TODO Auto-generated constructor stub
-	}
-
-	public ReferencedComponentXMIResourceImpl(URI uri) {
-		super(uri);
-		// TODO Auto-generated constructor stub
-	}
-	protected MappedXMIHelper doCreateXMLHelper() {
-		return new MappedComponentXMIHelper(this, getPrefixToPackageURIs());
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ResourceTreeNode.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ResourceTreeNode.java
deleted file mode 100644
index 04bc5ad..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ResourceTreeNode.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.impl;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.wst.common.componentcore.internal.ComponentResource;
-import org.eclipse.wst.common.componentcore.internal.ComponentcorePackage;
-import org.eclipse.wst.common.componentcore.internal.StructureEdit;
-import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-import org.eclipse.wst.common.componentcore.internal.util.IPathProvider;
-
-/**
- * <p>
- * The following class is experimental until fully documented.
- * </p>
- */
-public class ResourceTreeNode {
-	
-	public static final int CREATE_NONE = 0x0;
-	/** 
-	 * Type constant (bit mask value 1) which identifies creating child nodes.
-	 *
-	 */
-	public static final int CREATE_TREENODE_IFNEC = 0x1;
-
-	/**
-	 * Type constant (bit mask value 2) which identifies always creating a virtual resource.
-	 *
-	 */
-	public static final int CREATE_RESOURCE_ALWAYS = 0x2;
-
-	private final Set moduleResources = Collections.synchronizedSet(new HashSet());	
-	private final Map children = Collections.synchronizedMap(new HashMap());
-	private final Map transientChildResources = Collections.synchronizedMap(new HashMap());
-	private static final ComponentResource[] NO_MODULE_RESOURCES = new ComponentResource[]{};
-	private IPathProvider pathProvider;
-//	private ResourceTreeNode parent;
-	private String pathSegment;
-
-	public ResourceTreeNode(String aPathSegment, ResourceTreeNode parent, IPathProvider aPathProvider) {
-		pathSegment = aPathSegment;
-		pathProvider = aPathProvider;
-	}
-
-	public ResourceTreeNode addChild(ResourceTreeNode aChild) {
-		children.put(aChild.getPathSegment(), aChild);
-		return aChild;
-	}
-
-	public ResourceTreeNode addChild(ComponentResource aModuleResource) {
-		ResourceTreeNode newChild = findChild(getPathProvider().getPath(aModuleResource), CREATE_TREENODE_IFNEC);
-		if(newChild != null) {
-			newChild.addModuleResource(aModuleResource);
-			return newChild;
-		}
-		return null;
-	}
-
-	public ResourceTreeNode removeChild(ResourceTreeNode aChild) {
-		return (ResourceTreeNode) children.remove(aChild.getPathSegment());
-	}
-
-	public ResourceTreeNode removeChild(ComponentResource aModuleResource) { 
-		ResourceTreeNode containingChild = findChild(getPathProvider().getPath(aModuleResource), CREATE_NONE);
-		if(containingChild != null) {
-			containingChild.removeResource(aModuleResource);
-			if(containingChild.hasModuleResources())
-				return containingChild;
-			return removeChild(containingChild);
-		}
-		return null;
-	}
-
-	public ResourceTreeNode removeChild(IPath targetPath, ComponentResource aModuleResource) { 
-		ResourceTreeNode containingChild = findChild(targetPath, CREATE_NONE);
-		if(containingChild != null) {
-			containingChild.removeResource(aModuleResource);
-			if(containingChild.hasModuleResources())
-				return containingChild;
-			return removeChild(containingChild);
-		}
-		return null;			
-	}
-	
-	public void removeResource(ComponentResource aResource) {
-		moduleResources.remove(aResource);
-	}
-
-	public ResourceTreeNode findChild(IPath aPath) {
-		return findChild(aPath, CREATE_TREENODE_IFNEC);
-	}
-
-	public ResourceTreeNode findChild(IPath aPath, int creationFlags) {
-		if(aPath == null)
-			return null;
-		ResourceTreeNode child = this;
-		if (aPath.segmentCount() > 0) {
-			child = findChild(aPath.segment(0), creationFlags);
-			if (child == null)
-				return null;
-			if (aPath.segmentCount() == 1)
-				return child;
-			child = child.findChild(aPath.removeFirstSegments(1), creationFlags);
-
-		}
-		return child;
-	}
-
-	public ResourceTreeNode findChild(String aPathSegment) {
-		if (aPathSegment == null || aPathSegment.length() == 0)
-			return this;
-		return findChild(aPathSegment, CREATE_NONE);
-	}
-
-	public ResourceTreeNode findChild(String aPathSegment, int creationFlags) {
-		boolean toCreateChildIfNecessary = (creationFlags & CREATE_TREENODE_IFNEC) == CREATE_TREENODE_IFNEC;
-		ResourceTreeNode childNode = (ResourceTreeNode) children.get(aPathSegment);
-		if (childNode == null && toCreateChildIfNecessary)
-			childNode = addChild(aPathSegment);
-		return childNode;
-	}
-
-	public ComponentResource[] findModuleResources(IPath aPath, int creationFlags) {
-
-		Set foundModuleResources = findModuleResourcesSet(aPath, aPath, creationFlags);
-		if (foundModuleResources.size() == 0)
-			return NO_MODULE_RESOURCES;
-		return (ComponentResource[]) foundModuleResources.toArray(new ComponentResource[foundModuleResources.size()]);
-	}
-	public boolean exists(IPath aPath, int creationFlags) {
-
-		Set foundModuleResources = findModuleResourcesSet(aPath, aPath, creationFlags);
-		if (foundModuleResources.size() == 0) {
-			if (true) {
-				ResourceTreeNode child = findChild(aPath.segment(0), creationFlags);
-				if (child != null)
-					return true;
-			}
-			return false;
-		}
-		return true;
-	}
-
-	public boolean hasModuleResources() {
-		return moduleResources.size() > 0;
-	}
-
-	public ComponentResource[] getModuleResources() {
-		return (ComponentResource[]) moduleResources.toArray(new ComponentResource[moduleResources.size()]);
-	}
-
-	private Set findModuleResourcesSet(IPath aFullPath, IPath aPath, int creationFlags) {
-
-		if (aPath.segmentCount() == 0) {
-			Set resources = aggregateResources(new HashSet());
-			return resources;
-		}
-		ResourceTreeNode child = findChild(aPath.segment(0), creationFlags);
-		if (child == null)
-			return findMatchingVirtualPathsSet(aFullPath, aPath, creationFlags);
-		Set foundResources = new HashSet();
-		foundResources.addAll(child.findModuleResourcesSet(aFullPath, aPath.removeFirstSegments(1), creationFlags));
-		foundResources.addAll(findMatchingVirtualPathsSet(aFullPath, aPath, creationFlags));
-		return foundResources;
-	}
-
-	private Set findMatchingVirtualPathsSet(IPath aFullPath, IPath aPath, int creationFlags) {
-		boolean toCreateResourceAlways = (creationFlags & CREATE_RESOURCE_ALWAYS) == CREATE_RESOURCE_ALWAYS;
-		if (hasModuleResources()) {
-			ComponentResource moduleResource = null;
-			IResource eclipseResource = null;
-			IContainer eclipseContainer = null;
-			Set resultSet = new HashSet();
-			for (Iterator resourceIter = moduleResources.iterator(); resourceIter.hasNext();) {
-				moduleResource = (ComponentResource) resourceIter.next();
-				if(moduleResource.getRuntimePath() != null && moduleResource.eResource() != null) {
-					eclipseResource = StructureEdit.getEclipseResource(moduleResource);
-					
-					if (eclipseResource != null && (eclipseResource.getType() == IResource.FOLDER || eclipseResource.getType() == IResource.PROJECT)) {
-						eclipseContainer = (IContainer) eclipseResource;
-				 
-						IPath runtimeURI = moduleResource.getRuntimePath().append(aPath);
-						IPath srcPath = eclipseContainer.getProjectRelativePath().append(aPath);
-						
-						// check for existing subpath in tree
-						ComponentResource newResource = findExistingComponentResource(moduleResource.getComponent(), runtimeURI, srcPath);
-						
-						// add new resource if null
-						if(newResource == null) {
-							// flesh out the tree
-							IResource eclipseRes = eclipseContainer.findMember(aPath);
-							if ((toCreateResourceAlways) || (eclipseRes != null)) {
-								newResource = (ComponentResource)transientChildResources.get(srcPath);
-								if (newResource == null) {
-								newResource = ComponentcorePackage.eINSTANCE.getComponentcoreFactory().createComponentResource();
-								// Not setting the parent on this transient child resource
-								// newResource.setComponent(moduleResource.getComponent());
-								newResource.setRuntimePath(runtimeURI);
-								newResource.setSourcePath(srcPath);
-								if (eclipseRes != null)
-									newResource.setOwningProject(eclipseRes.getProject());
-								transientChildResources.put(srcPath,newResource);
-								}
-								resultSet.add(newResource);
-							}
-						}
-					}
-		
-				}
-			}
-			return resultSet.size() > 0 ? resultSet : Collections.EMPTY_SET;
-		}
-		return Collections.EMPTY_SET;
-	}
-
-	private ComponentResource findExistingComponentResource(WorkbenchComponent component, IPath runtimeURI, IPath srcPath) { 
-		List resources = component.getResources();
-		for (Iterator iter = resources.iterator(); iter.hasNext();) {
-			ComponentResource element = (ComponentResource) iter.next();
-			if(runtimeURI.equals(element.getRuntimePath()) && srcPath.equals(element.getSourcePath()))
-				return element;
-			
-		}
-		return null;
-	}
-
-	private Set aggregateResources(Set anAggregationSet) {
-		if (hasModuleResources())
-			anAggregationSet.addAll(moduleResources);
-		ResourceTreeNode childNode = null;
-		for (Iterator childrenIterator = children.values().iterator(); childrenIterator.hasNext();) {
-			childNode = (ResourceTreeNode) childrenIterator.next();
-			childNode.aggregateResources(anAggregationSet);
-		}
-		return anAggregationSet;
-	}
-
-	public int childrenCount() {
-		return children.size();
-	}
-
-	public String getPathSegment() {
-		return pathSegment;
-	}
-
-	protected ResourceTreeNode addChild(String aPathSegment) {
-		ResourceTreeNode newChild = null;
-		if ((newChild = (ResourceTreeNode) children.get(aPathSegment)) == null) {
-			newChild = new ResourceTreeNode(aPathSegment, this, pathProvider);
-			children.put(newChild.getPathSegment(), newChild);
-		}
-		return newChild;
-	}
-
-	protected ResourceTreeNode removeChild(String aPathSegment) {
-		return (ResourceTreeNode) children.remove(aPathSegment);
-	}
-
-	/* package */void addModuleResource(ComponentResource aModuleResource) {
-		moduleResources.add(aModuleResource);
-	}
-
-	/* package */IPathProvider getPathProvider() {
-		return pathProvider;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ResourceTreeRoot.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ResourceTreeRoot.java
deleted file mode 100644
index 86f4ce3..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ResourceTreeRoot.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.impl;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-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.URI;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.wst.common.componentcore.UnresolveableURIException;
-import org.eclipse.wst.common.componentcore.internal.ComponentResource;
-import org.eclipse.wst.common.componentcore.internal.ComponentcorePackage;
-import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-import org.eclipse.wst.common.componentcore.internal.util.IPathProvider;
-
-/**
- * <p>
- * The following class is experimental until fully documented.
- * </p>
- */
-public class ResourceTreeRoot extends ResourceTreeNode {
-	
-	private class ResourceTreeResourceListener extends AdapterImpl {
-		public void notifyChanged(Notification msg) {
-			
-			if(msg.getFeature() == ComponentcorePackage.eINSTANCE.getWorkbenchComponent_Resources()) {
-				ComponentResource resource = null;
-				switch(msg.getEventType()) {
-				case Notification.ADD:
-					resource = (ComponentResource) msg.getNewValue();
-					if(resource != null)
-						resource.eAdapters().add(getResourcePathListenerAdapter());					
-					break; 
-				case Notification.ADD_MANY:
-					List newValues = (List) msg.getNewValue();					
-					for (int i = 0; i < newValues.size(); i++) {
-						resource = (ComponentResource) newValues.get(i);
-						resource.eAdapters().add(getResourcePathListenerAdapter());
-					}
-					break;
-				case Notification.REMOVE:
-					resource = (ComponentResource) msg.getNewValue();
-					if(resource != null)
-						resource.eAdapters().remove(getResourcePathListenerAdapter());
-					break;
-				case Notification.REMOVE_MANY:
-					List removedValues = (List) msg.getNewValue();					
-					for (int i = 0; i < removedValues.size(); i++) {
-						resource = (ComponentResource) removedValues.get(i);
-						resource.eAdapters().remove(getResourcePathListenerAdapter());
-					}
-					break;
-				}
-			}
-		}
-	}
-	
-	private class ResourcePathListener extends AdapterImpl {
-		
-		public void setTarget(Notifier newTarget) {
-			if(newTarget instanceof ComponentResource) {				
-//				if(getTarget() != null) {
-//					if(getPathProvider().getPath((ComponentResource)getTarget()) != null)
-//						removeChild((ComponentResource)getTarget());
-//				}
-				ComponentResource resource = (ComponentResource) newTarget;
-				if(resource != null) {
-					if(getPathProvider().getPath(resource) != null)
-						addChild(resource);					
-				}		
-			}
-			super.setTarget(newTarget);
-		}
-		
-		public void notifyChanged(Notification msg) {
-			
-			if(msg.getFeature() == getPathProvider().getFeature()) {
-				ComponentResource resource = (ComponentResource) msg.getNotifier();
-				switch(msg.getEventType()) {
-				case Notification.SET:
-					
-					// remove the old value 
-					IPath oldPath = (IPath)msg.getOldValue();
-					if(oldPath!=null)
-						removeChild(oldPath, resource);
-					
-					IPath newPath = (IPath)msg.getNewValue();
-					if(newPath!=null)
-						addChild(resource);
-					break; 
-				}
-			}
-		}
-	}
-
-	// TODO The source tree should be attached to the project modules root, not each module.
-	public static ResourceTreeRoot getSourceResourceTreeRoot(WorkbenchComponent aModule) {
-		ResourceTreeRootAdapter resourceTreeAdapter = (ResourceTreeRootAdapter) EcoreUtil.getAdapter(aModule.eAdapters(), ResourceTreeRootAdapter.SOURCE_ADAPTER_TYPE);
-		if (resourceTreeAdapter != null)
-			return resourceTreeAdapter.getResourceTreeRoot();
-		resourceTreeAdapter = new ResourceTreeRootAdapter(ResourceTreeRootAdapter.SOURCE_TREE);
-		aModule.eAdapters().add(resourceTreeAdapter);
-		return resourceTreeAdapter.getResourceTreeRoot();
-	}
-
-	public static ResourceTreeRoot getDeployResourceTreeRoot(WorkbenchComponent aModule) {
-		ResourceTreeRootAdapter resourceTreeAdapter = (ResourceTreeRootAdapter) EcoreUtil.getAdapter(aModule.eAdapters(), ResourceTreeRootAdapter.DEPLOY_ADAPTER_TYPE);
-		if (resourceTreeAdapter != null)
-			return resourceTreeAdapter.getResourceTreeRoot();
-		resourceTreeAdapter = new ResourceTreeRootAdapter(ResourceTreeRootAdapter.DEPLOY_TREE);
-		aModule.eAdapters().add(resourceTreeAdapter);
-		return resourceTreeAdapter.getResourceTreeRoot();
-	}
-	
-	private final WorkbenchComponent module;
-	private ResourceTreeResourceListener listener;
-	private ResourcePathListener pathListener;
-
-	public ResourceTreeRoot(WorkbenchComponent aModule, IPathProvider aPathProvider) {
-		super("/", null, aPathProvider); //$NON-NLS-1$
-		module = aModule; 	
-		init();
-	}
-
-	private void init() {
-		module.eAdapters().add(getResourceTreeListenerAdapter());
-		List moduleResources = module.getResources();
-		ComponentResource moduleResource = null;		 
-		
-		for (int i = 0; i < moduleResources.size(); i++) {
-			moduleResource = (ComponentResource) moduleResources.get(i);
-			addChild(moduleResource);
-		}
-		
-	}
-
-	protected ResourceTreeResourceListener getResourceTreeListenerAdapter() {
-		if(listener == null)
-			listener = new ResourceTreeResourceListener();
-		return listener;
-	}
-
-	protected ResourcePathListener getResourcePathListenerAdapter() {
-		if(pathListener == null)
-			pathListener = new ResourcePathListener();
-		return pathListener;
-	}
-
-	public ComponentResource[] findModuleResources(URI aURI) {
-		IPath path = new Path(aURI.toString());
-		try {
-			if (ModuleURIUtil.ensureValidFullyQualifiedPlatformURI(aURI, false))
-				path = path.removeFirstSegments(1); 
-		} catch (UnresolveableURIException uurie) {
-
-		}
-		return findModuleResources(path, ResourceTreeNode.CREATE_NONE);
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ResourceTreeRootAdapter.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ResourceTreeRootAdapter.java
deleted file mode 100644
index 1e6dd7d..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ResourceTreeRootAdapter.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.impl;
-
-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.wst.common.componentcore.internal.WorkbenchComponent;
-import org.eclipse.wst.common.componentcore.internal.util.DeployedPathProvider;
-import org.eclipse.wst.common.componentcore.internal.util.IPathProvider;
-import org.eclipse.wst.common.componentcore.internal.util.SourcePathProvider;
-
-/**
- * <p>
- * The following class is experimental until fully documented.
- * </p>
- */
-public class ResourceTreeRootAdapter extends AdapterImpl implements Adapter {
-	
-	public static final Object SOURCE_ADAPTER_TYPE = new Object();
-	public static final Object DEPLOY_ADAPTER_TYPE = new Object();
-	public static final int SOURCE_TREE = 0;
-	public static final int DEPLOY_TREE = 1;
-	
-	private ResourceTreeRoot resourceTreeRoot;
-	private int type;
-	
-	public ResourceTreeRootAdapter(int aType) {
-		type = aType;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification msg) {
-		super.notifyChanged(msg);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object anAdapterType) {
-		return (SOURCE_ADAPTER_TYPE == anAdapterType && type == SOURCE_TREE) || (DEPLOY_ADAPTER_TYPE == anAdapterType && type == DEPLOY_TREE);
-	}
-	
-	public ResourceTreeRoot getResourceTreeRoot() {		
-		if(resourceTreeRoot != null)
-			return resourceTreeRoot;
-		synchronized(this) {
-			if(resourceTreeRoot == null) {
-				IPathProvider pathProvider= (type == DEPLOY_TREE) ? DeployedPathProvider.INSTANCE : SourcePathProvider.INSTANCE;
-				resourceTreeRoot = new ResourceTreeRoot((WorkbenchComponent)getTarget(), pathProvider);
-			}
-		}
-		return resourceTreeRoot;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WTPEntityResolver.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WTPEntityResolver.java
deleted file mode 100644
index d7fe0b1..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WTPEntityResolver.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.impl;
-
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.xml.sax.EntityResolver;
-import org.xml.sax.InputSource;
-
-// TODO: We need to port the strings used in the exceptions.
-/**
- * <p>
- * The following class is experimental until fully documented.
- * </p>
- */
-public class WTPEntityResolver implements EntityResolver {
-
-	/**
-	 * All the dtds that this resolver knows about; import strategies register these at startup
-	 */
-	protected static Map supportedDtDs;
-	
-	// static {
-	// registerDtD("http://www.w3.org/2001/xml.xsd", "xml.xsd"); //$NON-NLS-1$ //$NON-NLS-2$
-	// registerDtD("XMLSchema.dtd", "XMLSchema.dtd"); //$NON-NLS-1$ //$NON-NLS-2$
-	// registerDtD("datatypes.dtd", "datatypes.dtd"); //$NON-NLS-1$ //$NON-NLS-2$
-	// }
-	
-	public static WTPEntityResolver INSTANCE = new WTPEntityResolver();
-
-	/**
-	 * EjbXmlEntityResolver constructor comment.
-	 */
-	public WTPEntityResolver() {
-		super();
-	}
-
-	public static Map getSupportedDtDs() {
-		if (supportedDtDs == null)
-			supportedDtDs = new HashMap();
-		return supportedDtDs;
-	}
-
-	/**
-	 * Maps the system id for the dtd to a local id to be retrieved loaded from the class path
-	 */
-	public static void registerDtD(String systemID, String localID) {
-		// TODO Removing Registration mechanism until final location is found
-		/*
-		 * getSupportedDtDs().put(systemID, localID); getSupportedDtDs().put(getShortName(systemID),
-		 * localID);
-		 */
-	}
-
-	/**
-	 * for a system id with a URL that begins with "http://java.sun.com/", check to see if that is a
-	 * recognized dtd; if so, load the dtd from the class path using the value of the registered
-	 * dtd.
-	 * 
-	 * @return an Input source on a locally resolved dtd, or null of the systemid does not start
-	 *         with "http://java.sun.com/"
-	 * 
-	 * @throws SAXException
-	 *             with a nested NotSupportedException if the dtd is not recognized
-	 * @throws FileNotFoundException
-	 *             if the resolved dtd cannot be loaded from the classpath
-	 */
-	public org.xml.sax.InputSource resolveEntity(String publicId, String systemId) throws java.io.IOException, org.xml.sax.SAXException {
-		String localResourceName = null;
-		boolean isJavaSytemId = false;
-		if (shouldBeRegistered(systemId)) {
-			localResourceName = (String) getSupportedDtDs().get(systemId);
-			isJavaSytemId = true;
-		} else {
-			String shortName = getShortName(systemId);
-			localResourceName = (String) getSupportedDtDs().get(shortName);
-			if (localResourceName != null)
-				systemId = localResourceName;
-		}
-
-		if (localResourceName == null) {
-			if (isJavaSytemId) {
-				String message = "Type is unrecognized or not yet supported: PUBLIC_ID= {0};SYSTEM_ID={1}";
-				throw new org.xml.sax.SAXException(message);
-			}
-			return null;
-		}
-		ClassLoader loader = getClass().getClassLoader();
-		URL url = null;
-		if (loader == null) {
-			url = ClassLoader.getSystemResource(localResourceName);
-		} else {
-			url = loader.getResource(localResourceName);
-		}
-
-
-		if (url == null) {
-			String message = "Could not parse xml because the resolved resource \"{0}\" could not be found in classpath";
-			throw new java.io.FileNotFoundException(message);
-		}
-
-		InputSource result = new InputSource(url.toString());
-		result.setPublicId(publicId);
-		// force the encoding to be UTF8
-		result.setEncoding("UTF-8"); //$NON-NLS-1$
-
-		return result;
-	}
-
-	protected boolean shouldBeRegistered(String systemId) {
-		// TODO Removed Resolver function until file location is known...
-		return false;
-		/*
-		 * return systemId.startsWith(J2EEConstants.JAVA_SUN_COM_URL) ||
-		 * systemId.startsWith(J2EEConstants.WWW_W3_ORG_URL) ||
-		 * systemId.startsWith(J2EEConstants.WWW_IBM_COM_URL);
-		 */
-	}
-
-	/**
-	 * Returns the filename from the uri, or the segment after the last occurrence of a separator
-	 */
-	private static String getShortName(String uri) {
-		String tempURI = uri.replace('\\', '/');
-		while (tempURI.endsWith("/")) //$NON-NLS-1$
-			tempURI = tempURI.substring(0, tempURI.length() - 1);
-		int lastIndex = tempURI.lastIndexOf('/');
-		if (lastIndex == -1)
-			return uri;
-		return uri.substring(lastIndex + 1, tempURI.length());
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WTPModulesInit.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WTPModulesInit.java
deleted file mode 100644
index 4548d97..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WTPModulesInit.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.impl;
-
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.wst.common.componentcore.internal.ComponentcorePackage;
-import org.eclipse.wst.common.internal.emf.resource.EMF2DOMRendererFactory;
-import org.eclipse.wst.common.internal.emf.utilities.DOMUtilities;
-import org.eclipse.wst.common.internal.emf.utilities.EncoderDecoderRegistry;
-import org.eclipse.wst.common.internal.emf.utilities.ExtendedEcoreUtil;
-import org.eclipse.wst.common.internal.emf.utilities.PasswordEncoderDecoder;
-
-
-/**
- * <p>
- * The following class is experimental until fully documented.
- * </p>
- */
-public class WTPModulesInit {
- 
-	private static boolean isInitialized = false;
-	
-	public static void init() {
-		init(true);
-	}
-	
-	public static void init(boolean toPreregisterPackages) {
-		if (!isInitialized) {
-			isInitialized = true;
-			setDefaultEncoderDecoder();
-			DOMUtilities.setDefaultEntityResolver(WTPEntityResolver.INSTANCE); 
-			initResourceFactories();
-			
-			//TODO: Remove this line after SED Adapter is restored.
-			EMF2DOMRendererFactory.INSTANCE.setValidating(false);
-		}
-		if(toPreregisterPackages) 
-			preregisterPackages();
-	}
-	
-	private static void initResourceFactories() {
-		WTPModulesResourceFactory.register();	
-	}
-
-	/** 
-	 * If the currently defaulted encoder is the initial pass thru encoder,
-	 * then register a Password encoder for security; otherwise if a more sophisticated
-	 * encoder is already registered, then do nothing.
-	 */
-	private static void setDefaultEncoderDecoder() {
-		EncoderDecoderRegistry reg = EncoderDecoderRegistry.getDefaultRegistry();
-		if (reg.getDefaultEncoderDecoder() == EncoderDecoderRegistry.INITIAL_DEFAULT_ENCODER) {
-			reg.setDefaultEncoderDecoder(new PasswordEncoderDecoder());
-		}
-	}
-	
-	private static void preregisterPackages() { 
-		ExtendedEcoreUtil.preRegisterPackage("moduleCore.xmi", new EPackage.Descriptor() { //$NON-NLS-1$
-			public EPackage getEPackage() {
-				return ComponentcorePackage.eINSTANCE;
-			}
-		});
-	}
-	
-	
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WTPModulesResource.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WTPModulesResource.java
deleted file mode 100644
index 93c2084..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WTPModulesResource.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.impl;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.wst.common.componentcore.internal.util.WTPModulesTranslator;
-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.common.internal.emf.resource.TranslatorResourceImpl;
-
-/**
- * <p>
- * The following class is experimental until fully documented.
- * </p>
- */
-public class WTPModulesResource extends TranslatorResourceImpl implements TranslatorResource {
-	
-	public WTPModulesResource(URI aURI, Renderer aRenderer) {
-		super(aURI, aRenderer);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.TranslatorResourceImpl#getDefaultPublicId()
-	 */
-	protected String getDefaultPublicId() { 
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.TranslatorResourceImpl#getDefaultSystemId()
-	 */
-	protected String getDefaultSystemId() { 
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.TranslatorResourceImpl#getDefaultVersionID()
-	 */
-	protected int getDefaultVersionID() { 
-		return 0;
-	}
-
-	/* (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 WTPModulesTranslator.INSTANCE;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WTPModulesResourceFactory.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WTPModulesResourceFactory.java
deleted file mode 100644
index cf9c94a..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WTPModulesResourceFactory.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.impl;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-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;
-
-/**
- * <p>
- * The following class is experimental until fully documented.
- * </p>
- */
-public class WTPModulesResourceFactory extends TranslatorResourceFactory {
-	
-	
-	public static final String WTP_MODULES_SHORT_NAME = ".component"; //$NON-NLS-1$
-	public static final URI WTP_MODULES_URI_OBJ = URI.createURI(".settings/" + WTP_MODULES_SHORT_NAME);
-
-	/**
-	 * Method registerDtds.
-	 */
-	public static void registerDtds() {
-		//do nothing
-	}
-
-	/**
-	 * Constructor for ApplicationClientResourceFactory.
-	 * @param aRendererFactory
-	 */
-	public WTPModulesResourceFactory(RendererFactory aRendererFactory) {
-		super(aRendererFactory);
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.emf2xml.RendererFactory.Listener#updateRendererFactory(com.ibm.etools.emf2xml.RendererFactory)
-	 */
-	public void updateRendererFactory(RendererFactory newRendererFactory) {
-		//Do Nothing...   not allowed to switch
-	}
-
-	/**
-	 * @see com.ibm.etools.emf2xml.impl.TranslatorResourceFactory#createResource(URI, Renderer)
-	 */
-	protected TranslatorResource createResource(URI uri, Renderer aRenderer) {
-		return new WTPModulesResource(uri, aRenderer);
-	}
-	
-	/**
-	 * Register myself with the Resource.Factory.Registry
-	 */
-	public static void registerWith(RendererFactory aRendererFactory) {
-		WTPResourceFactoryRegistry.INSTANCE.registerLastFileSegment(WTP_MODULES_SHORT_NAME, new WTPModulesResourceFactory(aRendererFactory));
-	}
-	/**
-	 * register using the default renderer factory.
-	 * @see #registerWith(RendererFactory)
-	 */
-	public static void register() {
-		registerWith(EMF2DOMRendererFactory.INSTANCE);
-	}
-
-	
-	public static Resource.Factory getRegisteredFactory() {
-		return WTPResourceFactoryRegistry.INSTANCE.getFactory(WTP_MODULES_URI_OBJ);
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WTPResourceFactoryRegistry.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WTPResourceFactoryRegistry.java
deleted file mode 100644
index ce47a23..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WTPResourceFactoryRegistry.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.impl;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.wst.common.internal.emf.resource.FileNameResourceFactoryRegistry;
-
-/**
- * <p>
- * The following class is experimental until fully documented.
- * </p>
- */
-public class WTPResourceFactoryRegistry extends FileNameResourceFactoryRegistry {
-
-	public static final WTPResourceFactoryRegistry INSTANCE = new WTPResourceFactoryRegistry();
-	
-	public Resource.Factory delegatedGetFactory(URI uri) {
-		if (WTPResourceFactoryRegistry.INSTANCE == this)
-			return super.delegatedGetFactory(uri);
-		return WTPResourceFactoryRegistry.INSTANCE.getFactory(uri);	
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WorkbenchComponentImpl.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WorkbenchComponentImpl.java
deleted file mode 100644
index 767d76f..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WorkbenchComponentImpl.java
+++ /dev/null
@@ -1,492 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WorkbenchComponentImpl.java,v 1.7.2.1 2006/01/25 15:01:18 cbridgha Exp $
- */
-package org.eclipse.wst.common.componentcore.internal.impl;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.URI;
-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.EDataTypeUniqueEList;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.wst.common.componentcore.internal.ComponentResource;
-import org.eclipse.wst.common.componentcore.internal.ComponentType;
-import org.eclipse.wst.common.componentcore.internal.ComponentcorePackage;
-import org.eclipse.wst.common.componentcore.internal.Property;
-import org.eclipse.wst.common.componentcore.internal.ReferencedComponent;
-import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>Workbench Module</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.impl.WorkbenchComponentImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.impl.WorkbenchComponentImpl#getResources <em>Resources</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.impl.WorkbenchComponentImpl#getComponentType <em>Component Type</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.impl.WorkbenchComponentImpl#getReferencedComponents <em>Referenced Components</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.impl.WorkbenchComponentImpl#getProperties <em>Properties</em>}</li>
- *   <li>{@link org.eclipse.wst.common.componentcore.internal.impl.WorkbenchComponentImpl#getMetadataResources <em>Metadata Resources</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class WorkbenchComponentImpl extends EObjectImpl implements WorkbenchComponent {
-	/**
-	 * 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 = "";
-
-	/**
-	 * 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 #getResources() <em>Resources</em>}' containment reference list.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @see #getResources()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList resources = 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 ComponentType componentType = null;
-
-	/**
-	 * The cached value of the '{@link #getReferencedComponents() <em>Referenced Components</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getReferencedComponents()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList referencedComponents = null;
-
-	/**
-	 * The cached value of the '{@link #getProperties() <em>Properties</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getProperties()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList properties = null;
-
-	/**
-	 * The cached value of the '{@link #getMetadataResources() <em>Metadata Resources</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMetadataResources()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList metadataResources = null;
-
-	private final Map resourceIndexByDeployPath = new HashMap();
-	private final Map resourceIndexBySourcePath = new HashMap();
-
-	private boolean isIndexedByDeployPath;
-
-	private boolean isIndexedBySourcePath;
-
-	private static final ComponentResource[] NO_MODULE_RESOURCES = new ComponentResource[0];
-
-	private URI handle;
-	
-	private IPath defaultSourceRoot;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WorkbenchComponentImpl() {
-		super();
-	}
-	private IPath getFirstRootSource() {
-		
-		List res = getResources();
-		for (Iterator iter = res.iterator(); iter.hasNext();) {
-			ComponentResource element = (ComponentResource) iter.next();
-			if (element.getRuntimePath().equals(new Path("/")))
-				return element.getSourcePath();
-			
-		}	
-		return null;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return ComponentcorePackage.eINSTANCE.getWorkbenchComponent();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNameGen(String newName) {
-		String oldName = name;
-		name = newName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ComponentcorePackage.WORKBENCH_COMPONENT__NAME, oldName, name));
-	}
-
-	public void setName(String newDeployedName) {
-		setNameGen(newDeployedName);
-		// TODO A more advanced adapter should be applied to keep the handle up to date.
-		if (eResource() != null) {
-			URI resourceURI = eResource().getURI();
-			String safeDeployedName = getName() != null ? getName() : ""; //$NON-NLS-1$
-			if (resourceURI != null && resourceURI.segmentCount() >= 2)
-				setHandle(computeHandle());
-		}
-	}
-	
-	protected void setHandle(URI aHandle) {
-		handle = aHandle;
-	}
-	
-	public URI getHandle() {
-		if(handle == null)
-			handle = computeHandle();
-		return handle;
-	}
-
-	private URI computeHandle() {
-		return URI.createURI(PlatformURLModuleConnection.MODULE_PROTOCOL + IPath.SEPARATOR + PlatformURLModuleConnection.RESOURCE_MODULE + IPath.SEPARATOR + computeProjectName() + IPath.SEPARATOR + getName());
-		
-	}
-
-	private String computeProjectName() {
-		IProject project = ProjectUtilities.getProject(this);
-		return (project!=null)?project.getName():"UNCONTAINED"; //$NON-NLS-1$
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getResources() {
-		if (resources == null) {
-			resources = new EObjectContainmentWithInverseEList(ComponentResource.class, this, ComponentcorePackage.WORKBENCH_COMPONENT__RESOURCES, ComponentcorePackage.COMPONENT_RESOURCE__COMPONENT);
-		}
-		return resources;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentType getComponentType() {
-		return componentType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetComponentType(ComponentType newComponentType, NotificationChain msgs) {
-		ComponentType oldComponentType = componentType;
-		componentType = newComponentType;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ComponentcorePackage.WORKBENCH_COMPONENT__COMPONENT_TYPE, oldComponentType, newComponentType);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setComponentType(ComponentType newComponentType) {
-		if (newComponentType != componentType) {
-			NotificationChain msgs = null;
-			if (componentType != null)
-				msgs = ((InternalEObject)componentType).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ComponentcorePackage.WORKBENCH_COMPONENT__COMPONENT_TYPE, null, msgs);
-			if (newComponentType != null)
-				msgs = ((InternalEObject)newComponentType).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ComponentcorePackage.WORKBENCH_COMPONENT__COMPONENT_TYPE, null, msgs);
-			msgs = basicSetComponentType(newComponentType, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ComponentcorePackage.WORKBENCH_COMPONENT__COMPONENT_TYPE, newComponentType, newComponentType));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getReferencedComponents() {
-		if (referencedComponents == null) {
-			referencedComponents = new EObjectContainmentEList(ReferencedComponent.class, this, ComponentcorePackage.WORKBENCH_COMPONENT__REFERENCED_COMPONENTS);
-		}
-		return referencedComponents;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getProperties() {
-		if (properties == null) {
-			properties = new EObjectResolvingEList(Property.class, this, ComponentcorePackage.WORKBENCH_COMPONENT__PROPERTIES);
-		}
-		return properties;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getMetadataResources() {
-		if (metadataResources == null) {
-			metadataResources = new EDataTypeUniqueEList(IPath.class, this, ComponentcorePackage.WORKBENCH_COMPONENT__METADATA_RESOURCES);
-		}
-		return metadataResources;
-	}
-
-	/**
-	 * <!-- 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 ComponentcorePackage.WORKBENCH_COMPONENT__RESOURCES:
-					return ((InternalEList)getResources()).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 ComponentcorePackage.WORKBENCH_COMPONENT__RESOURCES:
-					return ((InternalEList)getResources()).basicRemove(otherEnd, msgs);
-				case ComponentcorePackage.WORKBENCH_COMPONENT__COMPONENT_TYPE:
-					return basicSetComponentType(null, msgs);
-				case ComponentcorePackage.WORKBENCH_COMPONENT__REFERENCED_COMPONENTS:
-					return ((InternalEList)getReferencedComponents()).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 ComponentcorePackage.WORKBENCH_COMPONENT__NAME:
-				return getName();
-			case ComponentcorePackage.WORKBENCH_COMPONENT__RESOURCES:
-				return getResources();
-			case ComponentcorePackage.WORKBENCH_COMPONENT__COMPONENT_TYPE:
-				return getComponentType();
-			case ComponentcorePackage.WORKBENCH_COMPONENT__REFERENCED_COMPONENTS:
-				return getReferencedComponents();
-			case ComponentcorePackage.WORKBENCH_COMPONENT__PROPERTIES:
-				return getProperties();
-			case ComponentcorePackage.WORKBENCH_COMPONENT__METADATA_RESOURCES:
-				return getMetadataResources();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case ComponentcorePackage.WORKBENCH_COMPONENT__NAME:
-				setName((String)newValue);
-				return;
-			case ComponentcorePackage.WORKBENCH_COMPONENT__RESOURCES:
-				getResources().clear();
-				getResources().addAll((Collection)newValue);
-				return;
-			case ComponentcorePackage.WORKBENCH_COMPONENT__COMPONENT_TYPE:
-				setComponentType((ComponentType)newValue);
-				return;
-			case ComponentcorePackage.WORKBENCH_COMPONENT__REFERENCED_COMPONENTS:
-				getReferencedComponents().clear();
-				getReferencedComponents().addAll((Collection)newValue);
-				return;
-			case ComponentcorePackage.WORKBENCH_COMPONENT__PROPERTIES:
-				getProperties().clear();
-				getProperties().addAll((Collection)newValue);
-				return;
-			case ComponentcorePackage.WORKBENCH_COMPONENT__METADATA_RESOURCES:
-				getMetadataResources().clear();
-				getMetadataResources().addAll((Collection)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case ComponentcorePackage.WORKBENCH_COMPONENT__NAME:
-				setName(NAME_EDEFAULT);
-				return;
-			case ComponentcorePackage.WORKBENCH_COMPONENT__RESOURCES:
-				getResources().clear();
-				return;
-			case ComponentcorePackage.WORKBENCH_COMPONENT__COMPONENT_TYPE:
-				setComponentType((ComponentType)null);
-				return;
-			case ComponentcorePackage.WORKBENCH_COMPONENT__REFERENCED_COMPONENTS:
-				getReferencedComponents().clear();
-				return;
-			case ComponentcorePackage.WORKBENCH_COMPONENT__PROPERTIES:
-				getProperties().clear();
-				return;
-			case ComponentcorePackage.WORKBENCH_COMPONENT__METADATA_RESOURCES:
-				getMetadataResources().clear();
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case ComponentcorePackage.WORKBENCH_COMPONENT__NAME:
-				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-			case ComponentcorePackage.WORKBENCH_COMPONENT__RESOURCES:
-				return resources != null && !resources.isEmpty();
-			case ComponentcorePackage.WORKBENCH_COMPONENT__COMPONENT_TYPE:
-				return componentType != null;
-			case ComponentcorePackage.WORKBENCH_COMPONENT__REFERENCED_COMPONENTS:
-				return referencedComponents != null && !referencedComponents.isEmpty();
-			case ComponentcorePackage.WORKBENCH_COMPONENT__PROPERTIES:
-				return properties != null && !properties.isEmpty();
-			case ComponentcorePackage.WORKBENCH_COMPONENT__METADATA_RESOURCES:
-				return metadataResources != null && !metadataResources.isEmpty();
-		}
-		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(", metadataResources: ");
-		result.append(metadataResources);
-		result.append(')');
-		return result.toString();
-	}
-
-	public ComponentResource[] findResourcesByRuntimePath(IPath aDeployPath) { 
-		ResourceTreeRoot resourceTreeRoot = ResourceTreeRoot.getDeployResourceTreeRoot(this);
-		return resourceTreeRoot.findModuleResources(aDeployPath, ResourceTreeNode.CREATE_NONE); 
-	}
-
-	public ComponentResource[] findResourcesBySourcePath(IPath aSourcePath, int resourceFlag) { 
-		ResourceTreeRoot resourceTreeRoot = ResourceTreeRoot.getSourceResourceTreeRoot(this);
-		return resourceTreeRoot.findModuleResources(aSourcePath, resourceFlag); 
-	}
-	public boolean exists(IPath aSourcePath, int resourceFlag) { 
-		ResourceTreeRoot resourceTreeRoot = ResourceTreeRoot.getSourceResourceTreeRoot(this);
-		return resourceTreeRoot.exists(aSourcePath, resourceFlag); 
-	}
-	
-	public IPath getDefaultSourceRoot() {
-		if (defaultSourceRoot == null)
-			defaultSourceRoot = getFirstRootSource();
-		return defaultSourceRoot;
-	}
-	
-	public void setDefaultSourceRoot(IPath defaultSourceRoot) {
-		this.defaultSourceRoot = defaultSourceRoot;
-	}
-  
-
-} // WorkbenchComponentImpl
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ArtifactEditOperationDataModelProvider.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ArtifactEditOperationDataModelProvider.java
deleted file mode 100644
index 3ac5534..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ArtifactEditOperationDataModelProvider.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.operation;
-
-import java.util.Set;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.wst.common.componentcore.ArtifactEdit;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.internal.StructureEdit;
-import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelProvider;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonMessages;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
-
-public class ArtifactEditOperationDataModelProvider extends AbstractDataModelProvider implements IArtifactEditOperationDataModelProperties {
-
-	public ArtifactEditOperationDataModelProvider() {
-		super();
-	}
-
-	public Set getPropertyNames() {
-		Set propertyNames = super.getPropertyNames();
-		propertyNames.add(TYPE_ID);
-		propertyNames.add(PROJECT_NAME);
-		propertyNames.add(COMPONENT_NAME);
-		propertyNames.add(PROMPT_ON_SAVE);
-		propertyNames.add(TARGET_PROJECT);
-		propertyNames.add(TARGET_COMPONENT);
-		return propertyNames;
-	}
-
-	public IProject getTargetProject() {
-		String projectName = (String) model.getProperty(IArtifactEditOperationDataModelProperties.PROJECT_NAME);
-		if (projectName != null)
-			return ProjectUtilities.getProject(projectName);
-		return null;
-	}
-
-	public Object getDefaultProperty(String propertyName) {
-		if (propertyName.equals(PROMPT_ON_SAVE))
-			return Boolean.FALSE;
-		else if (propertyName.equals(TARGET_PROJECT))
-			return getTargetProject();
-		else if (propertyName.equals(TARGET_COMPONENT))
-			return getTargetComponent();
-		else if (propertyName.equals(COMPONENT_NAME))
-			return getStringProperty(PROJECT_NAME);
-		return super.getDefaultProperty(propertyName);
-	}
-
-	/**
-	 * @return
-	 */
-	public WorkbenchComponent getWorkbenchModule() {
-		StructureEdit moduleCore = null;
-		WorkbenchComponent module = null;
-		try {
-			moduleCore = StructureEdit.getStructureEditForRead(getTargetProject());
-			module = moduleCore.getComponent();
-		} finally {
-			if (null != moduleCore) {
-				moduleCore.dispose();
-			}
-		}
-		return module;
-	}
-
-	public ArtifactEdit getArtifactEditForRead() {
-		WorkbenchComponent module = getWorkbenchModule();
-		IProject proj = StructureEdit.getContainingProject(module);
-		return ArtifactEdit.getArtifactEditForRead(proj);
-	}
-
-	public IStatus validate(String propertyName) {
-		IStatus result = super.validate(propertyName);
-		if (result != null && !result.isOK())
-			return result;
-		else if (propertyName.equals(PROJECT_NAME))
-			return validateModuleName();
-		return result;
-	}
-
-	protected IStatus validateModuleName() {
-		String moduleName = getStringProperty(PROJECT_NAME);
-		if (moduleName == null || moduleName.length() == 0)
-			return WTPCommonPlugin.createErrorStatus(WTPCommonPlugin.getResourceString(WTPCommonMessages.PROJECT_NAME_EMPTY));
-		return WTPCommonPlugin.OK_STATUS;
-	}
-
-	public IVirtualComponent getTargetComponent() {
-		String moduleName = getStringProperty(COMPONENT_NAME);
-		if (moduleName != null && moduleName.length() > 0)
-			return ComponentCore.createComponent(getTargetProject());
-		return null;
-
-
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ArtifactEditProviderOperation.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ArtifactEditProviderOperation.java
deleted file mode 100644
index 77a320b..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ArtifactEditProviderOperation.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.operation;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
-import org.eclipse.wst.common.componentcore.ArtifactEdit;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.internal.util.ArtifactEditRegistryReader;
-import org.eclipse.wst.common.componentcore.internal.util.IArtifactEditFactory;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
-
-public abstract class ArtifactEditProviderOperation extends AbstractDataModelOperation {
-	
-	protected ArtifactEdit artifactEdit;
-	protected EMFWorkbenchContext emfWorkbenchContext;
-//	private CommandStack commandStack;
-
-	public ArtifactEditProviderOperation() {
-		super();
-		// TODO Auto-generated constructor stub
-	}
-
-	public ArtifactEditProviderOperation(IDataModel model) {
-		super(model);
-	}
-	
-	protected final void initialize(IProgressMonitor monitor) {
-		emfWorkbenchContext = (EMFWorkbenchContext) WorkbenchResourceHelperBase.createEMFContext(getTargetProject(), null);
-		IVirtualComponent component = getTargetComponent(); 
-		artifactEdit = getArtifactEditForModule(component);
-		doInitialize(monitor);
-	}
-	
-	public IProject getTargetProject() {
-		String projectName = model.getStringProperty(IArtifactEditOperationDataModelProperties.PROJECT_NAME);
-		return ProjectUtilities.getProject(projectName);
-	}
-	
-	public IVirtualComponent getTargetComponent() {
-		return ComponentCore.createComponent(getTargetProject());
-	}
-	
-	private void doInitialize(IProgressMonitor monitor) {
-		//Default
-	}
-
-	protected ArtifactEdit getArtifactEditForModule(IVirtualComponent comp) {
-		ArtifactEditRegistryReader reader = ArtifactEditRegistryReader.instance();
-		IArtifactEditFactory factory = reader.getArtifactEdit(comp.getProject());
-		if (factory == null)
-			return null;
-		return factory.createArtifactEditForWrite(comp);
-	}
-	
-	public IStatus redo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-		return null;
-	}
-
-	public IStatus undo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-		return null;
-	}
-
-	public void dispose() {
-		if (artifactEdit!=null) {
-			artifactEdit.saveIfNecessary(new NullProgressMonitor());
-			artifactEdit.dispose();
-		}
-			
-		super.dispose();
-		
-	}
-
-	public final IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-		try {
-			initialize(monitor);
-			return doExecute(monitor, info);
-		} finally {
-			dispose();
-		}
-	}
-	
-	public abstract IStatus doExecute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException;
-	
-	public ArtifactEdit getArtifactEdit(){
-		return artifactEdit;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ComponentCreationDataModelProvider.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ComponentCreationDataModelProvider.java
deleted file mode 100644
index 47ae08e..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ComponentCreationDataModelProvider.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.operation;
-
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IComponentCreationDataModelProperties;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IFlexibleProjectCreationDataModelProperties;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelProvider;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelEvent;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonMessages;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
-
-/**
- * This dataModel is a common super class used for creation of WTP Components.
- * 
- * This class (and all its fields and methods) is likely to change during the WTP 1.0 milestones as
- * the new project structures are adopted. Use at your own risk.
- * 
- * @plannedfor WTP 1.0
- */
-public abstract class ComponentCreationDataModelProvider extends AbstractDataModelProvider implements IComponentCreationDataModelProperties {
-
-	// protected boolean isProjMultiComponents = false;
-
-	public void init() {
-		super.init();
-		// isProjMultiComponents =
-		// FlexibleJavaProjectPreferenceUtil.getMultipleModulesPerProjectProp();
-		// model.getBooleanProperty(SUPPORT_MULTIPLE_MODULES) =
-		// model.getBooleanProperty(SUPPORT_MULTIPLE_MODULES);
-		initProjectCreationModel();
-	}
-
-	public Set getPropertyNames() {
-		Set propertyNames = super.getPropertyNames();
-		propertyNames.add(PROJECT_NAME);
-		propertyNames.add(NESTED_PROJECT_CREATION_DM);
-		propertyNames.add(COMPONENT_NAME);
-		propertyNames.add(COMPONENT_NAME);
-		propertyNames.add(LOCATION);
-		propertyNames.add(COMPONENT_DEPLOY_NAME);
-		propertyNames.add(CREATE_DEFAULT_FILES);
-		propertyNames.add(COMPONENT);
-		return propertyNames;
-	}
-
-	public void propertyChanged(DataModelEvent event) {
-		if (event.getFlag() == DataModelEvent.VALUE_CHG) {
-			event.getDataModel();
-		}
-	}
-
-	public boolean propertySet(String propertyName, Object propertyValue) {
-		if (COMPONENT_NAME.equals(propertyName)) {
-			model.setProperty(COMPONENT_DEPLOY_NAME, propertyValue);
-			model.setProperty(PROJECT_NAME, propertyValue);
-		} else if (COMPONENT_DEPLOY_NAME.equals(propertyName)) {
-			model.setProperty(COMPONENT_DEPLOY_NAME, propertyValue);
-		} else if (COMPONENT.equals(propertyName)) {
-			throw new RuntimeException(propertyName + " should not be set.");
-		} else if (PROJECT_NAME.equals(propertyName)) {
-			// if(!FlexibleJavaProjectPreferenceUtil.getMultipleModulesPerProjectProp()){
-			// model.notifyPropertyChange(PROJECT_NAME, IDataModel.VALUE_CHG);
-			// set the property in nested FlexibleJavaProjectCreationDataModelProvider
-			IDataModel dm = model.getNestedModel(NESTED_PROJECT_CREATION_DM);
-			dm.setProperty(IFlexibleProjectCreationDataModelProperties.PROJECT_NAME, propertyValue);
-			return true;
-			// }
-		}
-		return true;
-	}
-
-	public Object getDefaultProperty(String propertyName) {
-		if (propertyName.equals(CREATE_DEFAULT_FILES)) {
-			return Boolean.TRUE;
-		} else if (propertyName.equals(COMPONENT)) {
-			String projectName = getStringProperty(PROJECT_NAME);
-			IProject project = ProjectUtilities.getProject(projectName);
-			return ComponentCore.createComponent(project);
-		}
-		return super.getDefaultProperty(propertyName);
-	}
-
-	public IStatus validate(String propertyName) {
-		if (propertyName.equals(COMPONENT_NAME)) {
-			IStatus status = OK_STATUS;
-			String moduleName = model.getStringProperty(COMPONENT_NAME);
-			if (status.isOK()) {
-				if (moduleName.indexOf("#") != -1 || moduleName.indexOf("/") != -1) { //$NON-NLS-1$
-					String errorMessage = WTPCommonPlugin.getResourceString(WTPCommonMessages.ERR_INVALID_CHARS); //$NON-NLS-1$
-					return WTPCommonPlugin.createErrorStatus(errorMessage);
-				} else if (moduleName == null || moduleName.equals("")) { //$NON-NLS-1$
-					String errorMessage = WTPCommonPlugin.getResourceString(WTPCommonMessages.ERR_EMPTY_MODULE_NAME);
-					return WTPCommonPlugin.createErrorStatus(errorMessage);
-				} else
-					return OK_STATUS;
-			} else
-				return status;
-		} else if (propertyName.equals(PROJECT_NAME)) {
-			IStatus status = OK_STATUS;
-
-				String projectName = model.getStringProperty(PROJECT_NAME);
-				if (projectName == null || projectName.length() == 0) {
-					String errorMessage = WTPCommonPlugin.getResourceString(WTPCommonMessages.PROJECT_NAME_EMPTY);
-					status = WTPCommonPlugin.createErrorStatus(errorMessage);
-				}
-				if (status.isOK()) {
-					status = validateProjectName(projectName);
-					if (status.isOK()) {
-						IProject proj = ProjectUtilities.getProject(projectName);
-						if (proj.exists()) {
-							String errorMessage = WTPCommonPlugin.getResourceString(WTPCommonMessages.PROJECT_EXISTS_ERROR);
-							status = WTPCommonPlugin.createErrorStatus(errorMessage);
-						}
-					}					
-				}
-
-			return status;
-		} else if (propertyName.equals(COMPONENT_DEPLOY_NAME)) {
-			return OK_STATUS;
-		} else if (propertyName.equals(CREATE_DEFAULT_FILES)) {
-			return OK_STATUS;
-		}
-		return OK_STATUS;
-	}
-
-	protected IStatus validateProjectName(String projectName) {
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		IStatus status = workspace.validateName(projectName, IResource.PROJECT);
-		if (!status.isOK())
-			return status;
-
-		if (ProjectUtilities.getProject(projectName).exists())
-			return WTPCommonPlugin.createErrorStatus(WTPCommonPlugin.getResourceString(WTPCommonMessages.PROJECT_EXISTS_ERROR, new Object[]{projectName}));
-
-		if (projectName.indexOf("#") != -1) { //$NON-NLS-1$
-			// String errorMessage = J2EECreationResourceHandler.getString("InvalidCharsError");
-			// //$NON-NLS-1$
-			String errorMessage = "InvalidCharsError"; //$NON-NLS-1$
-			return WTPCommonPlugin.createErrorStatus(errorMessage);
-		}
-		return OK_STATUS;
-	}
-
-	// protected static String[] getServerVersions(String moduleID, IRuntimeType type) {
-	// List list = new ArrayList();
-	// if (type == null)
-	// return null;
-	// IModuleType[] moduleTypes = type.getModuleTypes();
-	// if (moduleTypes != null) {
-	// int size = moduleTypes.length;
-	// for (int i = 0; i < size; i++) {
-	// IModuleType moduleType = moduleTypes[i];
-	// if (matches(moduleType.getId(), moduleID)) {
-	// list.add(moduleType.getVersion());
-	// }
-	//
-	// }
-	// }
-	// String[] versions = null;
-	// if (!list.isEmpty()) {
-	// versions = new String[list.size()];
-	// list.toArray(versions);
-	// }
-	// return versions;
-	// }
-
-//	protected static boolean matches(String serverTypeID, String j2eeModuleID) {
-//
-//		if (serverTypeID.equals("j2ee")) {
-//			if (j2eeModuleID.equals(IModuleConstants.JST_WEB_MODULE) || j2eeModuleID.equals(IModuleConstants.JST_EJB_MODULE) || j2eeModuleID.equals(IModuleConstants.JST_EAR_MODULE) || j2eeModuleID.equals(IModuleConstants.JST_APPCLIENT_MODULE) || j2eeModuleID.equals(IModuleConstants.JST_CONNECTOR_MODULE)) {
-//				return true;
-//			}
-//		} else if (serverTypeID.equals("j2ee.*")) {
-//			if (j2eeModuleID.equals(IModuleConstants.JST_WEB_MODULE) || j2eeModuleID.equals(IModuleConstants.JST_EJB_MODULE) || j2eeModuleID.equals(IModuleConstants.JST_EAR_MODULE) || j2eeModuleID.equals(IModuleConstants.JST_APPCLIENT_MODULE) || j2eeModuleID.equals(IModuleConstants.JST_CONNECTOR_MODULE)) {
-//				return true;
-//			}
-//		} else if (serverTypeID.equals("j2ee.web")) {//$NON-NLS-1$
-//			if (j2eeModuleID.equals(IModuleConstants.JST_WEB_MODULE)) {
-//				return true;
-//			}
-//		} else if (serverTypeID.equals("j2ee.ejb")) {//$NON-NLS-1$
-//			if (j2eeModuleID.equals(IModuleConstants.JST_EJB_MODULE)) {
-//				return true;
-//			}
-//		} else if (serverTypeID.equals("j2ee.ear")) {//$NON-NLS-1$
-//			if (j2eeModuleID.equals(IModuleConstants.JST_EAR_MODULE) || j2eeModuleID.equals(IModuleConstants.JST_APPCLIENT_MODULE) || j2eeModuleID.equals(IModuleConstants.JST_CONNECTOR_MODULE)) {
-//				return true;
-//			}
-//		}
-//		return false;
-//	}
-
-	// private static boolean matches(String a, String b) {
-	// if (a == null || b == null || "*".equals(a) || "*".equals(b) || a.startsWith(b) ||
-	// b.startsWith(a)) //$NON-NLS-1$ //$NON-NLS-2$
-	// return true;
-	// return false;
-	// }
-
-
-	protected String getComponentName() {
-		return model.getStringProperty(COMPONENT_NAME);
-	}
-
-	protected String getComponentDeployName() {
-		return model.getStringProperty(COMPONENT_DEPLOY_NAME);
-	}
-
-	protected abstract void initProjectCreationModel();
-
-	protected abstract EClass getComponentType();
-
-	protected abstract String getComponentExtension();
-
-	protected abstract List getProperties();
-
-	protected abstract Integer getDefaultComponentVersion();
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ComponentCreationOperation.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ComponentCreationOperation.java
deleted file mode 100644
index dc43f45..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ComponentCreationOperation.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-
-package org.eclipse.wst.common.componentcore.internal.operation;
-
-import java.util.List;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IComponentCreationDataModelProperties;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IFlexibleProjectCreationDataModelProperties;
-import org.eclipse.wst.common.componentcore.internal.StructureEdit;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
-
-
-public abstract class ComponentCreationOperation extends AbstractDataModelOperation implements IComponentCreationDataModelProperties {
-
-    public ComponentCreationOperation(IDataModel model) {
-        super(model);
-    }
-
-    public IStatus execute(IProgressMonitor monitor, IAdaptable info) {
-        createProjectIfNeeded(monitor, info);
-		StructureEdit edit = null;
-        try {
-			edit = StructureEdit.getStructureEditForWrite(getProject());
-
-            createAndLinkJ2EEComponentsForSingleComponent();
-        }
-        catch (CoreException e) {
-            Logger.getLogger().log(e);
-        }
-		finally {
-			if (edit != null) {
-				edit.saveIfNecessary(monitor);
-				edit.dispose();
-			}
-			
-		}
-        
-        return OK_STATUS;
-    }
-
-    private void createProjectIfNeeded(IProgressMonitor monitor, IAdaptable info) {
-        Object dm = model.getNestedModel(NESTED_PROJECT_CREATION_DM);
-        if(dm == null) return;
-        String projName = ((IDataModel)dm).getStringProperty(IFlexibleProjectCreationDataModelProperties.PROJECT_NAME);
-           
-        IProject proj = ProjectUtilities.getProject(projName);
-        if(projName == null || projName.equals("") || proj.exists()) return;
-        IDataModelOperation op = ((IDataModel)dm).getDefaultOperation();
-        try {
-            op.execute(monitor, info);
-        } catch (ExecutionException e) {
-            e.printStackTrace();
-        }
-    }
-
-
-    protected abstract void createAndLinkJ2EEComponentsForMultipleComponents() throws CoreException;
-    
-    protected abstract void createAndLinkJ2EEComponentsForSingleComponent() throws CoreException;
-
-    protected String getComponentName() {
-        return model.getStringProperty(COMPONENT_NAME);
-    }
-
-    public String getComponentDeployName() {
-        return model.getStringProperty(COMPONENT_DEPLOY_NAME);
-    }
-
-    protected abstract String getVersion();
-
-    protected abstract List getProperties();
-
-	public IProject getProject() {
-	    String projName = model.getStringProperty(PROJECT_NAME);
-	    return ProjectUtilities.getProject(projName);
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/CreateReferenceComponentsDataModelProvider.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/CreateReferenceComponentsDataModelProvider.java
deleted file mode 100644
index 67429ee..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/CreateReferenceComponentsDataModelProvider.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.operation;
-
-import java.util.ArrayList;
-import java.util.Set;
-
-import org.eclipse.wst.common.componentcore.datamodel.properties.ICreateReferenceComponentsDataModelProperties;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelProvider;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
-
-public class CreateReferenceComponentsDataModelProvider extends AbstractDataModelProvider implements ICreateReferenceComponentsDataModelProperties {
-
-	public CreateReferenceComponentsDataModelProvider() {
-		super();
-
-	}
-
-	public Set getPropertyNames() {
-		Set propertyNames = super.getPropertyNames();
-		propertyNames.add(SOURCE_COMPONENT);
-		propertyNames.add(TARGET_COMPONENT_LIST);
-		propertyNames.add(TARGET_COMPONENTS_DEPLOY_PATH);
-		return propertyNames;
-	}
-
-
-	public IDataModelOperation getDefaultOperation() {
-		return new CreateReferenceComponentsOp(model);
-	}
-
-	public Object getDefaultProperty(String propertyName) {
-		if (propertyName.equals(TARGET_COMPONENT_LIST))
-			return new ArrayList();
-		else if (propertyName.equals(TARGET_COMPONENTS_DEPLOY_PATH)){
-			return "/";
-		}
-		return super.getDefaultProperty(propertyName);
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/CreateReferenceComponentsOp.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/CreateReferenceComponentsOp.java
deleted file mode 100644
index 25210f1..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/CreateReferenceComponentsOp.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.operation;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.datamodel.properties.ICreateReferenceComponentsDataModelProperties;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-
-public class CreateReferenceComponentsOp extends AbstractDataModelOperation {
-
-
-	public CreateReferenceComponentsOp(IDataModel model) {
-		super(model);
-	}
-	
-	public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-		addReferencedComponents(monitor);
-		addProjectReferences();
-		return OK_STATUS;
-	}
-	protected void addProjectReferences() {
-		
-		IVirtualComponent sourceComp = (IVirtualComponent) model.getProperty(ICreateReferenceComponentsDataModelProperties.SOURCE_COMPONENT);
-		List modList = (List) model.getProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST);
-		List targetprojectList = new ArrayList();
-		for( int i=0; i< modList.size(); i++){
-			IVirtualComponent IVirtualComponent = (IVirtualComponent) modList.get(i);
-			IProject targetProject = IVirtualComponent.getProject();
-			targetprojectList.add(targetProject);
-		}
-		try {
-			ProjectUtilities.addReferenceProjects(sourceComp.getProject(),targetprojectList);
-		} catch (CoreException e) {
-			e.printStackTrace();
-		}
-		
-	}
-	protected void addReferencedComponents(IProgressMonitor monitor) {
-		
-		IVirtualComponent sourceComp = (IVirtualComponent) model.getProperty(ICreateReferenceComponentsDataModelProperties.SOURCE_COMPONENT);
-		List vlist = new ArrayList();		
-        List modList = (List) model.getProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST);
-		for (int i = 0; i < modList.size(); i++) {
-			IVirtualComponent comp = (IVirtualComponent) modList.get(i);
-			if (!srcComponentContainsReference(sourceComp, comp)) {
-				IVirtualReference ref = ComponentCore.createReference(sourceComp, comp);
-				String deployPath = model.getStringProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENTS_DEPLOY_PATH);
-				if(deployPath != null && deployPath.length() > 0)
-					ref.setRuntimePath(new Path(deployPath));
-				vlist.add(ref);
-			}
-		}
-		
-		IVirtualReference[] refs = (IVirtualReference[]) vlist.toArray(new IVirtualReference[vlist.size()]);
-		sourceComp.addReferences(refs);
-	}
-
-	private boolean srcComponentContainsReference(IVirtualComponent sourceComp, IVirtualComponent comp) {
-		IVirtualReference[] existingReferences = sourceComp.getReferences();
-		for (int i = 0; i < existingReferences.length; i++) {
-			if(existingReferences[i].getReferencedComponent().getProject().equals(comp.getProject())){
-				return true;
-			}
-		}
-		return false;
-	}
-
-	public IStatus redo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-		return null;
-	}
-
-	public IStatus undo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-		return null;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/FacetDataModelOperation.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/FacetDataModelOperation.java
deleted file mode 100644
index 1558b11..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/FacetDataModelOperation.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.operation;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-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.common.project.facet.core.IFacetedProject.Action.Type;
-
-public class FacetDataModelOperation extends AbstractDataModelOperation {
-
-	public FacetDataModelOperation(IDataModel model) {
-		super(model);
-	}
-	
-	public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-		IFacetedProject facetProj;
-		try {
-			facetProj = ProjectFacetsManager.create(model.getStringProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME), null, monitor);
-			Set actions = new HashSet();
-			actions.add(new IFacetedProject.Action((Type) model.getProperty(IFacetDataModelProperties.FACET_TYPE), (IProjectFacetVersion) model.getProperty(IFacetDataModelProperties.FACET_VERSION), model));
-			facetProj.modify(actions, monitor);
-		} catch (CoreException e) {
-			throw new ExecutionException(e.getMessage(), e);
-		}
-		return OK_STATUS;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/FacetProjectCreationOperation.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/FacetProjectCreationOperation.java
deleted file mode 100644
index 51f9e3e..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/FacetProjectCreationOperation.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.operation;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-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.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.jem.util.logger.proxy.Logger;
-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.frameworks.datamodel.AbstractDataModelOperation;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.internal.operations.IProjectCreationPropertiesNew;
-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.project.facet.core.IFacetedProject.Action;
-import org.eclipse.wst.common.project.facet.core.runtime.IRuntime;
-
-public class FacetProjectCreationOperation extends AbstractDataModelOperation {
-
-	public FacetProjectCreationOperation() {
-		super();
-	}
-
-	public FacetProjectCreationOperation(IDataModel model) {
-		super(model);
-	}
-
-	public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-		try {
-			IFacetedProject facetProj = createProject(monitor);
-			Set existingFacets = facetProj.getProjectFacets();
-
-			Map dmMap = (Map) model.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
-			Set actions = new HashSet();
-			IDataModel facetDM = null;
-			for (Iterator iterator = dmMap.values().iterator(); iterator.hasNext();) {
-				facetDM = (IDataModel) iterator.next();
-				if (facetDM.getBooleanProperty(IFacetDataModelProperties.SHOULD_EXECUTE)) {
-					String facetID = facetDM.getStringProperty(IFacetDataModelProperties.FACET_ID);
-					boolean shouldInstallFacet = true;
-					for (Iterator existingFacetsIterator = existingFacets.iterator(); shouldInstallFacet && existingFacetsIterator.hasNext();) {
-						IProjectFacetVersion version = (IProjectFacetVersion) existingFacetsIterator.next();
-						if (version.getProjectFacet().getId().equals(facetID)) {
-							shouldInstallFacet = false;
-						}
-					}
-					if (shouldInstallFacet) {
-						actions.add(facetDM.getProperty(IFacetDataModelProperties.FACET_ACTION));
-					}
-				}
-			}
-			if (!actions.isEmpty()) {
-				facetProj.modify(actions, monitor);
-			}
-			Set fixedFacets = new HashSet(), newFacetVersions = facetProj.getProjectFacets(), existingFixedFacets = facetProj.getFixedProjectFacets();
-			for (Iterator iter = newFacetVersions.iterator(); iter.hasNext();) {
-				IProjectFacetVersion facetVersion = (IProjectFacetVersion) iter.next();
-				String facetID = facetVersion.getProjectFacet().getId();
-				boolean shouldInstallFacet = true;
-				for (Iterator existingFacetsIterator = existingFixedFacets.iterator(); shouldInstallFacet && existingFacetsIterator.hasNext();) {
-					IProjectFacet facet = (IProjectFacet) existingFacetsIterator.next();
-					if (facet.getId().equals(facetID)) {
-						shouldInstallFacet = false;
-					}
-				}
-				if (shouldInstallFacet) {
-					fixedFacets.add(facetVersion.getProjectFacet());
-				}
-			}
-			if (!fixedFacets.isEmpty()) {
-				facetProj.setFixedProjectFacets(fixedFacets);
-			}
-			IRuntime runtime = (IRuntime) model.getProperty(IFacetProjectCreationDataModelProperties.FACET_RUNTIME);
-			IRuntime existingRuntime = facetProj.getRuntime();
-			if (runtime != null && (existingRuntime == null || !runtime.equals(existingRuntime))) {
-				facetProj.setRuntime(runtime, null);
-				addDefaultFacets(facetProj,runtime.getDefaultFacets( fixedFacets ));
-			}
-
-		} catch (CoreException e) {
-			Logger.getLogger().logError(e);
-			throw new ExecutionException(e.getMessage(), e);
-		} catch (Exception e) {
-			Logger.getLogger().logError(e);
-		}
-		return OK_STATUS;
-	}
-
-	private void addDefaultFacets(IFacetedProject facetProj, Set defaultFacets) {
-		Set actions = new HashSet();
-		for (Iterator iter = defaultFacets.iterator(); iter.hasNext();) {
-			IProjectFacetVersion facetVersion = (IProjectFacetVersion) iter.next();
-			if (!facetProj.hasProjectFacet(facetVersion.getProjectFacet())) {
-				IDataModel dm = DataModelFactory.createDataModel(new FacetInstallDataModelProvider());
-				dm.setProperty(IFacetDataModelProperties.FACET_ID, facetVersion.getProjectFacet().getId());
-				dm.setProperty(IFacetDataModelProperties.FACET_PROJECT_NAME, facetProj.getProject().getName());
-				dm.setProperty(IFacetDataModelProperties.FACET_VERSION_STR, facetVersion.getVersionString()); //$NON-NLS-1$
-				actions.add(new IFacetedProject.Action(Action.Type.INSTALL, facetVersion, dm));
-			}
-		}
-		
-		try {
-			if (!actions.isEmpty())
-				facetProj.modify(actions,null);
-		} catch (CoreException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		
-	}
-	
-	public IFacetedProject createProject(IProgressMonitor monitor) throws CoreException {
-		IProject project = ProjectUtilities.getProject((String) model.getProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME));
-		IFacetedProject facetProj = null;
-		if (project.exists()) {
-			facetProj = ProjectFacetsManager.create(project, true, monitor);
-		} else {
-			String location = (String) model.getProperty(IProjectCreationPropertiesNew.PROJECT_LOCATION);
-			IPath locationPath = null == location ? null : new Path(location);
-			facetProj = ProjectFacetsManager.create(model.getStringProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME), locationPath, monitor);
-		}
-		return facetProj;
-	}
-
-	
-	private static void addDefaultFacetsInProject(IFacetedProject facetProj, Set defaultFacets) {
-		Set actions = new HashSet();
-		for (Iterator iter = defaultFacets.iterator(); iter.hasNext();) {
-			IProjectFacetVersion facetVersion = (IProjectFacetVersion) iter.next();
-			if (!facetProj.hasProjectFacet(facetVersion.getProjectFacet())) {
-				IDataModel dm = DataModelFactory.createDataModel(new FacetInstallDataModelProvider());
-				dm.setProperty(IFacetDataModelProperties.FACET_ID, facetVersion.getProjectFacet().getId());
-				dm.setProperty(IFacetDataModelProperties.FACET_PROJECT_NAME, facetProj.getProject().getName());
-				dm.setProperty(IFacetDataModelProperties.FACET_VERSION_STR, facetVersion.getVersionString()); //$NON-NLS-1$
-				actions.add(new IFacetedProject.Action(Action.Type.INSTALL, facetVersion, dm));
-			}
-		}
-		
-		try {
-			if (!actions.isEmpty())
-				facetProj.modify(actions,null);
-		} catch (CoreException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		
-	}
-	
-	public static void addDefaultFactets(IFacetedProject facetProj, IRuntime runtime) throws ExecutionException{
-	
-		Set fixedFacets = new HashSet(), newFacetVersions = facetProj.getProjectFacets(), existingFixedFacets = facetProj.getFixedProjectFacets();
-		for (Iterator iter = newFacetVersions.iterator(); iter.hasNext();) {
-			IProjectFacetVersion facetVersion = (IProjectFacetVersion) iter.next();
-			String facetID = facetVersion.getProjectFacet().getId();
-			boolean shouldInstallFacet = true;
-			for (Iterator existingFacetsIterator = existingFixedFacets.iterator(); shouldInstallFacet && existingFacetsIterator.hasNext();) {
-				IProjectFacet facet = (IProjectFacet) existingFacetsIterator.next();
-				if (facet.getId().equals(facetID)) {
-					shouldInstallFacet = false;
-				}
-			}
-			if (shouldInstallFacet) {
-				fixedFacets.add(facetVersion.getProjectFacet());
-			}
-		}
-		
-		try{
-			if (!fixedFacets.isEmpty()) {
-					facetProj.setFixedProjectFacets(fixedFacets);
-			}
-		
-			if (runtime != null ) {
-				addDefaultFacetsInProject(facetProj,runtime.getDefaultFacets( fixedFacets ));
-			}
-		}catch(CoreException e){
-			Logger.getLogger().logError(e);
-			throw new ExecutionException(e.getMessage(), e);			
-		}
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/FlexibleProjectCreationOperation.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/FlexibleProjectCreationOperation.java
deleted file mode 100644
index f4686bd..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/FlexibleProjectCreationOperation.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.operation;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IFlexibleProjectCreationDataModelProperties;
-import org.eclipse.wst.common.componentcore.internal.ProjectComponents;
-import org.eclipse.wst.common.componentcore.internal.StructureEdit;
-import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
-import org.eclipse.wst.common.frameworks.internal.WTPProjectUtilities;
-
-public class FlexibleProjectCreationOperation extends AbstractDataModelOperation {
-
-    public FlexibleProjectCreationOperation(IDataModel model) {
-        super(model);
-        // TODO Auto-generated constructor stub
-    }
-
-	public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-        try {
-			createProject(monitor);
-		    WTPProjectUtilities.addNatureToProjectLast(getProject(), IModuleConstants.MODULE_NATURE_ID);
-		} catch (CoreException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		} catch (InvocationTargetException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		} catch (InterruptedException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-        createInitialWTPModulesFile();
-		return OK_STATUS;
-	}
-
-    private void createProject(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException, ExecutionException {
-        IDataModel projModel = model.getNestedModel(IFlexibleProjectCreationDataModelProperties.NESTED_MODEL_PROJECT_CREATION);
-        IDataModelOperation op = projModel.getDefaultOperation();
-        op.execute(monitor, null);
-    }
-    
-    private void createInitialWTPModulesFile() {
-    	StructureEdit moduleCore = null;
-		try {
-			IProject containingProject = getProject();
-			moduleCore = StructureEdit.getStructureEditForWrite(containingProject);
-			moduleCore.prepareProjectComponentsIfNecessary(); 
-			ProjectComponents projectModules = moduleCore.getComponentModelRoot();
-			moduleCore.saveIfNecessary(null); 
-		} finally {
-			if(moduleCore != null)
-				moduleCore.dispose();
-		}     
-    }
-    
-    protected IProject getProject() {
-        String name = model.getStringProperty(IFlexibleProjectCreationDataModelProperties.PROJECT_NAME);
-        if (name != null && name.length() > 0)
-            return ResourcesPlugin.getWorkspace().getRoot().getProject(name);
-        return null;
-    }
-
-	public IStatus redo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public IStatus undo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-		// TODO Auto-generated method stub
-		return null;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/IArtifactEditOperationDataModelProperties.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/IArtifactEditOperationDataModelProperties.java
deleted file mode 100644
index f3c3924..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/IArtifactEditOperationDataModelProperties.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.operation;
-
-
-public interface IArtifactEditOperationDataModelProperties {
-
-	/**
-	 * Required
-	 */
-	public static final String TYPE_ID = "IArtifactEditOperationDataModelProperties.TYPE_ID"; //$NON-NLS-1$
-	
-	/**
-	 * Required
-	 */
-	public static final String PROJECT_NAME = "IArtifactEditOperationDataModelProperties.PROJECT_NAME"; //$NON-NLS-1$
-	/**
-	 * Required
-	 */
-	public static final String COMPONENT_NAME = "IArtifactEditOperationDataModelProperties.COMPONENT_NAME"; //$NON-NLS-1$
-	/**
-	 * Optional, should save with prompt...defaults to false
-	 */
-	public static final String PROMPT_ON_SAVE = "IArtifactEditOperationDataModelProperties.PROMPT_ON_SAVE"; //$NON-NLS-1$
-	
-	public static final String TARGET_PROJECT = "IArtifactEditOperationDataModelProperties.TARGET_PROJECT"; //$NON-NLS-1$
-	
-	public static final String TARGET_COMPONENT = "IArtifactEditOperationDataModelProperties.TARGET_COMPONENT"; //$NON-NLS-1$
-	
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ProjectMigratorDataModelOperation.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ProjectMigratorDataModelOperation.java
deleted file mode 100644
index 4a5b167..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ProjectMigratorDataModelOperation.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.operation;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IProjectMigratorDataModelProperties;
-import org.eclipse.wst.common.componentcore.internal.IComponentProjectMigrator;
-import org.eclipse.wst.common.componentcore.internal.ProjectMigratorRegistry;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject;
-
-public class ProjectMigratorDataModelOperation extends AbstractDataModelOperation {
-
-	public ProjectMigratorDataModelOperation(IDataModel model) {
-		super(model);
-	}
-	
-	public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-		IFacetedProject facetProj;
-		try {
-			IProject proj = ProjectUtilities.getProject(model.getStringProperty(IProjectMigratorDataModelProperties.PROJECT_NAME));
-			IComponentProjectMigrator[] migrators = ProjectMigratorRegistry.getInstance().getProjectMigrators();
-			for (int i = 0; i < migrators.length; i++) {
-				IComponentProjectMigrator migrator = migrators[i];
-				migrator.migrateProject(proj);
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-		return OK_STATUS;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/RemoveReferenceComponentOperation.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/RemoveReferenceComponentOperation.java
deleted file mode 100644
index ccfa7c2..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/RemoveReferenceComponentOperation.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.operation;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-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.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.wst.common.componentcore.datamodel.properties.ICreateReferenceComponentsDataModelProperties;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-
-public class RemoveReferenceComponentOperation extends AbstractDataModelOperation {
-
-	public RemoveReferenceComponentOperation() {
-		super();
-	}
-
-	public RemoveReferenceComponentOperation(IDataModel model) {
-		super(model);
-	}
-
-	public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-		removeReferencedComponents(monitor);
-		return OK_STATUS;
-	}
-
-	protected void removeReferencedComponents(IProgressMonitor monitor) {
-		
-		IVirtualComponent sourceComp = (IVirtualComponent) model.getProperty(ICreateReferenceComponentsDataModelProperties.SOURCE_COMPONENT);
-		if (!sourceComp.getProject().isAccessible()) return;
-		
-        List modList = (List) model.getProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST);
-    
-		List targetprojectList = new ArrayList();
-
-		for (int i = 0; i < modList.size(); i++) {
-			IVirtualComponent comp = (IVirtualComponent) modList.get(i);
-			IVirtualReference ref = sourceComp.getReference(comp.getName());
-			if( ref != null && ref.getReferencedComponent() != null && ref.getReferencedComponent().isBinary()){
-				removeRefereneceInComponent(sourceComp, ref);
-			}else{
-				if (Arrays.asList(comp.getReferencingComponents()).contains(sourceComp)) {
-					
-					String deployPath = model.getStringProperty( ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENTS_DEPLOY_PATH );
-					IPath path = new Path( deployPath );
-					
-					if( ref != null && ref.getRuntimePath() != null && path != null && ref.getRuntimePath().equals( path )){
-						removeRefereneceInComponent(sourceComp,sourceComp.getReference(comp.getName()));
-						IProject targetProject = comp.getProject();
-						targetprojectList.add(targetProject);
-					}
-				}					
-			}
-		}
-		
-		try {
-			ProjectUtilities.removeReferenceProjects(sourceComp.getProject(),targetprojectList);
-		} catch (CoreException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}		
-		
-	}
-
-	protected void removeRefereneceInComponent(IVirtualComponent component, IVirtualReference reference) {
-		List refList = new ArrayList();
-		IVirtualReference[] refArray = component.getReferences();
-		for (int i = 0; i < refArray.length; i++) {
-			if (refArray[i].getReferencedComponent() != null && !refArray[i].getReferencedComponent().equals(reference.getReferencedComponent()))
-				refList.add(refArray[i]);
-		}
-		component.setReferences((IVirtualReference[]) refList.toArray(new IVirtualReference[refList.size()]));
-	}
-
-	public IStatus redo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-		return null;
-	}
-
-	public IStatus undo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-		return null;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/RemoveReferenceComponentsDataModelProvider.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/RemoveReferenceComponentsDataModelProvider.java
deleted file mode 100644
index d48dbe0..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/RemoveReferenceComponentsDataModelProvider.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.operation;
-
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
-
-
-public class RemoveReferenceComponentsDataModelProvider extends CreateReferenceComponentsDataModelProvider {
-
-	public RemoveReferenceComponentsDataModelProvider() {
-		super();
-	}
-
-	public IDataModelOperation getDefaultOperation() {
-		return new RemoveReferenceComponentOperation(model);
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualArchiveComponent.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualArchiveComponent.java
deleted file mode 100644
index e28a679..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualArchiveComponent.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.resources;
-
-
-import java.io.File;
-import java.util.Properties;
-
-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.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.componentcore.UnresolveableURIException;
-import org.eclipse.wst.common.componentcore.internal.impl.ModuleURIUtil;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
-import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
-import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
-
-
-public class VirtualArchiveComponent implements IVirtualComponent, IAdaptable {
-
-	public static final Class ADAPTER_TYPE = VirtualArchiveComponent.class;
-	public static final String LIBARCHIVETYPE = "lib";
-	public static final String VARARCHIVETYPE = "var";
-
-	private static final IVirtualReference[] NO_REFERENCES = new VirtualReference[0];
-	private static final IVirtualComponent[] NO_COMPONENTS = new VirtualComponent[0];
-	private static final IResource[] NO_RESOURCES = null;
-	private static final IVirtualResource[] NO_VIRTUAL_RESOURCES = null;
-	private static final Properties NO_PROPERTIES = new Properties();
-	private static final IPath[] NO_PATHS = new Path[0];
-
-	private IPath runtimePath;
-	private IProject componentProject;
-	private IVirtualFolder rootFolder;
-	private int flag = 1;
-	private String archiveLocation;
-
-
-	private IPath archivePath;
-	private String archiveType;
-
-
-
-	public VirtualArchiveComponent(IProject aComponentProject,String archiveLocation, IPath aRuntimePath) {
-		componentProject = aComponentProject;
-		runtimePath = aRuntimePath;
-
-		String archivePathString = archiveLocation.substring(4, archiveLocation.length());
-		archiveType	= archiveLocation.substring(0, archiveLocation.length() - archivePathString.length() -1);
-		archivePath = new  Path(archivePathString);
-	}
-
-	public IVirtualComponent getComponent() {
-		return this;
-	}
-
-	public String getName() {
-		return this.archiveType + IPath.SEPARATOR + this.archivePath.toString();
-	}
-	
-	public String getDeployedName() {
-		return getName();
-	}
-
-	public void setComponentTypeId(String aComponentTypeId) {
-		return;
-	}
-
-	public int getType() {
-		return IVirtualResource.COMPONENT;
-	}
-
-	public boolean isBinary() {
-		boolean ret = (flag & BINARY) == 1 ? true : false;
-		return ret;
-	}
-
-	public IPath[] getMetaResources() {
-		return NO_PATHS;
-	}
-
-	public void setMetaResources(IPath[] theMetaResourcePaths) {
-
-	}
-
-	public void delete(int updateFlags, IProgressMonitor monitor) throws CoreException {
-
-	}
-
-	public String getFileExtension() {
-		return archivePath.getFileExtension();
-	}
-
-	public IPath getWorkspaceRelativePath() {
-		IFile aFile = ResourcesPlugin.getWorkspace().getRoot().getFile(archivePath);
-		if (aFile.exists())
-			aFile.getFullPath();
-		return null;
-	}
-
-	public IPath getProjectRelativePath() {
-		IFile aFile = ResourcesPlugin.getWorkspace().getRoot().getFile(getWorkspaceRelativePath());
-		if (aFile.exists())
-			return aFile.getProjectRelativePath();
-		return null;
-	}
-
-	public IProject getProject() {
-		return componentProject;
-	}
-
-	public IPath getRuntimePath() {
-		return ROOT;
-	}
-
-	public boolean isAccessible() {
-		return true;
-	}
-
-	public Properties getMetaProperties() {
-		return NO_PROPERTIES;
-	}
-
-	public IVirtualResource[] getResources(String aResourceType) {
-		return NO_VIRTUAL_RESOURCES;
-	}
-
-	public void create(int updateFlags, IProgressMonitor aMonitor) throws CoreException {
-
-	}
-
-	public IVirtualReference[] getReferences() {
-		return NO_REFERENCES;
-	}
-
-	public void setReferences(IVirtualReference[] theReferences) {
-		// no op
-	}
-	
-	public void addReferences(IVirtualReference[] references) {
-		// no op
-	}
-
-	public IVirtualReference getReference(String aComponentName) {
-		return null;
-	}
-
-	public boolean exists() {
-		return false;
-	}
-
-	public IVirtualFolder getRootFolder() {
-		return null;
-	}
-
-	public IVirtualComponent[] getReferencingComponents() {
-		return NO_COMPONENTS;
-	}
-
-
-	public Object getAdapter(Class adapterType) {
-		return Platform.getAdapterManager().getAdapter(this, adapterType);
-	}
-
-	public String getArchiveType() {
-		return archiveType;
-	}
-
-	public boolean equals(Object anOther) {
-		if (anOther instanceof VirtualArchiveComponent) {
-			VirtualArchiveComponent otherComponent = (VirtualArchiveComponent) anOther;
-			return getProject().equals(otherComponent.getProject()) && getName().equals(otherComponent.getName());
-		}
-		return false;
-	}
-
-	public void setMetaProperty(String name, String value) {
-
-	}
-
-	public void setMetaProperties(Properties properties) {
-
-	}
-	public IFile getUnderlyingWorkbenchFile() {
-		return ResourcesPlugin.getWorkspace().getRoot().getFile(getWorkspaceRelativePath());
-	}
-
-	public File getUnderlyingDiskFile() {
-		String osPath = "";
-		if (getArchiveType().equals(VirtualArchiveComponent.VARARCHIVETYPE)) {
-			IPath resolvedpath = (IPath) getAdapter(VirtualArchiveComponent.ADAPTER_TYPE);
-			osPath = resolvedpath.toOSString();
-		} else {
-			String fileString = null;
-			try {
-				String name = "[" + getProject().getFullPath() + "]:" + getName();
-				fileString = ModuleURIUtil.getArchiveName(URI.createURI(name));
-			} catch (UnresolveableURIException e) {
-				Logger.getLogger().logError(e);
-			}
-			IPath path = new Path(fileString);
-			osPath = path.toOSString();
-		}
-		File diskFile = new File(osPath);
-		return diskFile;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualComponent.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualComponent.java
deleted file mode 100644
index 519960f..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualComponent.java
+++ /dev/null
@@ -1,423 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.resources;
-
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Properties;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.internal.ComponentcoreFactory;
-import org.eclipse.wst.common.componentcore.internal.ComponentcorePackage;
-import org.eclipse.wst.common.componentcore.internal.DependencyType;
-import org.eclipse.wst.common.componentcore.internal.Property;
-import org.eclipse.wst.common.componentcore.internal.ReferencedComponent;
-import org.eclipse.wst.common.componentcore.internal.StructureEdit;
-import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-import org.eclipse.wst.common.componentcore.internal.builder.DependencyGraphManager;
-import org.eclipse.wst.common.componentcore.internal.impl.ModuleURIUtil;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
-import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
-import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
-
-
-public class VirtualComponent implements IVirtualComponent {
-	IPath			runtimePath;
-	IProject	componentProject;
-	IVirtualFolder	rootFolder;
-	String componentTypeId;
-	private int flag = 0;
-	
-
-	public VirtualComponent(IProject aProject, IPath aRuntimePath) {
-		componentProject = aProject;
-		runtimePath = aRuntimePath;
-		rootFolder = ComponentCore.createFolder(componentProject, new Path("/")); //$NON-NLS-1$
-	}
-	
-	public IVirtualComponent getComponent() {
-		return this;
-	}
-	
-	public String getName() {
-		return getProject().getName();
-	}
-	
-	public String getDeployedName() {
-		StructureEdit core = null;
-		IProject project = getProject();
-		try {
-			if (project != null && getName() != null) {
-				core = StructureEdit.getStructureEditForRead(project);
-				if(core != null && core.getComponent() != null){
-					WorkbenchComponent component = core.getComponent();
-					if (component.getName()!=null && component.getName().length()>0)
-						return component.getName();
-				}
-			}
-		} finally {
-			if(core != null)
-				core.dispose();
-		}
-		return getProject().getName();
-	}
-	
-	public boolean exists() { 
-		StructureEdit core = null;
-		IProject project = getProject();
-		try {
-			if (project != null && getName() != null) {
-				core = StructureEdit.getStructureEditForRead(project);
-				if(core == null){
-					return false;
-				}
-				WorkbenchComponent component = core.getComponent(); 
-				return component != null;
-			}
-		} finally {
-			if(core != null)
-				core.dispose();
-		}
-		return false;
-	}
-	
-//	public String getComponentTypeId() {
-//		if (null == componentTypeId) {
-//			StructureEdit core = null;
-//			try {
-//				if (getProject() == null || getName() == null)
-//					return null;
-//				core = StructureEdit.getStructureEditForRead(getProject());
-//				if (core == null)
-//					return null;
-//				WorkbenchComponent component = core.getComponent();
-//				ComponentType cType = component == null ? null : component.getComponentType();
-//				componentTypeId = cType == null ? null : cType.getComponentTypeId();
-//			} finally {
-//				if (core != null)
-//					core.dispose();
-//			}
-//		}
-//		return componentTypeId;
-//	}
-
-//	public void setComponentTypeId(String aComponentTypeId) {
-//
-//		StructureEdit core = null;
-//		try {
-//			core = StructureEdit.getStructureEditForWrite(getProject());
-//			WorkbenchComponent component = core.getComponent(); 
-//			ComponentType cType = component.getComponentType();
-//			if(cType == null) {
-//				cType = ComponentcorePackage.eINSTANCE.getComponentcoreFactory().createComponentType();
-//				component.setComponentType(cType);
-//			}
-//			cType.setComponentTypeId(aComponentTypeId);
-//		} finally {
-//			if(core != null) {
-//				core.saveIfNecessary(null);
-//				core.dispose();
-//			}
-//		}
-//	}
-
-	public Properties getMetaProperties() {
-        StructureEdit core = null;
-        Properties props = new Properties();
-        try {
-            core = StructureEdit.getStructureEditForRead(getProject());
-            if (core == null)
-            	return props;
-            WorkbenchComponent component = core.getComponent(); 
-            List propList = component.getProperties();
-            if(propList != null) {
-                for (int i = 0; i < propList.size(); i++) {
-                    props.setProperty(((Property)propList.get(i)).getName(), ((Property)propList.get(i)).getValue());
-                }
-            }
-            return props; 
-        } finally {
-            if(core != null)
-                core.dispose();
-        }
-	}
-
-	public void setMetaProperties(Properties properties) {
-        StructureEdit core = null;
-        try {
-            core = StructureEdit.getStructureEditForWrite(getProject());
-            WorkbenchComponent component = core.getComponent(); 
-            
-            List propList = component.getProperties();
-			if (properties != null && !properties.isEmpty()) {
-		        for(Enumeration itr = properties.keys(); itr.hasMoreElements();) {
-		            final String key = (String) itr.nextElement();
-		            final Property prop = ComponentcoreFactory.eINSTANCE.createProperty();
-		            prop.setName(key);
-		            prop.setValue(properties.getProperty(key));
-		            // Remove existing property first
-		            for (int i=0; i<propList.size(); i++) {
-		            	Property existing = (Property) propList.get(i);
-		            	if (existing.getName().equals(key)) {
-		            		propList.remove(existing);
-		            		break;
-		            	}
-		            }
-		            // Add new property
-		            propList.add(prop);
-		         }
-			} 
-        } finally {
-            if(core != null){
-            	core.saveIfNecessary(null);
-                core.dispose();
-            }
-        }
-	}
-	
-	public void setMetaProperty(String key, String value) {
-        StructureEdit core = null;
-        try {
-            core = StructureEdit.getStructureEditForWrite(getProject());
-            WorkbenchComponent component = core.getComponent();
-            //Remove existing property first
-            List properties = component.getProperties();
-            for (int i=0; i<properties.size(); i++) {
-            	Property existing = (Property) properties.get(i);
-            	if (existing.getName().equals(key)) {
-            		properties.remove(existing);
-            		break;
-            	}
-            }
-        	//Set new property
-            final Property prop = ComponentcoreFactory.eINSTANCE.createProperty();
-			prop.setName(key);
-			prop.setValue(value);
-			component.getProperties().add(prop);
-            
-        } finally {
-            if(core != null){
-            	core.saveIfNecessary(null);
-                core.dispose();
-            }
-        }
-	}
-	
-	public IPath[] getMetaResources() {
-		StructureEdit moduleCore = null;
-		List metaResources = new ArrayList();
-		try {
-			moduleCore = StructureEdit.getStructureEditForRead(getProject());
-			WorkbenchComponent component = moduleCore.getComponent();
-			if (component != null)
-				metaResources.addAll(component.getMetadataResources());
-		} finally {
-			if (moduleCore != null) {
-				moduleCore.dispose();
-			}
-		}
-		return (IPath[]) metaResources.toArray(new IPath[metaResources.size()]);
-	}
-
-	public void setMetaResources(IPath[] theMetaResourcePaths) {
-		StructureEdit moduleCore = null;
-		try {
-			moduleCore = StructureEdit.getStructureEditForWrite(getProject());
-			WorkbenchComponent component = moduleCore.getComponent();
-			if (component != null) {
-				for (int i=0; i<theMetaResourcePaths.length; i++) {
-					if (!component.getMetadataResources().contains(theMetaResourcePaths[i]))
-						component.getMetadataResources().add(theMetaResourcePaths[i]);
-				}
-			}
-		} finally {
-			if (moduleCore != null) {
-				moduleCore.saveIfNecessary(null);
-				moduleCore.dispose();
-			}
-		}
-	}
-	
-	public int getType() {
-		return IVirtualResource.COMPONENT;
-	}
-	
-
-	public boolean isBinary(){
-		boolean ret =  (flag & BINARY) == 1  ? true :false;
-		return ret;		
-	}	
-
-	public void create(int updateFlags, IProgressMonitor aMonitor)
-	throws CoreException {
-
-		StructureEdit moduleCore = null;
-		try {
-			moduleCore = StructureEdit.getStructureEditForWrite(getProject());
-			WorkbenchComponent component = moduleCore
-					.getComponent();
-			if (component == null)
-				component = moduleCore
-						.createWorkbenchModule(getProject().getName());
-				
-		} finally {
-			if (moduleCore != null) {
-				moduleCore.saveIfNecessary(null);
-				moduleCore.dispose();
-			}
-		}
-	}	
-
-	public IVirtualReference[] getReferences() { 
-		StructureEdit core = null;
-		List references = new ArrayList();
-		try {
-			core = StructureEdit.getStructureEditForRead(getProject());
-			if (core!=null && core.getComponent()!=null) {
-				WorkbenchComponent component = core.getComponent();
-				if (component!=null) {
-					List referencedComponents = component.getReferencedComponents();
-					for (Iterator iter = referencedComponents.iterator(); iter.hasNext();) {
-						ReferencedComponent referencedComponent = (ReferencedComponent) iter.next();
-						if (referencedComponent==null) 
-							continue;
-						IVirtualReference vReference = StructureEdit.createVirtualReference(this, referencedComponent);
-						if (vReference != null)
-							references.add(vReference); 
-					}
-				}
-			}
-			return (IVirtualReference[]) references.toArray(new IVirtualReference[references.size()]);
-		} finally {
-			if(core != null)
-				core.dispose();
-		}		
-	}
-
-	public void addReferences(IVirtualReference[] references) {
-		if (references==null || references.length==0)
-			return;
-		StructureEdit core = null;
-		try {
-			core = StructureEdit.getStructureEditForWrite(getProject());
-			if (core == null)
-				return;
-			WorkbenchComponent component = core.getComponent();
-			ReferencedComponent referencedComponent = null;
-			ComponentcoreFactory factory = ComponentcorePackage.eINSTANCE.getComponentcoreFactory();
-			for (int i=0; i<references.length; i++) {
-				if (references[i] == null)
-					continue;
-				referencedComponent = factory.createReferencedComponent();				
-				referencedComponent.setDependencyType(DependencyType.get(references[i].getDependencyType()));
-				referencedComponent.setRuntimePath(references[i].getRuntimePath());
-
-				IVirtualComponent comp = references[i].getReferencedComponent();
-				if(comp!=null && !comp.isBinary())
-					referencedComponent.setHandle(ModuleURIUtil.fullyQualifyURI(comp.getProject()));
-				else if (comp!=null)
-					referencedComponent.setHandle(ModuleURIUtil.archiveComponentfullyQualifyURI(comp.getName()));
-				if (component != null)
-					component.getReferencedComponents().add(referencedComponent);
-			}
-		} finally {
-			if(core != null) {
-				core.saveIfNecessary(null);
-				core.dispose();
-			}
-		}	
-	}
-	
-	public void setReferences(IVirtualReference[] references) { 
-		StructureEdit core = null;
-		try {
-			core = StructureEdit.getStructureEditForWrite(getProject());
-			WorkbenchComponent component = core.getComponent();
-			ReferencedComponent referencedComponent = null;
-			  
-			component.getReferencedComponents().clear();
-			ComponentcoreFactory factory = ComponentcorePackage.eINSTANCE.getComponentcoreFactory();
-			for (int i=0; i<references.length; i++) {
-				referencedComponent = factory.createReferencedComponent();				
-				referencedComponent.setDependencyType(DependencyType.get(references[i].getDependencyType()));
-				referencedComponent.setRuntimePath(references[i].getRuntimePath());
-
-				IVirtualComponent comp = references[i].getReferencedComponent();
-				if( !comp.isBinary())
-					referencedComponent.setHandle(ModuleURIUtil.fullyQualifyURI(references[i].getReferencedComponent().getProject()));
-				else
-					referencedComponent.setHandle(ModuleURIUtil.archiveComponentfullyQualifyURI(references[i].getReferencedComponent().getName()));
-				
-				component.getReferencedComponents().add(referencedComponent);
-			}
-			 
-		} finally {
-			if(core != null) {
-				core.saveIfNecessary(null);
-				core.dispose();
-			}
-		}	
-	}
-
-	
-	public boolean equals(Object anOther) { 
-		if(anOther instanceof IVirtualComponent) {
-			IVirtualComponent otherComponent = (IVirtualComponent) anOther;
-			return getProject()!=null && getProject().equals(otherComponent.getProject()) && getName().equals(otherComponent.getName());
-		}
-		return false;
-	}
-
-	public IVirtualReference getReference(String aComponentName) {
-		IVirtualReference[] refs = getReferences();
-		for (int i = 0; i < refs.length; i++) {
-			IVirtualReference reference = refs[i];
-			if (reference.getReferencedComponent().getName().equals(aComponentName))
-				return reference;
-		}
-		return null;
-	}
-	
-	public Object getAdapter(Class adapterType) {
-		return Platform.getAdapterManager().getAdapter(this, adapterType);
-	}
-
-	public IVirtualFolder getRootFolder() {
-		return rootFolder;
-	}
-
-	public IProject getProject() {
-		return componentProject;
-	}
-	
-	/**
-	 * Return all components which have a reference to the passed in target component.
-	 * 
-	 * @param target
-	 * @return array of components
-	 */
-	public IVirtualComponent[] getReferencingComponents() {
-		IProject[] handles =  DependencyGraphManager.getInstance().getDependencyGraph().getReferencingComponents(getProject());
-		IVirtualComponent[] result = new IVirtualComponent[handles.length];
-		for (int i=0; i<handles.length; i++)
-			result[i] = ComponentCore.createComponent(handles[i]);
-		return result;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualContainer.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualContainer.java
deleted file mode 100644
index f07ab73..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualContainer.java
+++ /dev/null
@@ -1,351 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.resources;
-
-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.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.ResourcesPlugin;
-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.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.internal.ComponentResource;
-import org.eclipse.wst.common.componentcore.internal.StructureEdit;
-import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-import org.eclipse.wst.common.componentcore.internal.impl.ResourceTreeNode;
-import org.eclipse.wst.common.componentcore.internal.impl.ResourceTreeRoot;
-import org.eclipse.wst.common.componentcore.resources.IVirtualContainer;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
-import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
-
-public abstract class VirtualContainer extends VirtualResource implements IVirtualContainer {
-
-
-	public VirtualContainer(IProject aComponentProject, IPath aRuntimePath) {
-		super(aComponentProject, aRuntimePath);
-	}
-
-	// TODO WTP:Implement this method
-	public boolean exists(IPath path) {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-
-	}
-
-	/**
-	 * @see IContainer#findMember(java.lang.String)
-	 */
-	public IVirtualResource findMember(String aChildName) {
-		return findMember(new Path(aChildName), 0);
-	}
-
-	/**
-	 * @see IContainer#findMember(java.lang.String, boolean)
-	 */
-	public IVirtualResource findMember(String aChildName, int searchFlags) {
-		return findMember(new Path(aChildName), searchFlags);
-	}
-
-	/**
-	 * @see IContainer#findMember(org.eclipse.core.runtime.IPath)
-	 */
-	public IVirtualResource findMember(IPath aChildPath) {
-		return findMember(aChildPath, 0);
-	}
-
-	public IVirtualResource findMember(IPath aPath, int theSearchFlags) {
-
-		StructureEdit structureEdit = null;
-		try {
-
-			structureEdit = StructureEdit.getStructureEditForRead(getProject());
-			WorkbenchComponent component = structureEdit.getComponent();
-			ResourceTreeRoot root = ResourceTreeRoot.getDeployResourceTreeRoot(component);
-			ComponentResource[] resources = root.findModuleResources(getRuntimePath().append(aPath), ResourceTreeNode.CREATE_NONE);
-
-			for (int i=0; i<resources.length; i++) {
-				// return the resources corresponding to the root, not any of the children if its a folder
-				if (resources[i].getRuntimePath().equals(getRuntimePath().append(aPath))) {
-					IResource platformResource = getProject().findMember(resources[i].getSourcePath()); 
-					if(platformResource == null)
-						platformResource = ResourcesPlugin.getWorkspace().getRoot().findMember(resources[i].getSourcePath()); 
-					if (platformResource != null) {
-						switch (platformResource.getType()) {
-						case IResource.FOLDER:
-						case IResource.PROJECT:
-							return new VirtualFolder(getProject(), getRuntimePath().append(aPath));
-						case IResource.FILE:
-							return new VirtualFile(getProject(), getRuntimePath().append(aPath));
-						}
-					}
-				}
-			}
-		} finally {
-			if (structureEdit != null)
-				structureEdit.dispose();
-		}
-		return null;
-	}
-
-	/**
-	 * @see IContainer#getFile(org.eclipse.core.runtime.IPath)
-	 */
-	public IVirtualFile getFile(IPath aPath) {
-		return new VirtualFile(getProject(), getRuntimePath().append(aPath));
-	}
-
-	/**
-	 * @see IContainer#getFolder(org.eclipse.core.runtime.IPath)
-	 */
-	public IVirtualFolder getFolder(IPath aPath) {
-		return new VirtualFolder(getProject(), getRuntimePath().append(aPath));
-	}
-
-	/**
-	 * @see IFolder#getFile(java.lang.String)
-	 */
-	public IVirtualFile getFile(String name) {
-		return new VirtualFile(getProject(), getRuntimePath().append(name));
-	}
-
-	/**
-	 * @see IFolder#getFolder(java.lang.String)
-	 */
-	public IVirtualFolder getFolder(String name) {
-		return new VirtualFolder(getProject(), getRuntimePath().append(name));
-	}
-
-	/**
-	 * @see IContainer#members()
-	 */
-	public IVirtualResource[] members() throws CoreException {
-		return members(IResource.NONE);
-	}
-
-	/**
-	 * @see IContainer#members(boolean)
-	 */
-	public IVirtualResource[] members(boolean includePhantoms) throws CoreException {
-		return members(includePhantoms ? IGNORE_EXCLUSIONS : IResource.NONE);
-	}
-
-	/**
-	 * @see IContainer#members(int)
-	 */
-	public IVirtualResource[] members(int memberFlags) throws CoreException {
-		List virtualResources = new ArrayList(); // result
-		Set allNames = new HashSet();
-		// Ignore all meta data paths in the virtual container resource set
-		IPath[] metaPaths = getComponent().getMetaResources();
-		for (int i=0; i<metaPaths.length; i++) {
-			String localName = getLocalName(metaPaths[i]);
-			if (localName != null)
-				allNames.add(localName);
-		}
-		StructureEdit moduleCore = null;
-		try {
-			moduleCore = StructureEdit.getStructureEditForRead(getProject());
-			WorkbenchComponent wbComponent = moduleCore.getComponent();
-			if (wbComponent != null) {
-				ResourceTreeRoot root = ResourceTreeRoot.getDeployResourceTreeRoot(wbComponent);
-				ComponentResource[] componentResources = root.findModuleResources(getRuntimePath(), ResourceTreeNode.CREATE_NONE);
-				//componentResources = orderResourcesByFolder(componentResources);
-
-				for (int componentResourceIndex = 0; componentResourceIndex < componentResources.length; componentResourceIndex++) {
-					IPath fullRuntimePath = componentResources[componentResourceIndex].getRuntimePath();
-					// exact match
-					if (fullRuntimePath.equals(getRuntimePath())) {
-						
-						IResource realResource = getProject().findMember(componentResources[componentResourceIndex].getSourcePath());
-						if ((realResource != null) && (realResource.getType() == IResource.FOLDER || realResource.getType() == IResource.PROJECT)) {
-							IContainer realContainer = (IContainer) realResource;
-							IResource[] realChildResources = realContainer.members(memberFlags);
-							for (int realResourceIndex = 0; realResourceIndex < realChildResources.length; realResourceIndex++) {
-								IResource child = realChildResources[realResourceIndex];
-								String localName = child.getName();
-								if (allNames.add(localName)) {
-									IPath newRuntimePath = getRuntimePath().append(localName);
-									if (child instanceof IFile) {
-										virtualResources.add(new VirtualFile(getProject(), newRuntimePath, (IFile) child));
-									} else {
-										virtualResources.add(new VirtualFolder(getProject(), newRuntimePath));
-									}
-								}
-							}
-						}
-						// An IResource.FILE would be an error condition (as this is a container)
-
-					} else { // fuzzy match
-						String localName = getLocalName(fullRuntimePath);
-						if (localName != null && allNames.add(localName)) {
-							IResource realResource = StructureEdit.getEclipseResource(componentResources[componentResourceIndex]);
-							if (realResource != null) {
-								IPath newRuntimePath = getRuntimePath().append(localName);
-								if (fullRuntimePath.segmentCount() > getRuntimePath().segmentCount() + 1) {	// not a direct child
-									virtualResources.add(new VirtualFolder(getProject(), newRuntimePath));
-								} else {
-									if (realResource instanceof IFile) {
-										virtualResources.add(new VirtualFile(getProject(), newRuntimePath, (IFile) realResource));
-									} else {
-										virtualResources.add(new VirtualFolder(getProject(), newRuntimePath));
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-		} catch (Exception e) {
-			if (virtualResources == null)
-				return new IVirtualResource[0];
-		} finally {
-			if (moduleCore != null)
-				moduleCore.dispose();
-		}
-		return (IVirtualResource[]) virtualResources.toArray(new IVirtualResource[virtualResources.size()]);
-	}
-
-	/**
-	 * Local name within context of this virtual container. 
-	 */
-	private String getLocalName(IPath path) {
-		if (!getRuntimePath().isPrefixOf(path)) return null;
-		return path.segment(getRuntimePath().segmentCount());
-	}
-
-	public IVirtualFile[] findDeletedMembersWithHistory(int depth, IProgressMonitor monitor) throws CoreException {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-		// return null;
-	}
-
-	/**
-	 * @see IFolder#createLink(org.eclipse.core.runtime.IPath, int,
-	 *      org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void createLink(IPath aProjectRelativeLocation, int updateFlags, IProgressMonitor monitor) throws CoreException {
-
-		StructureEdit moduleCore = null;
-		try {
-			IContainer resource = null;
-			if (aProjectRelativeLocation.isRoot()) {
-				resource = getProject();
-			} else {
-				resource = getProject().getFolder(aProjectRelativeLocation);
-			}
-
-			moduleCore = StructureEdit.getStructureEditForWrite(getProject());
-			WorkbenchComponent component = moduleCore.getComponent();
-
-			ResourceTreeRoot root = ResourceTreeRoot.getDeployResourceTreeRoot(component);
-			ComponentResource[] resources = root.findModuleResources(getRuntimePath(), ResourceTreeNode.CREATE_NONE);
-
-			if (resources.length == 0) {
-				ComponentResource componentResource = moduleCore.createWorkbenchModuleResource(resource);
-				componentResource.setRuntimePath(getRuntimePath());
-				component.getResources().add(componentResource);
-			} else {
-				boolean foundMapping = false;
-				for (int resourceIndx = 0; resourceIndx < resources.length && !foundMapping; resourceIndx++) {
-					if (aProjectRelativeLocation.makeAbsolute().equals(resources[resourceIndx].getSourcePath()))
-						foundMapping = true;
-				}
-				if (!foundMapping) {
-					ComponentResource componentResource = moduleCore.createWorkbenchModuleResource(resource);
-					componentResource.setRuntimePath(getRuntimePath());
-					component.getResources().add(componentResource);
-				}
-			}
-			createResource(resource, updateFlags, monitor);
-
-		} finally {
-			if (moduleCore != null) {
-				moduleCore.saveIfNecessary(monitor);
-				moduleCore.dispose();
-			}
-		}
-	}
-
-	public int getType() {
-		return IVirtualResource.COMPONENT;
-	}
-
-	public IResource getUnderlyingResource() {
-		return null;
-	}
-
-	public IResource[] getUnderlyingResources() {
-		return NO_RESOURCES;
-	}
-
-	protected void doDeleteMetaModel(int updateFlags, IProgressMonitor monitor) {
-		StructureEdit moduleCore = null;
-		try {
-			moduleCore = StructureEdit.getStructureEditForWrite(getProject());
-			WorkbenchComponent component = moduleCore.getComponent();
-			moduleCore.getComponentModelRoot().getComponents().remove(component);
-		} finally {
-			if (moduleCore != null) {
-				moduleCore.saveIfNecessary(monitor);
-				moduleCore.dispose();
-			}
-		}
-	}
-
-	protected void doDeleteRealResources(int updateFlags, IProgressMonitor monitor) throws CoreException {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-	}
-
-	public IVirtualResource[] getResources(String aResourceType) {
-		StructureEdit core = null;
-		try {
-			core = StructureEdit.getStructureEditForRead(getProject());
-			WorkbenchComponent component = core.getComponent();
-			List currentResources = component.getResources();
-			List foundResources = new ArrayList();
-
-			if (aResourceType != null) {
-				for (Iterator iter = currentResources.iterator(); iter.hasNext();) {
-					ComponentResource resource = (ComponentResource) iter.next();
-					if (aResourceType.equals(resource.getResourceType())) {
-						IVirtualResource vres = createVirtualResource(resource);
-						if (vres != null)
-							foundResources.add(vres);
-					}
-				}
-			}
-			return (IVirtualResource[]) foundResources.toArray(new IVirtualResource[foundResources.size()]);
-		} finally {
-			if (core != null)
-				core.dispose();
-		}
-	}
-
-	private IVirtualResource createVirtualResource(ComponentResource aComponentResource) {
-		IResource resource = StructureEdit.getEclipseResource(aComponentResource);
-		switch (resource.getType()) {
-			case IResource.FILE :
-				return ComponentCore.createFile(getProject(), aComponentResource.getRuntimePath());
-			case IResource.FOLDER :
-				return ComponentCore.createFolder(getProject(), aComponentResource.getRuntimePath());
-		}
-		return null;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualFile.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualFile.java
deleted file mode 100644
index 57480a2..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualFile.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.resources;
-
-import java.util.ArrayList;
-import java.util.List;
-
-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.IProgressMonitor;
-import org.eclipse.wst.common.componentcore.internal.ComponentResource;
-import org.eclipse.wst.common.componentcore.internal.StructureEdit;
-import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-import org.eclipse.wst.common.componentcore.internal.impl.ResourceTreeNode;
-import org.eclipse.wst.common.componentcore.internal.impl.ResourceTreeRoot;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
-import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
-
-public class VirtualFile extends VirtualResource implements IVirtualFile {
-
-	private IFile underlyingFile;
-
-	public VirtualFile(IProject aComponentProject, IPath aRuntimePath) {
-		super(aComponentProject, aRuntimePath); 
-	}
-
-	public VirtualFile(IProject aComponentProject, IPath aRuntimePath, IFile underlyingFile) {
-		super(aComponentProject, aRuntimePath);
-		this.underlyingFile = underlyingFile; 
-	}
-
-	/**
-	 * @see IFolder#createLink(org.eclipse.core.runtime.IPath, int,
-	 *      org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void createLink(IPath aProjectRelativeLocation, int updateFlags, IProgressMonitor monitor) throws CoreException {
-
-		StructureEdit moduleCore = null;
-		try {
-			IFile resource = getProject().getFile(aProjectRelativeLocation);
-
-			moduleCore = StructureEdit.getStructureEditForWrite(getProject());
-			WorkbenchComponent component = moduleCore.getComponent();
-			
-			ResourceTreeRoot root = ResourceTreeRoot.getDeployResourceTreeRoot(component);
-			ComponentResource[] resources = root.findModuleResources(getRuntimePath(), ResourceTreeNode.CREATE_NONE);
-
-			if(resources.length == 0) {
-				ComponentResource componentResource = moduleCore.createWorkbenchModuleResource(resource);
-				componentResource.setRuntimePath(getRuntimePath());
-				component.getResources().add(componentResource);
-			} else { 
-				boolean foundMapping = false;
-				for (int resourceIndx = 0; resourceIndx < resources.length && !foundMapping; resourceIndx++) {
-					if(aProjectRelativeLocation.equals(resources[resourceIndx].getSourcePath()))
-						foundMapping = true;
-				}
-				if(!foundMapping) {
-					ComponentResource componentResource = moduleCore.createWorkbenchModuleResource(resource);
-					componentResource.setRuntimePath(getRuntimePath());
-					component.getResources().add(componentResource);					
-				}
-			} 
-
-		} finally {
-			if (moduleCore != null) {
-				moduleCore.saveIfNecessary(monitor);
-				moduleCore.dispose();
-			}
-		}
-	} 
- 
-	public int getType() {
-		return IVirtualResource.FILE;
-	}
-	
-	public IResource getUnderlyingResource() {
-		return getUnderlyingFile();
-	}
-	
-	public IResource[] getUnderlyingResources() {
-		return getUnderlyingFiles();
-	}
-	
-	public IFile getUnderlyingFile() {
-		if (underlyingFile == null) {
-			underlyingFile = getProject().getFile(getProjectRelativePath());
-		}
-		return underlyingFile;
-	}
-
-	public IFile[] getUnderlyingFiles() {
-		IPath[] paths = getProjectRelativePaths();
-		List result = new ArrayList();
-		for (int i=0; i<paths.length; i++) {
-			IFile file = getProject().getFile(paths[i]);
-			if (file!=null && file.exists() && !result.contains(file))
-				result.add(file);
-		}
-		return (IFile[]) result.toArray(new IFile[result.size()]);
-	}
-
-	protected void doDeleteMetaModel(int updateFlags,IProgressMonitor monitor) {
-		//Default
-	}	
-	
-	protected void doDeleteRealResources(int updateFlags, IProgressMonitor monitor) throws CoreException {
-		//Default
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualFolder.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualFolder.java
deleted file mode 100644
index b3fa912..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualFolder.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.resources;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.internal.ComponentResource;
-import org.eclipse.wst.common.componentcore.internal.StructureEdit;
-import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
-import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
-
-public class VirtualFolder extends VirtualContainer implements IVirtualFolder { 
-
-
-	/**
-	 * p> Creates an unassigned mapping contained by the component identified by aComponentHandle
-	 * with a runtime path of aRuntimePath.
-	 * </p>
-	 * 
-	 * @param aComponentHandle
-	 * @param aRuntimePath
-	 */
-	public VirtualFolder(IProject aComponentProject, IPath aRuntimePath) {
-		super(aComponentProject, aRuntimePath);
-	}
- 
-	// TODO WTP:Implement this method
-	public void create(int updateFlags, IProgressMonitor monitor) throws CoreException {
-
-		IVirtualComponent container = ComponentCore.createComponent(getProject()); 
-		if( !container.getRootFolder().getProjectRelativePath().isRoot()){
-			IFolder realFolder = getProject().getFolder(container.getRootFolder().getProjectRelativePath()); 
-			IFolder newFolder = realFolder.getFolder(getRuntimePath()); 
-			createResource(newFolder, updateFlags, monitor);  
-		}
-		else {
-			IFolder newFolder = getProject().getFolder(getRuntimePath()); 
-			createResource(newFolder, updateFlags, monitor); 
-		}
-	} 
-
-	// TODO WTP:Implement this method
-	public boolean exists(IPath path) {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-		// return false;
-	}
-
- 
-	public int getType() {
-		return IVirtualResource.FOLDER;
-	} 
-	
-	public IResource getUnderlyingResource() {
-		return getUnderlyingFolder();
-	}
-	
-	public IResource[] getUnderlyingResources() {
-		return getUnderlyingFolders();
-	}
-
-	public IContainer getUnderlyingFolder() { 
-		IPath path = getProjectRelativePath();
-		if( !path.isRoot() )
-			return getProject().getFolder(getProjectRelativePath());
-		return getProject();
-	}
-	
-	public IContainer[] getUnderlyingFolders() {
-		IPath[] paths = getProjectRelativePaths();
-		List result = new ArrayList();
-		for (int i=0; i<paths.length; i++) {
-			if( !paths[i].isRoot() ){
-				IContainer folder = getProject().getFolder(paths[i]);
-				if (folder!=null && folder.exists() && !result.contains(folder))
-					result.add(folder);
-			} else 
-				result.add(getProject());
-		}
-		return (IContainer[]) result.toArray(new IContainer[result.size()]);
-	}
-
-	protected void doDeleteMetaModel(int updateFlags, IProgressMonitor monitor) {
-
-		// only handles explicit mappings
-		StructureEdit moduleCore = null;
-		try { 
-			IPath runtimePath = getRuntimePath();
-			moduleCore = StructureEdit.getStructureEditForWrite(getProject());
-			WorkbenchComponent component = moduleCore.getComponent();
-			ComponentResource[] resources = component.findResourcesByRuntimePath(runtimePath);
-			for (int i = 0; i < resources.length; i++) {
-				if(runtimePath.equals(resources[i].getRuntimePath())) 
-					component.getResources().remove(resources[i]);								
-			}
-			
-		} finally {
-			if (moduleCore != null) {
-				moduleCore.saveIfNecessary(null);
-				moduleCore.dispose();
-			}
-		}
-	}	
-	
-	protected void doDeleteRealResources(int updateFlags, IProgressMonitor monitor) throws CoreException {
-
-		// only handles explicit mappings
-		StructureEdit moduleCore = null;
-		try {
-			IPath runtimePath = getRuntimePath();
-			moduleCore = StructureEdit.getStructureEditForWrite(getProject());
-			WorkbenchComponent component = moduleCore.getComponent();
-			ComponentResource[] resources = component.findResourcesByRuntimePath(runtimePath);
-			IResource realResource;
-			for (int i = 0; i < resources.length; i++) {
-				if(runtimePath.equals(resources[i].getRuntimePath())) {
-					realResource = StructureEdit.getEclipseResource(resources[i]);
-					if(realResource != null && realResource.getType() == getType())
-						realResource.delete(updateFlags, monitor);
-				}
-					
-			}
-			
-		} finally {
-			if (moduleCore != null) {
-				moduleCore.saveIfNecessary(null);
-				moduleCore.dispose();
-			}
-		}
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualReference.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualReference.java
deleted file mode 100644
index 9b49be6..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualReference.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.resources;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.wst.common.componentcore.internal.ComponentcorePackage;
-import org.eclipse.wst.common.componentcore.internal.DependencyType;
-import org.eclipse.wst.common.componentcore.internal.ReferencedComponent;
-import org.eclipse.wst.common.componentcore.internal.StructureEdit;
-import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-import org.eclipse.wst.common.componentcore.internal.impl.ModuleURIUtil;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
-
-public class VirtualReference implements IVirtualReference {
-	
-	private IVirtualComponent referencedComponent;
-	private IVirtualComponent enclosingComponent;
-	private IPath runtimePath;
-	private int dependencyType;
-
-	public VirtualReference() {
-		
-	} 
-	
-	public VirtualReference(IVirtualComponent anEnclosingComponent, IVirtualComponent aReferencedComponent) {
-		this(anEnclosingComponent, aReferencedComponent, new Path(String.valueOf(IPath.SEPARATOR)), DEPENDENCY_TYPE_USES); 
-	}
-	
-	public VirtualReference(IVirtualComponent anEnclosingComponent, IVirtualComponent aReferencedComponent, IPath aRuntimePath) {
-		this(anEnclosingComponent, aReferencedComponent, aRuntimePath, DEPENDENCY_TYPE_USES);
-	}
-
-	public VirtualReference(IVirtualComponent anEnclosingComponent, IVirtualComponent aReferencedComponent, IPath aRuntimePath, int aDependencyType) {
-		enclosingComponent = anEnclosingComponent;
-		referencedComponent = aReferencedComponent;
-		runtimePath = aRuntimePath;
-		dependencyType = aDependencyType;
-	}
-
-	public void create(int updateFlags, IProgressMonitor aMonitor) { 
-		StructureEdit core = null;
-		try {
-			core = StructureEdit.getStructureEditForWrite(enclosingComponent.getProject());
-			WorkbenchComponent component = core.getComponent();
-			List referencedComponents = component.getReferencedComponents();
-			ReferencedComponent refComp = ComponentcorePackage.eINSTANCE.getComponentcoreFactory().createReferencedComponent();
-			if( !referencedComponent.isBinary())
-				refComp.setHandle(ModuleURIUtil.fullyQualifyURI(referencedComponent.getProject()));
-			else
-				refComp.setHandle(ModuleURIUtil.archiveComponentfullyQualifyURI(referencedComponent.getName())); 
-			refComp.setRuntimePath(runtimePath);
-			refComp.setDependencyType(DependencyType.get(dependencyType));
-			if(!referencedComponents.contains(refComp)){
-				referencedComponents.add(refComp);
-			}
-		}
-		finally{
-			if(null != core){
-				core.saveIfNecessary(aMonitor);
-				core.dispose();
-			}
-		}
-	}
-
-	public void setRuntimePath(IPath aRuntimePath) { 
-		runtimePath = aRuntimePath;
-	}
-
-	public IPath getRuntimePath() { 
-		return runtimePath;
-	}
-
-	public void setDependencyType(int aDependencyType) {
-		dependencyType = aDependencyType;
-	}
-
-	public int getDependencyType() { 
-		return dependencyType;
-	}
-
-	public boolean exists() { 
-		return false;
-	}
-
-	public IVirtualComponent getEnclosingComponent() { 
-		return enclosingComponent;
-	}
-
-	public IVirtualComponent getReferencedComponent() { 
-		return referencedComponent;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualResource.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualResource.java
deleted file mode 100644
index b5bbbfe..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualResource.java
+++ /dev/null
@@ -1,338 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.resources;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.internal.ComponentResource;
-import org.eclipse.wst.common.componentcore.internal.StructureEdit;
-import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-import org.eclipse.wst.common.componentcore.internal.impl.ModuleURIUtil;
-import org.eclipse.wst.common.componentcore.internal.impl.ResourceTreeNode;
-import org.eclipse.wst.common.componentcore.internal.impl.ResourceTreeRoot;
-import org.eclipse.wst.common.componentcore.internal.impl.WorkbenchComponentImpl;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualContainer;
-import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
-
-public abstract class VirtualResource implements IVirtualResource {
-
-	protected static final IResource[] NO_RESOURCES = null;
-	private final IProject componentProject;
-	private final IPath runtimePath;
-	private int hashCode;
-	private String toString;
-	private static final String EMPTY_STRING = ""; //$NON-NLS-1$
-	private IVirtualComponent component;
-	private String resourceType;
-
-
-	protected VirtualResource(IProject aComponentProject, IPath aRuntimePath) {
-		componentProject = aComponentProject;
-		runtimePath = aRuntimePath;
-	}
-
-	public void delete(int updateFlags, IProgressMonitor monitor) throws CoreException {
-
-		if ((updateFlags & IVirtualResource.IGNORE_UNDERLYING_RESOURCE) == 0) {
-			doDeleteRealResources(updateFlags, monitor);
-		}
-
-		doDeleteMetaModel(updateFlags, monitor);
-	}
-
-	protected void doDeleteMetaModel(int updateFlags, IProgressMonitor monitor) {
-		StructureEdit moduleCore = null;
-		try {
-			moduleCore = StructureEdit.getStructureEditForWrite(getProject());
-			WorkbenchComponent aComponent = moduleCore.getComponent();
-			ComponentResource[] resources = aComponent.findResourcesByRuntimePath(getRuntimePath());
-			aComponent.getResources().removeAll(Arrays.asList(resources));
-		} finally {
-			if (moduleCore != null) {
-				moduleCore.saveIfNecessary(monitor);
-				moduleCore.dispose();
-			}
-		}
-	}
-
-
-	protected abstract void doDeleteRealResources(int updateFlags, IProgressMonitor monitor) throws CoreException;
-
-	public boolean exists() {
-		// verify all underlying resources exist for the virtual resource to exist
-		IResource[] resources = getUnderlyingResources();
-		if (resources==null || resources.length==0)
-			return false;
-		for (int i=0; i<resources.length; i++) {
-			if (resources[i]==null || !resources[i].exists())
-				return false;
-		}
-		return true;
-	}
-
-	public String getFileExtension() {
-		String name = getName();
-		int dot = name.lastIndexOf('.');
-		if (dot == -1)
-			return null;
-		if (dot == name.length() - 1)
-			return EMPTY_STRING;
-		return name.substring(dot + 1);
-	}
-
-	public IPath getWorkspaceRelativePath() {
-		return getProject().getFullPath().append(getProjectRelativePath());
-	}
-
-	public IPath getRuntimePath() {
-		return runtimePath;
-	}
-
-	public IPath[] getProjectRelativePaths() {
-		StructureEdit moduleCore = null;
-		try {
-			moduleCore = StructureEdit.getStructureEditForRead(getProject());
-			if (moduleCore !=null) {
-				WorkbenchComponent aComponent = moduleCore.getComponent();
-				if (aComponent != null) {
-					ResourceTreeRoot root = ResourceTreeRoot.getDeployResourceTreeRoot(aComponent);
-					// still need some sort of loop here to search subpieces of the runtime path.
-					ComponentResource[] componentResources = null;
-	
-					if (root != null) {
-						IPath[] estimatedPaths = null;
-						IPath searchPath = null;
-						do {
-							searchPath = (searchPath == null) ? getRuntimePath() : searchPath.removeLastSegments(1);
-							componentResources = root.findModuleResources(searchPath, ResourceTreeNode.CREATE_NONE);
-							estimatedPaths = findBestMatches(componentResources);
-						} while (estimatedPaths.length==0 && canSearchContinue(componentResources, searchPath));
-						if (estimatedPaths==null || estimatedPaths.length==0)
-							return new IPath[] {getRuntimePath()};
-						return estimatedPaths;
-					}
-				}
-			}
-		} finally {
-			if (moduleCore != null) {
-				moduleCore.dispose();
-			}
-		}
-		return new IPath[] {getRuntimePath()};
-	}
-
-	public IPath getProjectRelativePath() {
-		StructureEdit moduleCore = null;
-		if (getRuntimePath().equals(new Path("/"))) {
-			try {
-				moduleCore = StructureEdit.getStructureEditForRead(getProject());
-				if (moduleCore != null) {
-					WorkbenchComponent aComponent = moduleCore.getComponent();
-					if (aComponent != null) {
-						if (((WorkbenchComponentImpl) aComponent).getDefaultSourceRoot() != null)
-							return ((WorkbenchComponentImpl) aComponent).getDefaultSourceRoot();
-					}
-				}
-			} finally {
-				if (moduleCore != null) {
-					moduleCore.dispose();
-				}
-			}
-		}
-		return getProjectRelativePaths()[0];
-	}
-	
-	private boolean canSearchContinue(ComponentResource[] componentResources, IPath searchPath) {
-		return (searchPath.segmentCount() > 0);
-	}
-
-	private IPath[] findBestMatches(ComponentResource[] theComponentResources) {
-		List result = new ArrayList();
-		int currentMatchLength = 0;
-		int bestMatchLength = -1;
-		IPath estimatedPath = null;
-		IPath currentPath = null;
-		final IPath aRuntimePath = getRuntimePath();
-		for (int i = 0; i < theComponentResources.length; i++) {
-			currentPath = theComponentResources[i].getRuntimePath();
-			if (currentPath.isPrefixOf(aRuntimePath)) {
-				if (currentPath.segmentCount() == aRuntimePath.segmentCount()) {
-					result.add(theComponentResources[i].getSourcePath());
-					continue;
-				}	
-				currentMatchLength = currentPath.matchingFirstSegments(aRuntimePath);
-				if (currentMatchLength == currentPath.segmentCount() && currentMatchLength > bestMatchLength) {
-					bestMatchLength = currentMatchLength;
-					IPath sourcePath = theComponentResources[i].getSourcePath();
-					IPath subpath = aRuntimePath.removeFirstSegments(currentMatchLength);
-					estimatedPath = sourcePath.append(subpath);
-				}
-			}
-		}
-		if (result.size()>0)
-			return (IPath[]) result.toArray(new IPath[result.size()]);
-		if (estimatedPath == null)
-			return new IPath[] {};
-		return new IPath[] {estimatedPath};
-	}
-
-	public String getName() {
-		if (getRuntimePath().segmentCount()>0)
-			return getRuntimePath().lastSegment();
-		return getRuntimePath().toString();
-	}
-
-	public IVirtualComponent getComponent() {
-		if (component == null)
-			component = ComponentCore.createComponent(getProject());
-		return component;
-	}
-    
-	//returns null if the folder is already the root folder
-	public IVirtualContainer getParent() {
-		if (getRuntimePath().segmentCount() >= 1)
-			return new VirtualFolder(getProject(), getRuntimePath().removeLastSegments(1));
-		return null;
-	}
-
-	public IProject getProject() {
-		return componentProject;
-	}
-
-	public boolean isAccessible() {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-		// return false;
-	}
-
-	public Object getAdapter(Class adapter) {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-		// return null;
-	}
-
-	public boolean contains(ISchedulingRule rule) {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-		// return false;
-	}
-
-	public boolean isConflicting(ISchedulingRule rule) {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-		// return false;
-	}
-
-	public String toString() {
-		if (toString == null)
-			toString = "[" + ModuleURIUtil.getHandleString(getComponent()) + ":" + getRuntimePath() + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		return toString;
-	}
-
-	public int hashCode() {
-		if (hashCode == 0)
-			hashCode = toString().hashCode();
-		return hashCode;
-	}
-
-	public boolean equals(Object anOther) {
-		return hashCode() == ((anOther != null && anOther instanceof VirtualResource) ? anOther.hashCode() : 0);
-	}
-
-	public void setResourceType(String aResourceType) {
-		resourceType = aResourceType;
-		StructureEdit moduleCore = null;
-		try {
-			moduleCore = StructureEdit.getStructureEditForRead(getProject());
-			WorkbenchComponent aComponent = moduleCore.getComponent();
-			ComponentResource[] resources = aComponent.findResourcesByRuntimePath(getRuntimePath());
-			for (int i = 0; i < resources.length; i++) {
-				resources[i].setResourceType(aResourceType);
-			}
-		} finally {
-			if (moduleCore != null) {
-				moduleCore.dispose();
-			}
-		}
-	}
-
-	// TODO Fetch the resource type from the model.
-	public String getResourceType() {
-		if (null == resourceType) {
-			StructureEdit moduleCore = null;
-			try {
-				moduleCore = StructureEdit.getStructureEditForRead(getProject());
-				WorkbenchComponent aComponent = moduleCore.getComponent();
-				ComponentResource[] resources = aComponent.findResourcesByRuntimePath(getRuntimePath());
-				for (int i = 0; i < resources.length; i++) {
-					resourceType = resources[i].getResourceType();
-					return resourceType;
-				}
-			} finally {
-				if (moduleCore != null) {
-					moduleCore.dispose();
-				}
-			}
-		}
-		resourceType = ""; //$NON-NLS-1$
-		return resourceType;
-	}
-
-
-	protected void createResource(IContainer resource, int updateFlags, IProgressMonitor monitor) throws CoreException {
-
-		if (resource.exists())
-			return;
-		if (!resource.getParent().exists())
-			createResource(resource.getParent(), updateFlags, monitor);
-		if (!resource.exists() && resource.getType() == IResource.FOLDER) {
-			((IFolder) resource).create(updateFlags, true, monitor);
-		}
-	}
-
-	protected boolean isPotentalMatch(IPath aRuntimePath) {
-		return aRuntimePath.isPrefixOf(getRuntimePath());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.componentcore.resources.IVirtualResource#removeLink(org.eclipse.core.runtime.IPath, int, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void removeLink(IPath aProjectRelativeLocation, int updateFlags, IProgressMonitor monitor) throws CoreException {
-		StructureEdit moduleCore = null;
-		try {
-			moduleCore = StructureEdit.getStructureEditForWrite(getProject());
-			WorkbenchComponent component = moduleCore.getComponent();
-			ResourceTreeRoot root = ResourceTreeRoot.getDeployResourceTreeRoot(component);
-			ComponentResource[] resources = root.findModuleResources(getRuntimePath(), ResourceTreeNode.CREATE_NONE);
-			if (resources.length > 0) {
-				for (int resourceIndx = 0; resourceIndx < resources.length; resourceIndx++) {
-					if (aProjectRelativeLocation.makeAbsolute().equals(resources[resourceIndx].getSourcePath())) {
-						component.getResources().remove(resources[resourceIndx]);
-					}
-				}
-			}
-		} finally {
-			if (moduleCore != null) {
-				moduleCore.saveIfNecessary(monitor);
-				moduleCore.dispose();
-			}
-		}
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ArtifactEditAdapterFactory.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ArtifactEditAdapterFactory.java
deleted file mode 100644
index 8a1ebf4..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ArtifactEditAdapterFactory.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.util;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.wst.common.componentcore.ArtifactEdit;
-import org.eclipse.wst.common.componentcore.ModuleCoreNature;
-import org.eclipse.wst.common.componentcore.internal.ArtifactEditModel;
-import org.eclipse.wst.common.componentcore.internal.ModulecorePlugin;
-import org.eclipse.wst.common.componentcore.internal.impl.ArtifactEditModelFactory;
-import org.eclipse.wst.common.componentcore.internal.impl.ModuleURIUtil;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.internal.emfworkbench.edit.EditModelRegistry;
-import org.eclipse.wst.common.internal.emfworkbench.integration.EditModel;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject;
-import org.eclipse.wst.common.project.facet.core.IProjectFacet;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-
-/**
- * <p>
- * The following class is not intended to be used by clients.
- * </p>
- * <p>
- * Adapts {@see ArtifactEditModel} to an {@see ArtifactEdit) 
- * instance facade, if possible. The following class is 
- * registered with the Platform Adapter Manager in 
- * {@see ModulecorePlugin#start(BundleContext)}
- * </p>
- * @see ModulecorePlugin
- */
-public class ArtifactEditAdapterFactory implements IAdapterFactory {
-
-	private static final Class ARTIFACT_EDIT_MODEL_CLASS = ArtifactEditModel.class;
-	private static final Class ARTIFACT_EDIT_CLASS = ArtifactEdit.class;
-	
-	/**
-	 * <p>
-	 * Returns an instance facade for the given anAdaptableObject, if possible.
-	 * </p> 
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class)
-	 */
-	public Object getAdapter(Object anAdaptableObject, Class anAdapterType) {
-		if (anAdapterType == ArtifactEditModel.ADAPTER_TYPE) {
-			if (anAdaptableObject instanceof ArtifactEdit) {
-				ArtifactEdit edit = (ArtifactEdit)anAdaptableObject;
-				IProject aProject = edit.getProject();
-				URI componentURI = ModuleURIUtil.fullyQualifyURI(aProject);
-				ModuleCoreNature nature = ModuleCoreNature.getModuleCoreNature(edit.getComponent().getProject());
-				Map params = new HashMap();
-				params.put(ArtifactEditModelFactory.PARAM_MODULE_URI, componentURI);
-				try {
-					IFacetedProject facetedProject = ProjectFacetsManager.create(aProject);
-					String[] editModelIDs = EditModelRegistry.getInstance().getRegisteredEditModelIDs();
-					for (int i=0; i<editModelIDs.length; i++) {
-						try {
-							IProjectFacet facet = ProjectFacetsManager.getProjectFacet(editModelIDs[i]);
-							if (facet != null && facetedProject.hasProjectFacet(facet)) {
-								EditModel editModel = nature.getExistingEditModel(editModelIDs[i],params,edit.isReadOnly());
-								if (editModel !=null)
-									return editModel;
-							}
-						} catch (Exception e) {
-							continue;
-						}
-					}
-					
-				} catch (Exception e){
-					//Return null
-				}
-				return null;
-			}
-		}
-		if (anAdapterType == ArtifactEdit.ADAPTER_TYPE) {
-			if (anAdaptableObject instanceof ArtifactEditModel)
-				return new ArtifactEdit((ArtifactEditModel) anAdaptableObject);
-			if (anAdaptableObject instanceof IVirtualComponent) {
-				ArtifactEditRegistryReader reader = ArtifactEditRegistryReader.instance();
-	    		IArtifactEditFactory factory = reader.getArtifactEdit(((IVirtualComponent)anAdaptableObject).getProject());
-	    		if (factory != null)
-	    			return factory.createArtifactEditForRead((IVirtualComponent)anAdaptableObject);
-			}
-		}
-		return null;
-	}
-
-	/**  
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
-	 */
-	public Class[] getAdapterList() {
-		return new Class[]{ARTIFACT_EDIT_MODEL_CLASS,ARTIFACT_EDIT_CLASS};
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ArtifactEditRegistryReader.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ArtifactEditRegistryReader.java
deleted file mode 100644
index 7fb7950..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ArtifactEditRegistryReader.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-/*
- * Created on Mar 29, 2004
- *
- * To change the template for this generated file go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-package org.eclipse.wst.common.componentcore.internal.util;
-
-import java.util.Hashtable;
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jem.util.RegistryReader;
-import org.eclipse.wst.common.componentcore.internal.ModulecorePlugin;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject;
-import org.eclipse.wst.common.project.facet.core.IProjectFacet;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-
-/**
- * @author cbridgha
- * 
- * To change the template for this generated type comment go to Window - Preferences - Java - Code
- * Generation - Code and Comments
- */
-public class ArtifactEditRegistryReader extends RegistryReader {
-	/**
-	 * @param registry
-	 * @param plugin
-	 * @param extensionPoint
-	 */
-	Hashtable typeRegistry = new Hashtable();
-	static final String ARTIFACT_EDIT_EXTENSION_POINT = "artifactedit"; //$NON-NLS-1$
-	static final String ARTIFACTEDIT = "artifactedit"; //$NON-NLS-1$
-	static final String TYPE = "typeID"; //$NON-NLS-1$
-	static final String ARTIFACTEDITCLASS = "class"; //$NON-NLS-1$
-	private static ArtifactEditRegistryReader instance;
-	
-	/**
-	 * @return Returns the instance.
-	 */
-	public static ArtifactEditRegistryReader instance() {
-		if (instance == null) {
-			instance = new ArtifactEditRegistryReader();
-			instance.readRegistry();
-		}
-		return instance;
-	}
-	
-	public ArtifactEditRegistryReader() {
-		super(ModulecorePlugin.PLUGIN_ID, ARTIFACT_EDIT_EXTENSION_POINT);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.RegistryReader#readElement(org.eclipse.core.runtime.IConfigurationElement)
-	 */
-	public boolean readElement(IConfigurationElement element) {
-		if (!element.getName().equals(ARTIFACTEDIT))
-			return false;
-
-		IArtifactEditFactory staticCaller = null;
-		String typeID = null;
-		try {
-			typeID = element.getAttribute(TYPE);
-			staticCaller = (IArtifactEditFactory) element.createExecutableExtension(ARTIFACTEDITCLASS);
-			
-		} catch (CoreException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		if (staticCaller != null)
-			addArtifactEdit(typeID,staticCaller);
-		return true;
-	}
-
-	private void addArtifactEdit(String typeID, IArtifactEditFactory staticCaller) {
-		typeRegistry.put(typeID,staticCaller);
-	}
-	
-	public IArtifactEditFactory getArtifactEdit(String typeID) {
-		return (IArtifactEditFactory)typeRegistry.get(typeID);
-	}
-	
-	public IArtifactEditFactory getArtifactEdit(IProject project) {
-		try {
-			IFacetedProject facetedProject = ProjectFacetsManager.create(project);
-			Iterator keys = typeRegistry.keySet().iterator();
-			while (keys.hasNext()) {
-				String typeID = (String) keys.next();
-				try {
-					IProjectFacet projectFacet = ProjectFacetsManager.getProjectFacet(typeID);
-					if (projectFacet != null && facetedProject.hasProjectFacet(projectFacet))
-						return getArtifactEdit(typeID);
-				} catch (Exception e) {
-					continue;
-				}
-			}
-		} catch (Exception e) {
-			//Just return null
-		}
-		return null;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentResolver.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentResolver.java
deleted file mode 100644
index c544700..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentResolver.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *     
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.util;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.resources.IFile;
-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.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.internal.ModulecorePlugin;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
-import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
-import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolverExtension;
-import org.osgi.framework.Bundle;
-
-public class ComponentResolver implements URIResolverExtension {
-	private static boolean _DEBUG = "true".equals(Platform.getDebugOption("org.eclipse.wst.common.modulecore/ComponentResolver")); //$NON-NLS-1$ //$NON-NLS-2$ 
-	private static final String FILE_PROTOCOL = "file:///"; //$NON-NLS-1$
-	private static final String FILE_PROTOCOL2 = "file://"; //$NON-NLS-1$
-	private static final String ROOT_PATH_STRING = Path.ROOT.toString(); //$NON-NLS-1$
-
-	/**
-	 * Various resolvers disagree on how many preceding slashes should
-	 * actually be used. On Win32, 2 slashes results in a URL object where the
-	 * volume is stripped out of the file path as the host name, but on Unix 2
-	 * is the correct number. On Win32. java.io.File.toURL adds only 1 slash,
-	 * and on Unix it adds 2.
-	 * 
-	 * @param uri
-	 * @return The IFile for this file location
-	 */
-	private IFile recalculateFile(String uri) {
-		IFile file = null;
-		if (uri != null) {
-			String location = null;
-			if (uri.startsWith(FILE_PROTOCOL)) {
-				location = uri.substring(FILE_PROTOCOL.length());
-			}
-			else if (uri.startsWith(FILE_PROTOCOL2)) {
-				location = uri.substring(FILE_PROTOCOL2.length());
-			}
-			else {
-				location = uri;
-			}
-			IPath path = new Path(location);
-			IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation(path);
-			for (int i = 0; i < files.length && file == null; i++) {
-				if (files[i].isAccessible()) {
-					file = files[i];
-				}
-			}
-		}
-		return file;
-	}
-
-	public String resolve(IFile file, String baseLocation, String publicId, String systemId) {
-		if (_DEBUG) {
-			System.out.print("ComponentResolver: resolve \"[{" + publicId + "}{" + systemId + "}]\" from \"" + baseLocation + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-		}
-		/*
-		 * Check for a system reference; without one, there's no point in
-		 * continuing.
-		 */
-		if (systemId == null) {
-			if (_DEBUG) {
-				System.out.println(" (no system reference)"); //$NON-NLS-1$
-			}
-			return null;
-		}
-		/* Recompute the IFile, if needed, from the base location. */
-		if (file == null && baseLocation != null) {
-			file = recalculateFile(baseLocation);
-		}
-		/*
-		 * If a workspace IFile is (still) not the base point of reference,
-		 * don't continue.
-		 */
-		if (file == null) {
-			if (_DEBUG) {
-				System.out.println(" (not a workspace file)"); //$NON-NLS-1$
-			}
-			return null;
-		}
-
-		/* Check for an absolute URL as the system reference. */
-		try {
-			URL testURL = new URL(systemId);
-			if (testURL != null) {
-				if (_DEBUG) {
-					System.out.println(" (reference is a URL)"); //$NON-NLS-1$
-				}
-				return null;
-			}
-		}
-		catch (MalformedURLException e) {
-			// Continue resolving
-		}
-
-		/* Check for a system file name as the system reference. */
-		IPath systemPath = new Path(systemId);
-		if (systemPath.toFile().exists()) {
-			if (_DEBUG) {
-				System.out.println(" (reference is a system file)"); //$NON-NLS-1$
-			}
-			return null;
-		}
-
-		boolean prependFilePrefix = baseLocation.startsWith(FILE_PROTOCOL) && baseLocation.length() > 7;
-		boolean prependFilePrefix2 = baseLocation.startsWith(FILE_PROTOCOL2) && baseLocation.length() > 8;
-
-		String resolvedPath = null;
-		
-		IVirtualResource[] virtualResources = null;
-		try {
-			virtualResources = ComponentCore.createResources(file);
-		}
-		catch (Exception e) {
-			Status statusObj = new Status(IStatus.ERROR, ModulecorePlugin.PLUGIN_ID, IStatus.ERROR, "Exception calling ComponentCore.createResources()", e);
-			Bundle bundle = Platform.getBundle(ModulecorePlugin.PLUGIN_ID);
-			if (bundle != null) {
-				Platform.getLog(bundle).log(statusObj);
-			}
-		}
-
-		// Only return results for Flexible projects
-		if (virtualResources != null) {
-			for (int i = 0; i < virtualResources.length && resolvedPath == null; i++) {
-				IPath resolvedRuntimePath = null;
-				if (systemId.startsWith(ROOT_PATH_STRING)) {
-					resolvedRuntimePath = new Path(systemId);
-				}
-				else {
-					resolvedRuntimePath = new Path(virtualResources[i].getRuntimePath().removeLastSegments(1).append(systemId).toString());
-				}
-				IVirtualFile virtualFile = ComponentCore.createFile(file.getProject(), resolvedRuntimePath);
-				IFile resolvedFile = null;
-				if (virtualFile.getWorkspaceRelativePath().segmentCount() > 1) {
-					resolvedFile = virtualFile.getUnderlyingFile();
-				}
-				if (resolvedFile != null && resolvedFile.getLocation() != null) {
-					if (prependFilePrefix) {
-						resolvedPath = FILE_PROTOCOL + resolvedFile.getLocation().toString();
-					}
-					else if (prependFilePrefix2) {
-						resolvedPath = FILE_PROTOCOL2 + resolvedFile.getLocation().toString();
-					}
-					else {
-						resolvedPath = resolvedFile.getLocation().toString();
-					}
-				}
-			}
-		}
-		else {
-			if (_DEBUG) {
-				System.out.println(" (not in flexible project)"); //$NON-NLS-1$
-			}
-		}
-		if (_DEBUG) {
-			System.out.println(" -> \"" + resolvedPath + "\""); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		return resolvedPath;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentUtilities.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentUtilities.java
deleted file mode 100644
index d49c789..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentUtilities.java
+++ /dev/null
@@ -1,285 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.util;
-
-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.ResourceAttributes;
-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.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.wst.common.componentcore.ArtifactEdit;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.ModuleCoreNature;
-import org.eclipse.wst.common.componentcore.datamodel.properties.ICreateReferenceComponentsDataModelProperties;
-import org.eclipse.wst.common.componentcore.internal.Property;
-import org.eclipse.wst.common.componentcore.internal.StructureEdit;
-import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-import org.eclipse.wst.common.componentcore.internal.operation.CreateReferenceComponentsDataModelProvider;
-import org.eclipse.wst.common.componentcore.internal.operation.CreateReferenceComponentsOp;
-import org.eclipse.wst.common.componentcore.internal.operation.RemoveReferenceComponentOperation;
-import org.eclipse.wst.common.componentcore.internal.operation.RemoveReferenceComponentsDataModelProvider;
-import org.eclipse.wst.common.componentcore.internal.resources.VirtualComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
-import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
-
-public class ComponentUtilities {
-
-	/**
-	 * Ensure the container is not read-only.
-	 * <p>
-	 * For Linux, a Resource cannot be created in a ReadOnly folder. This is only necessary for new
-	 * files.
-	 * 
-	 * @param resource
-	 *            workspace resource to make read/write
-	 * @plannedfor 1.0.0
-	 */
-	public static void ensureContainerNotReadOnly(IResource resource) {
-		if (resource != null && !resource.exists()) { // it must be new
-			IContainer container = resource.getParent();
-			if (container != null) {
-				ResourceAttributes attr = container.getResourceAttributes();
-				if (!attr.isReadOnly())
-					container = container.getParent();
-				attr.setReadOnly(false);
-			}
-		}
-	}
-
-	public static IFolder createFolderInComponent(IVirtualComponent component, String folderName) throws CoreException {
-		if (folderName != null) {
-			IVirtualFolder rootfolder = component.getRootFolder();
-			IFolder folder = ResourcesPlugin.getWorkspace().getRoot().getFolder(new Path(rootfolder.getProject().getName()).append(folderName));
-			if (!folder.exists()) {
-				ProjectUtilities.ensureContainerNotReadOnly(folder);
-				folder.create(true, true, null);
-			}
-			return folder;
-		}
-		return null;
-	}
-
-
-
-	public static ArtifactEdit getArtifactEditForRead(IVirtualComponent comp) {
-		if (comp != null) {
-			ArtifactEditRegistryReader reader = ArtifactEditRegistryReader.instance();
-			IArtifactEditFactory factory = reader.getArtifactEdit(comp.getProject());
-			if (factory != null)
-				return factory.createArtifactEditForRead(comp);
-		}
-		return null;
-	}
-
-
-
-	public static IFile findFile(IVirtualComponent comp, IPath aPath) throws CoreException {
-		if (comp == null || aPath == null)
-			return null;
-		IVirtualFolder root = comp.getRootFolder();
-		IVirtualResource file = root.findMember(aPath);
-		if (file != null)
-			return (IFile) file.getUnderlyingResource();
-		return null;
-	}
-
-	public static IVirtualComponent findComponent(IResource res) {
-
-		return (IVirtualComponent)res.getAdapter(IVirtualComponent.class);
-	}
-	
-	/**
-	 * **********************Please read java doc before using this api*******************
-	 * This is a very expensive api from a performance point as it does a structure edit
-	 * access and release for each component in the workspace. Use this api very sparingly
-	 * and if used cached the information returned by this api for further processing
-	 * @return - A an array of all virtual components in the workspace
-	 * ***********************************************************************************
-	 */
-
-	public static IVirtualComponent[] getAllWorkbenchComponents() {
-		List components = new ArrayList();
-		List projects = Arrays.asList(ResourcesPlugin.getWorkspace().getRoot().getProjects());
-		for (int i = 0; i < projects.size(); i++) {
-			if( ModuleCoreNature.isFlexibleProject((IProject)projects.get(i))){
-				IVirtualComponent wbComp = ComponentCore.createComponent((IProject)projects.get(i));
-				components.add(wbComp);
-			}
-		}
-		VirtualComponent[] temp = (VirtualComponent[]) components.toArray(new VirtualComponent[components.size()]);
-		return temp;
-	}
-	
-	/**
-	 * **********************Please read java doc before using this api*******************
-	 * This is a very expensive api from a performance point as it does a structure edit
-	 * access and release for each component in the workspace. Use this api very sparingly
-	 * and if used cached the information returned by this api for further processing.
-	 * 
-	 * @return - A virtual component in the workspace
-	 * ***********************************************************************************
-	 */
-	public static IVirtualComponent getComponent(String componentName) {
-		IVirtualComponent[] allComponents = getAllWorkbenchComponents();
-		for (int i = 0; i < allComponents.length; i++) {
-			if (allComponents[i].getName().equals(componentName))
-				return allComponents[i];
-		}
-		return null;
-	}
-
-
-
-	public static ArtifactEdit getArtifactEditForWrite(IVirtualComponent comp) {
-		if (comp != null) {
-			ArtifactEditRegistryReader reader = ArtifactEditRegistryReader.instance();
-			IArtifactEditFactory factory = reader.getArtifactEdit(comp.getProject());
-			if (factory != null)
-				return factory.createArtifactEditForWrite(comp);
-		}
-		return null;
-	}
-
-	public static IVirtualComponent findComponent(EObject anObject) {
-		Resource res = anObject.eResource();
-		return findComponent(res);
-	}
-
-	public static IVirtualComponent findComponent(Resource aResource) {
-		return (IVirtualComponent)WorkbenchResourceHelper.getFile(aResource).getAdapter(IVirtualComponent.class);
-	}
-
-//	public static JavaProjectMigrationOperation createFlexJavaProjectForProjectOperation(IProject project) {
-//		IDataModel model = DataModelFactory.createDataModel(new JavaProjectMigrationDataModelProvider());
-//		model.setProperty(IJavaProjectMigrationDataModelProperties.PROJECT_NAME, project.getName());
-//		return new JavaProjectMigrationOperation(model);
-//	}
-
-	public static CreateReferenceComponentsOp createReferenceComponentOperation(IVirtualComponent sourceComponent, List targetComponentProjects) {
-		IDataModel model = DataModelFactory.createDataModel(new CreateReferenceComponentsDataModelProvider());
-		model.setProperty(ICreateReferenceComponentsDataModelProperties.SOURCE_COMPONENT, sourceComponent);
-		List modHandlesList = (List) model.getProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST);
-		modHandlesList.addAll(targetComponentProjects);
-		model.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST, modHandlesList);
-		
-		return new CreateReferenceComponentsOp(model);
-	}
-	
-	public static CreateReferenceComponentsOp createWLPReferenceComponentOperation(IVirtualComponent sourceComponent, List targetComponentProjects) {
-		IDataModel model = DataModelFactory.createDataModel(new CreateReferenceComponentsDataModelProvider());
-		model.setProperty(ICreateReferenceComponentsDataModelProperties.SOURCE_COMPONENT, sourceComponent);
-		List modHandlesList = (List) model.getProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST);
-		modHandlesList.addAll(targetComponentProjects);
-		model.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST, modHandlesList);
-		model.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENTS_DEPLOY_PATH,"/WEB-INF/lib"); //$NON-NLS-1$
-		return new CreateReferenceComponentsOp(model);
-	}
-
-	public static RemoveReferenceComponentOperation removeWLPReferenceComponentOperation(IVirtualComponent sourceComponent, List targetComponentProjects) {
-		IDataModel model = DataModelFactory.createDataModel(new RemoveReferenceComponentsDataModelProvider());
-		model.setProperty(ICreateReferenceComponentsDataModelProperties.SOURCE_COMPONENT, sourceComponent);
-		List modHandlesList = (List) model.getProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST);
-		modHandlesList.addAll(targetComponentProjects);
-		model.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST, modHandlesList);
-		
-		model.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENTS_DEPLOY_PATH,"/WEB-INF/lib"); //$NON-NLS-1$
-		
-		return new RemoveReferenceComponentOperation(model);
-
-	}
-	
-	public static RemoveReferenceComponentOperation removeReferenceComponentOperation(IVirtualComponent sourceComponent, List targetComponentProjects) {
-		IDataModel model = DataModelFactory.createDataModel(new RemoveReferenceComponentsDataModelProvider());
-		model.setProperty(ICreateReferenceComponentsDataModelProperties.SOURCE_COMPONENT, sourceComponent);
-		List modHandlesList = (List) model.getProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST);
-		modHandlesList.addAll(targetComponentProjects);
-		model.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST, modHandlesList);
-		return new RemoveReferenceComponentOperation(model);
-
-	}
-	
-	public static IVirtualComponent[] getComponents(IProject[] projects) {
-		List result = new ArrayList();
-		if (projects!=null) {
-			for (int i=0; i<projects.length; i++) {
-				if (projects[i] != null) {
-					IVirtualComponent comp = ComponentCore.createComponent(projects[i]);
-					if (comp != null && comp.exists())
-						result.add(comp);
-				}
-			}
-		}
-		return (IVirtualComponent[]) result.toArray(new IVirtualComponent[result.size()]);
-	}
-	
-	/**
-	 * This method will retrieve the context root for the associated workbench module which is used
-	 * by the server at runtime.  This method is not yet completed as the context root has to be
-	 * abstracted and added to the workbenchModule model.  This API will not change though.
-	 * Returns null for now.
-	 * 
-	 * @return String value of the context root for runtime of the associated module
-	 */
-	public static String getServerContextRoot(IProject project) {
-		
-		StructureEdit moduleCore = null;
-		WorkbenchComponent wbComponent = null;
-		try {
-			moduleCore = StructureEdit.getStructureEditForRead(project);
-			if (moduleCore == null || moduleCore.getComponent() == null)
-				return null;
-			wbComponent = moduleCore.getComponent();
-		} finally {
-			if (moduleCore != null) {
-				moduleCore.dispose();
-			}
-		}
-		List existingProps = wbComponent.getProperties();
-		for (int i = 0; i < existingProps.size(); i++) {
-			Property prop = (Property) existingProps.get(i);
-			if(prop.getName().equals(IModuleConstants.CONTEXTROOT)){
-				return prop.getValue();
-			}
-		}			
-		// If all else fails...
-		return null;
-	}
-	
-	/**
-	 * This method will set the context root on the associated workbench module with the given string
-	 * value passed in.  This context root is used by the server at runtime.  This method is not yet
-	 * completed as the context root still needs to be abstracted and added to the workbench module
-	 * model.  This API will not change though.
-	 * Does nothing as of now.
-	 * 
-	 * @param contextRoot string
-	 */
-	public static void setServerContextRoot(IProject project, String contextRoot) {
-		IVirtualComponent comp = ComponentCore.createComponent(project);
-		comp.setMetaProperty(IModuleConstants.CONTEXTROOT, contextRoot);
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentcoreAdapterFactory.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentcoreAdapterFactory.java
deleted file mode 100644
index 3716298..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentcoreAdapterFactory.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ComponentcoreAdapterFactory.java,v 1.6 2005/10/18 22:27:18 cbridgha Exp $
- */
-package org.eclipse.wst.common.componentcore.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.wst.common.componentcore.internal.ComponentResource;
-import org.eclipse.wst.common.componentcore.internal.ComponentType;
-import org.eclipse.wst.common.componentcore.internal.ComponentcorePackage;
-import org.eclipse.wst.common.componentcore.internal.ProjectComponents;
-import org.eclipse.wst.common.componentcore.internal.Property;
-import org.eclipse.wst.common.componentcore.internal.ReferencedComponent;
-import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-
-/**
- * <!-- 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.wst.common.componentcore.internal.ComponentcorePackage
- * @generated
- */
-public class ComponentcoreAdapterFactory extends AdapterFactoryImpl {
-	/**
-	 * The cached model package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static ComponentcorePackage modelPackage;
-
-	/**
-	 * Creates an instance of the adapter factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentcoreAdapterFactory() {
-		if (modelPackage == null) {
-			modelPackage = ComponentcorePackage.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 ComponentcoreSwitch modelSwitch =
-		new ComponentcoreSwitch() {
-			public Object caseWorkbenchComponent(WorkbenchComponent object) {
-				return createWorkbenchComponentAdapter();
-			}
-			public Object caseComponentResource(ComponentResource object) {
-				return createComponentResourceAdapter();
-			}
-			public Object caseComponentType(ComponentType object) {
-				return createComponentTypeAdapter();
-			}
-			public Object caseProperty(Property object) {
-				return createPropertyAdapter();
-			}
-			public Object caseReferencedComponent(ReferencedComponent object) {
-				return createReferencedComponentAdapter();
-			}
-			public Object caseProjectComponents(ProjectComponents object) {
-				return createProjectComponentsAdapter();
-			}
-			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.wst.common.componentcore.internal.WorkbenchComponent <em>Workbench Component</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.wst.common.componentcore.internal.WorkbenchComponent
-	 * @generated
-	 */
-	public Adapter createWorkbenchComponentAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.wst.common.componentcore.internal.ComponentResource <em>Component Resource</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentResource
-	 * @generated
-	 */
-	public Adapter createComponentResourceAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.wst.common.componentcore.internal.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.wst.common.componentcore.internal.ComponentType
-	 * @generated
-	 */
-	public Adapter createComponentTypeAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.wst.common.componentcore.internal.Property <em>Property</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.wst.common.componentcore.internal.Property
-	 * @generated
-	 */
-	public Adapter createPropertyAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.wst.common.componentcore.internal.ReferencedComponent <em>Referenced Component</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.wst.common.componentcore.internal.ReferencedComponent
-	 * @generated
-	 */
-	public Adapter createReferencedComponentAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.wst.common.componentcore.internal.ProjectComponents <em>Project Components</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.wst.common.componentcore.internal.ProjectComponents
-	 * @generated
-	 */
-	public Adapter createProjectComponentsAdapter() {
-		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;
-	}
-
-} //ComponentcoreAdapterFactory
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentcoreSwitch.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentcoreSwitch.java
deleted file mode 100644
index f556abc..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentcoreSwitch.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ComponentcoreSwitch.java,v 1.6 2005/10/18 22:27:18 cbridgha Exp $
- */
-package org.eclipse.wst.common.componentcore.internal.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.wst.common.componentcore.internal.ComponentResource;
-import org.eclipse.wst.common.componentcore.internal.ComponentType;
-import org.eclipse.wst.common.componentcore.internal.ComponentcorePackage;
-import org.eclipse.wst.common.componentcore.internal.ProjectComponents;
-import org.eclipse.wst.common.componentcore.internal.Property;
-import org.eclipse.wst.common.componentcore.internal.ReferencedComponent;
-import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-
-/**
- * <!-- 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.wst.common.componentcore.internal.ComponentcorePackage
- * @generated
- */
-public class ComponentcoreSwitch {
-	/**
-	 * The cached model package
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static ComponentcorePackage modelPackage;
-
-	/**
-	 * Creates an instance of the switch.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentcoreSwitch() {
-		if (modelPackage == null) {
-			modelPackage = ComponentcorePackage.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 ComponentcorePackage.WORKBENCH_COMPONENT: {
-				WorkbenchComponent workbenchComponent = (WorkbenchComponent)theEObject;
-				Object result = caseWorkbenchComponent(workbenchComponent);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case ComponentcorePackage.COMPONENT_RESOURCE: {
-				ComponentResource componentResource = (ComponentResource)theEObject;
-				Object result = caseComponentResource(componentResource);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case ComponentcorePackage.COMPONENT_TYPE: {
-				ComponentType componentType = (ComponentType)theEObject;
-				Object result = caseComponentType(componentType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case ComponentcorePackage.PROPERTY: {
-				Property property = (Property)theEObject;
-				Object result = caseProperty(property);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case ComponentcorePackage.REFERENCED_COMPONENT: {
-				ReferencedComponent referencedComponent = (ReferencedComponent)theEObject;
-				Object result = caseReferencedComponent(referencedComponent);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case ComponentcorePackage.PROJECT_COMPONENTS: {
-				ProjectComponents projectComponents = (ProjectComponents)theEObject;
-				Object result = caseProjectComponents(projectComponents);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			default: return defaultCase(theEObject);
-		}
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Workbench Component</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Workbench Component</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseWorkbenchComponent(WorkbenchComponent object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Component Resource</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate 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 Resource</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseComponentResource(ComponentResource 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>Property</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate 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</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseProperty(Property object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Referenced Component</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Referenced Component</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseReferencedComponent(ReferencedComponent object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Project Components</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Project Components</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseProjectComponents(ProjectComponents 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;
-	}
-
-} //ComponentcoreSwitch
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/DependencyTypeTranslator.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/DependencyTypeTranslator.java
deleted file mode 100644
index 2a9127c..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/DependencyTypeTranslator.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 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
- *******************************************************************************/
-/*
- * Created on Apr 2, 2003
- *
- * To change the template for this generated file go to
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
-package org.eclipse.wst.common.componentcore.internal.util;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.wst.common.componentcore.internal.ComponentcorePackage;
-import org.eclipse.wst.common.componentcore.internal.DependencyType;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author administrator
- *
- * To change the template for this generated type comment go to
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
-public class DependencyTypeTranslator extends Translator implements WTPModulesXmlMapperI{
-	
-	public DependencyTypeTranslator(){
-		super(DEPENDENCY_TYPE,ComponentcorePackage.eINSTANCE.getReferencedComponent_DependencyType());
-	}
-	
-	/* (non-Javadoc)
-	 * @see com.ibm.etools.emf2xml.impl.Translator#convertStringToValue(java.lang.String, org.eclipse.emf.ecore.EObject)
-	 */
-	public Object convertStringToValue(String strValue, EObject owner) {
-		String correct = strValue;
-		if (strValue.toUpperCase().equals("CONSUMES")) //$NON-NLS-1$
-			correct = DependencyType.CONSUMES_LITERAL.getName(); 
-		else if (strValue.toUpperCase().equals("USES")) //$NON-NLS-1$
-			correct = DependencyType.USES_LITERAL.getName(); 
-			
-		return super.convertStringToValue(correct, owner);
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/DeployedPathProvider.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/DeployedPathProvider.java
deleted file mode 100644
index 6964233..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/DeployedPathProvider.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.util;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.wst.common.componentcore.internal.ComponentResource;
-import org.eclipse.wst.common.componentcore.internal.ComponentcorePackage;
-
-/**
- * <p>
- * The following class is experimental until fully documented.
- * </p>
- */
-public class DeployedPathProvider implements IPathProvider {
-	
-	public static IPathProvider INSTANCE = new DeployedPathProvider();
-	
-	private DeployedPathProvider() {} 
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.modulecore.util.IPathProvider#getPath(org.eclipse.wst.common.modulecore.WorkbenchComponent)
-	 */
-	public IPath getPath(ComponentResource aModuleResource) { 
-		return aModuleResource.getRuntimePath();
-	}
-	
-	public EStructuralFeature getFeature() {
-		return ComponentcorePackage.eINSTANCE.getComponentResource_RuntimePath();
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/EclipseResourceAdapter.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/EclipseResourceAdapter.java
deleted file mode 100644
index 9ca6d48..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/EclipseResourceAdapter.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.util;
-
-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.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.wst.common.componentcore.internal.ComponentResource;
-import org.eclipse.wst.common.componentcore.internal.ComponentcorePackage;
-import org.eclipse.wst.common.componentcore.internal.StructureEdit;
-
-/**
- * <p>
- * The following class is experimental until fully documented.
- * </p>
- */
-public class EclipseResourceAdapter extends AdapterImpl implements Adapter {
-
-	public static final Class ADAPTER_TYPE = EclipseResourceAdapter.class;
-	private IResource resource;
-	private boolean hasSearchFailed = false;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.notify.Adapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification aNotification) {
-		if (aNotification.getFeature() == ComponentcorePackage.eINSTANCE.getComponentResource_SourcePath()) {
-			if (aNotification.getEventType() == Notification.SET) {
-				resource = null;
-				hasSearchFailed = false;
-			}
-		}
-	}
-
-	public IResource getEclipseResource() {
-		IProject container = null;
-		if (resource != null || hasSearchFailed)
-			return resource;
-		synchronized (this) {
-			if (resource == null) {
-				ComponentResource moduleResource = (ComponentResource) getTarget();
-				IPath sourcePath = moduleResource.getSourcePath();
-				if (moduleResource.getOwningProject() != null)
-					container = moduleResource.getOwningProject();
-				else
-					container = StructureEdit.getContainingProject(moduleResource.getComponent());
-				if (container != null)
-					resource = container.findMember(sourcePath); 
-				if(resource == null)
-					resource = ResourcesPlugin.getWorkspace().getRoot().findMember(sourcePath); 
-				
-				hasSearchFailed = resource == null;
-			}
-		}
-		return resource;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.notify.Adapter#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object aType) {
-		return ADAPTER_TYPE == aType;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/HRefTranslator.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/HRefTranslator.java
deleted file mode 100644
index 3bcd8b7..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/HRefTranslator.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.util;
-
-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.emf.ecore.util.EcoreUtil;
-import org.eclipse.wst.common.componentcore.ArtifactEdit;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.internal.StructureEdit;
-import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-import org.eclipse.wst.common.internal.emf.resource.TranslatorPath;
-
-public class HRefTranslator extends Translator {
-
-	public HRefTranslator(String domNameAndPath, EClass eClass) {
-		super(domNameAndPath, eClass);
-		// TODO Auto-generated constructor stub
-	}
-
-	public HRefTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-		// TODO Auto-generated constructor stub
-	}
-
-	public HRefTranslator(String domNameAndPath, EStructuralFeature aFeature,
-			EClass eClass) {
-		super(domNameAndPath, aFeature, eClass);
-		// TODO Auto-generated constructor stub
-	}
-
-	public HRefTranslator(String domNameAndPath, EStructuralFeature aFeature,
-			TranslatorPath path) {
-		super(domNameAndPath, aFeature, path);
-		// TODO Auto-generated constructor stub
-	}
-
-	public HRefTranslator(String domNameAndPath, EStructuralFeature aFeature,
-			TranslatorPath[] paths) {
-		super(domNameAndPath, aFeature, paths);
-		// TODO Auto-generated constructor stub
-	}
-
-	public HRefTranslator(String domNameAndPath, EStructuralFeature aFeature,
-			int style) {
-		super(domNameAndPath, aFeature, style);
-		// TODO Auto-generated constructor stub
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#convertStringToValue(java.lang.String,
-	 *      org.eclipse.emf.ecore.EObject)
-	 */
-	public Object convertStringToValue(String aValue, EObject anOwner) { 
-		WorkbenchComponent earComp = (WorkbenchComponent)anOwner.eContainer();
-		IVirtualComponent virtualComp = ComponentCore.createComponent(StructureEdit.getContainingProject(earComp));
-		ArtifactEdit edit = (ArtifactEdit)virtualComp.getAdapter(ArtifactEdit.class);
-		if (edit == null) return null;
-		Resource res = edit.getContentModelRoot().eResource();
-		return res.getEObject(aValue);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#convertValueToString(java.lang.Object,
-	 *      org.eclipse.emf.ecore.EObject)
-	 */
-	public String convertValueToString(Object aValue, EObject anOwner) { 
-		String frag = null;
-		if (((EObject)aValue).eResource() != null)
-			frag = ((EObject)aValue).eResource().getURIFragment((EObject)aValue);
-		else
-			frag = EcoreUtil.getID((EObject)aValue);
-		return frag;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/IArtifactEditFactory.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/IArtifactEditFactory.java
deleted file mode 100644
index cd5f471..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/IArtifactEditFactory.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.util;
-
-import org.eclipse.wst.common.componentcore.ArtifactEdit;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-
-/**
- * <p>
- * The following class is experimental until fully documented.
- * </p>
- */
-public interface IArtifactEditFactory {
-	
-	public ArtifactEdit createArtifactEditForRead(IVirtualComponent aComponent);
-	
-	public ArtifactEdit createArtifactEditForWrite(IVirtualComponent aComponent);
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/IModuleConstants.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/IModuleConstants.java
deleted file mode 100644
index 19dcbf9..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/IModuleConstants.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.util;
-
-import org.eclipse.core.runtime.Path;
-
-/**
- * <p>
- * The following class is experimental until fully documented.
- * </p>
- */
-public interface IModuleConstants {
-	
-	public final static String COMPONENT_FILE_NAME = ".component"; //$NON-NLS-1$
-	public final static Path COMPONENT_FILE_PATH = new Path(".settings/"+COMPONENT_FILE_NAME); //$NON-NLS-1$
-    public final static String WTPMODULE_FILE_NAME = ".wtpmodules"; //$NON-NLS-1$
-	public final static Path WTPMODULE_FILE_PATH = new Path(WTPMODULE_FILE_NAME); //$NON-NLS-1$
-	public final static String MODULE_PLUG_IN_ID = "org.eclipse.wst.common.modulecore"; //$NON-NLS-1$
-	public final static String MODULE_NATURE_ID = "org.eclipse.wst.common.modulecore.ModuleCoreNature"; //$NON-NLS-1$
-
-	//moduleTypes
-	public final static String JST_WEB_MODULE = "jst.web"; //$NON-NLS-1$
-	public final static String JST_EJB_MODULE = "jst.ejb"; //$NON-NLS-1$
-	public final static String JST_UTILITY_MODULE = "jst.utility"; //$NON-NLS-1$
-	public final static String WST_WEB_MODULE = "wst.web"; //$NON-NLS-1$
-	public final static String JST_EAR_MODULE = "jst.ear"; //$NON-NLS-1$
-	public final static String JST_APPCLIENT_MODULE = "jst.appclient"; //$NON-NLS-1$
-	public final static String JST_CONNECTOR_MODULE = "jst.connector"; //$NON-NLS-1$
-	public final static String JST_JAVA = "jst.java"; //$NON-NLS-1$
-	
-	public final static String DEPENDENT_MODULE = "dependent"; //$NON-NLS-1$
-    
-    //Property Constants
-    public final static String PROJ_REL_JAVA_OUTPUT_PATH = "java-output-path"; //$NON-NLS-1$ 
-    
-    public final static String CONTEXTROOT = "context-root"; //$NON-NLS-1$
-	 
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/IPathProvider.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/IPathProvider.java
deleted file mode 100644
index 389edd2..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/IPathProvider.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.util;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.wst.common.componentcore.internal.ComponentResource;
-
-/**
- * <p>
- * The following class is experimental until fully documented.
- * </p>
- */
-public interface IPathProvider {
-	
-	IPath getPath(ComponentResource aModuleResource);
-	
-	EStructuralFeature getFeature();
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/IPathTranslator.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/IPathTranslator.java
deleted file mode 100644
index 8012cb1..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/IPathTranslator.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.util;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-import org.eclipse.wst.common.internal.emf.resource.TranslatorPath;
-
-/**
- * <p>
- * The following class is experimental until fully documented.
- * </p>
- */
-public class IPathTranslator extends Translator {
-
-	public IPathTranslator(String aDomPath, EStructuralFeature aFeature) {
-		super(aDomPath, aFeature);
-	}
-	
-	public IPathTranslator(String aDomPath, EStructuralFeature aFeature, TranslatorPath aTranslatorPath) {
-		super(aDomPath, aFeature, new TranslatorPath[]{aTranslatorPath});
-	}
-	
-	public IPathTranslator(String aDomPath, EStructuralFeature aFeature, TranslatorPath[] theTranslatorPaths) {
-		super(aDomPath, aFeature, theTranslatorPaths);
-	}
-	
-	public IPathTranslator(String aDomPath, EStructuralFeature aFeature, int aStyleMask) {
-		super(aDomPath, aFeature, aStyleMask);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#convertStringToValue(java.lang.String,
-	 *      org.eclipse.emf.ecore.EObject)
-	 */
-	public Object convertStringToValue(String aValue, EObject anOwner) { 
-		return new Path(aValue);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#convertValueToString(java.lang.Object,
-	 *      org.eclipse.emf.ecore.EObject)
-	 */
-	public String convertValueToString(Object aValue, EObject anOwner) { 
-		if(aValue instanceof IPath) 
-			return ((IPath)aValue).toString();
-		return super.convertValueToString(aValue, anOwner);
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ModuleCoreEclipseAdapterFactory.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ModuleCoreEclipseAdapterFactory.java
deleted file mode 100644
index ca3e606..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ModuleCoreEclipseAdapterFactory.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.util;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.UnresolveableURIException;
-import org.eclipse.wst.common.componentcore.internal.ModuleStructuralModel;
-import org.eclipse.wst.common.componentcore.internal.StructureEdit;
-import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-import org.eclipse.wst.common.componentcore.internal.impl.ResourceTreeNode;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-
-/**
- * <p>
- * The following class is experimental until fully documented.
- * </p>
- */
-public class ModuleCoreEclipseAdapterFactory implements IAdapterFactory {
-	
-	private static final Class MODULE_CORE_CLASS = StructureEdit.class;
-	private static final Class VIRTUAL_COMPONENT_CLASS = IVirtualComponent.class;
-	private static final Class[] ADAPTER_LIST = new Class[] { MODULE_CORE_CLASS, VIRTUAL_COMPONENT_CLASS};
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class)
-	 */
-	public Object getAdapter(Object adaptable, Class anAdapterType) {
-		if(anAdapterType == MODULE_CORE_CLASS)
-				return new StructureEdit((ModuleStructuralModel)adaptable);
-		if(anAdapterType == VIRTUAL_COMPONENT_CLASS)
-			return getComponent((IResource)adaptable);
-		return null;
-	}
-
-	private Object getComponent(IResource resource) {
-		StructureEdit moduleCore = null;
-		WorkbenchComponent module = null;
-		if (!resource.exists()) return null;
-			
-		try {
-			moduleCore = StructureEdit.getStructureEditForRead(resource.getProject());
-			if (moduleCore == null)
-				return null;
-			if (resource.getType() == IResource.PROJECT) {
-				WorkbenchComponent[] comps = moduleCore.getWorkbenchModules();
-				if (comps.length > 0)
-					return ComponentCore.createComponent(resource.getProject());
-				return null;
-			}
-			module = moduleCore.findComponent(resource.getFullPath(),ResourceTreeNode.CREATE_NONE);	
-		} catch (UnresolveableURIException e) {
-			// Ignore
-		} finally {
-			if (moduleCore != null)
-				moduleCore.dispose();
-		}
-		return module == null ? null : ComponentCore.createComponent(resource.getProject());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
-	 */
-	public Class[] getAdapterList() { 
-		return ADAPTER_LIST;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/SourcePathProvider.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/SourcePathProvider.java
deleted file mode 100644
index 4cc4ab1..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/SourcePathProvider.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.util;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.wst.common.componentcore.internal.ComponentResource;
-import org.eclipse.wst.common.componentcore.internal.ComponentcorePackage;
-
-/**
- * <p>
- * The following class is experimental until fully documented.
- * </p>
- */
-public class SourcePathProvider implements IPathProvider {
-	
-	public static IPathProvider INSTANCE = new SourcePathProvider();
-	
-	private SourcePathProvider() {} 
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.modulecore.util.IPathProvider#getPath(org.eclipse.wst.common.modulecore.WorkbenchComponent)
-	 */
-	public IPath getPath(ComponentResource aModuleResource) {
-		return aModuleResource.getSourcePath();
-	}
-
-	public EStructuralFeature getFeature() {
-		return ComponentcorePackage.eINSTANCE.getComponentResource_SourcePath();
-	}
-	
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/URITranslator.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/URITranslator.java
deleted file mode 100644
index 84743f9..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/URITranslator.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.util;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-import org.eclipse.wst.common.internal.emf.resource.TranslatorPath;
-
-/**
- * <p>
- * The following class is experimental until fully documented.
- * </p>
- */
-public class URITranslator extends Translator {
-
-	public URITranslator(String aDomPath, EStructuralFeature aFeature) {
-		super(aDomPath, aFeature);
-	}
-	
-	public URITranslator(String aDomPath, EStructuralFeature aFeature, TranslatorPath aTranslatorPath) {
-		super(aDomPath, aFeature, new TranslatorPath[]{aTranslatorPath});
-	}
-	
-	public URITranslator(String aDomPath, EStructuralFeature aFeature, TranslatorPath[] theTranslatorPaths) {
-		super(aDomPath, aFeature, theTranslatorPaths);
-	}
-	
-	public URITranslator(String aDomPath, EStructuralFeature aFeature, int aStyleMask) {
-		super(aDomPath, aFeature, aStyleMask);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#convertStringToValue(java.lang.String,
-	 *      org.eclipse.emf.ecore.EObject)
-	 */
-	public Object convertStringToValue(String aValue, EObject anOwner) { 
-		return URI.createURI(aValue);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#convertValueToString(java.lang.Object,
-	 *      org.eclipse.emf.ecore.EObject)
-	 */
-	public String convertValueToString(Object aValue, EObject anOwner) { 
-		if(aValue instanceof URI) 
-			return ((URI)aValue).toString();
-		return super.convertValueToString(aValue, anOwner);
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/WTPModulesTranslator.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/WTPModulesTranslator.java
deleted file mode 100644
index 4f5f383..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/WTPModulesTranslator.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.util;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.wst.common.componentcore.internal.ComponentcorePackage;
-import org.eclipse.wst.common.internal.emf.resource.GenericTranslator;
-import org.eclipse.wst.common.internal.emf.resource.IDTranslator;
-import org.eclipse.wst.common.internal.emf.resource.RootTranslator;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-
-public class WTPModulesTranslator extends RootTranslator implements WTPModulesXmlMapperI{
-	public static WTPModulesTranslator INSTANCE = new WTPModulesTranslator();
-	private static Translator[] children;
-	private static final ComponentcorePackage MODULE_CORE_PKG = ComponentcorePackage.eINSTANCE;
-	/**
-	 * @param domNameAndPath
-	 * @param eClass
-	 */
-	public WTPModulesTranslator() {
-		super(PROJECT_MODULES, ComponentcorePackage.eINSTANCE.getProjectComponents());
-	}	
-	
-//	public void setMOFValue(Notifier owner, Object value, int newIndex) {		
-//		super.setMOFValue(owner, value, newIndex);
-//		EObject target = ((EObject)value);
-//		IProject project = ProjectUtilities.getProject(target);
-//		if(project != null)
-//			target.eSet(ComponentcorePackage.eINSTANCE.getProjectComponents_ProjectName(), project.getName());
-//	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren(java.lang.Object, int)
-	 */
-	public Translator[] getChildren(Object target, int versionID) {
-		if(children == null)
-			children = createWTPModulesTranslator();
-		return children;
-	}
-	
-	private static Translator[] createWTPModulesTranslator() {
-		return new Translator[] {
-				IDTranslator.INSTANCE,
-				createWBModuleTranslator(MODULE_CORE_PKG.getProjectComponents_Components())
-		};
-	}
-
-	/**
-	 * @return
-	 */
-	private static Translator createWBModuleTranslator(EStructuralFeature afeature) {
-		GenericTranslator result = new GenericTranslator(WORKBENCH_COMPONENT, afeature);
-		result.setChildren(new Translator[] {
-			IDTranslator.INSTANCE,
-			//new Translator(HANDLE, MODULE_CORE_PKG.getWorkbenchComponent_Handle(), DOM_ATTRIBUTE), REMOVED SINCE HANDLE SHOULD NOW BE DERIVED -MDE
-			new Translator(RUNTIME_NAME, MODULE_CORE_PKG.getWorkbenchComponent_Name(), DOM_ATTRIBUTE), 
-			createModuleTypeTranslator(MODULE_CORE_PKG.getWorkbenchComponent_ComponentType()),
-			createWBResourceTranslator(MODULE_CORE_PKG.getWorkbenchComponent_Resources()),
-			createDependentModuleTranslator(MODULE_CORE_PKG.getWorkbenchComponent_ReferencedComponents()),
-			new IPathTranslator(META_RESOURCES, MODULE_CORE_PKG.getWorkbenchComponent_MetadataResources()),
-			createPropertiesTranslator(MODULE_CORE_PKG.getWorkbenchComponent_Properties())
-		});
-		return result;
-	}
-	private static Translator createModuleTypeTranslator(EStructuralFeature afeature) {
-		GenericTranslator result = new GenericTranslator(MODULE_TYPE, afeature);
-		result.setChildren(new Translator[] {			
-			new Translator(COMPONENT_TYPE_ID, MODULE_CORE_PKG.getComponentType_ComponentTypeId(), DOM_ATTRIBUTE),
-			new Translator(META_RESOURCES, MODULE_CORE_PKG.getComponentType_MetadataResources()),
-			new Translator(COMPONENT_TYPE_VERSION, MODULE_CORE_PKG.getComponentType_Version()),
-			createPropertiesTranslator(MODULE_CORE_PKG.getComponentType_Properties())
-			
-		});
-		return result;
-	}
-	
-	private static Translator createPropertiesTranslator(EStructuralFeature afeature){
-		GenericTranslator result = new GenericTranslator(PROPERTY, afeature);
-		result.setChildren(new Translator[] {
-			new Translator(PROPERTY_NAME, MODULE_CORE_PKG.getProperty_Name(), DOM_ATTRIBUTE ),
-			new Translator(PROPERTY_VALUE, MODULE_CORE_PKG.getProperty_Value(), DOM_ATTRIBUTE ),
-	
-		});
-		return result;		
-	}
-	
-	
-	private static Translator createDependentModuleTranslator(EStructuralFeature afeature) {
-		GenericTranslator result = new GenericTranslator(REFERENCED_COMPONENT, afeature);
-		result.setChildren(new Translator[] { 
-			new IPathTranslator(RUNTIME_PATH, MODULE_CORE_PKG.getReferencedComponent_RuntimePath(), DOM_ATTRIBUTE),
-			new URITranslator(HANDLE, MODULE_CORE_PKG.getReferencedComponent_Handle(), DOM_ATTRIBUTE),
-			new HRefTranslator(DEP_OBJECT,MODULE_CORE_PKG.getReferencedComponent_DependentObject()),
-			new DependencyTypeTranslator()
-		});
-		return result;
-	}
-
-
-	private static Translator createWBResourceTranslator(EStructuralFeature afeature) {
-		GenericTranslator result = new GenericTranslator(COMPONENT_RESOURCE, afeature);
-		result.setChildren(new Translator[] {
-			IDTranslator.INSTANCE,
-			new IPathTranslator(SOURCE_PATH, MODULE_CORE_PKG.getComponentResource_SourcePath(), DOM_ATTRIBUTE),
-			new IPathTranslator(RUNTIME_PATH, MODULE_CORE_PKG.getComponentResource_RuntimePath(), DOM_ATTRIBUTE),
-			new Translator(RESOURCE_TYPE, MODULE_CORE_PKG.getComponentResource_ResourceType(), DOM_ATTRIBUTE),
-			new Translator(EXCLUSIONS, MODULE_CORE_PKG.getComponentResource_Exclusions())
-		});
-		return result;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/WTPModulesXmlMapperI.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/WTPModulesXmlMapperI.java
deleted file mode 100644
index cc3ee7a..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/WTPModulesXmlMapperI.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.util;
-
-public interface WTPModulesXmlMapperI {
-	String PROJECT_MODULES = "project-modules";//$NON-NLS-1$  
-	String WORKBENCH_COMPONENT = "wb-module";//$NON-NLS-1$
-	String REFERENCED_COMPONENT = "dependent-module";//$NON-NLS-1$
-	String COMPONENT_RESOURCE = "wb-resource"; //$NON-NLS-1$
-	String MODULE_TYPE = "module-type";//$NON-NLS-1$ 
-	String META_RESOURCES = "meta-resources";//$NON-NLS-1$ 
-	String COMPONENT_TYPE_VERSION = "version";//$NON-NLS-1$ 
-	String HANDLE = "handle";//$NON-NLS-1$
-	String DEP_OBJECT = "dependent-object";//$NON-NLS-1$ 
-	String OBJECTREF = "href";//$NON-NLS-1$
-	String DEPENDENCY_TYPE = "dependency-type";//$NON-NLS-1$
-	String SOURCE_PATH = "source-path"; //$NON-NLS-1$
-	String RUNTIME_PATH = "deploy-path"; //$NON-NLS-1$
-	String EXCLUSIONS = "exclusions";//$NON-NLS-1$  
-	String COMPONENT_TYPE_ID = "module-type-id"; //$NON-NLS-1$
-	String RUNTIME_NAME = "deploy-name"; //$NON-NLS-1$
-	String PROPERTY = "property"; //$NON-NLS-1$
-	String PROPERTY_NAME = "name";//$NON-NLS-1$
-	String PROPERTY_VALUE = "value";//$NON-NLS-1$
-	String RESOURCE_TYPE = "resource-type";//$NON-NLS-1$
-	
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ZipFileExporter.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ZipFileExporter.java
deleted file mode 100644
index 7be0c31..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ZipFileExporter.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.util;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.zip.CRC32;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipOutputStream;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Path;
-
-/**
- * Exports resources to a .zip file
- */
-public class ZipFileExporter {
-	private ZipOutputStream outputStream;
-	private StringBuffer manifestContents;
-
-	private boolean useCompression = true;
-
-	/**
-	 * Create an instance of this class.
-	 * 
-	 * @param filename
-	 *            java.lang.String
-	 * @param compress
-	 *            boolean
-	 * @param includeManifestFile
-	 *            boolean
-	 * @exception java.io.IOException
-	 */
-	public ZipFileExporter(String filename, boolean compress) throws IOException {
-		Path directoryPath = new Path(filename);
-		directoryPath = (Path) directoryPath.removeLastSegments(1);
-		File newZipFile = new File(directoryPath.toString());
-		newZipFile.mkdirs();
-		outputStream = new ZipOutputStream(new FileOutputStream(filename));
-		useCompression = compress;
-	}
-
-	/**
-	 * Do all required cleanup now that we're finished with the currently-open .zip
-	 * 
-	 * @exception java.io.IOException
-	 */
-	public void finished() throws IOException {
-		outputStream.close();
-	}
-
-	/**
-	 * Create a new ZipEntry with the passed pathname and contents, and write it to the current
-	 * archive
-	 * 
-	 * @param pathname
-	 *            java.lang.String
-	 * @param contents
-	 *            byte[]
-	 * @exception java.io.IOException
-	 */
-	protected void write(String pathname, byte[] contents) throws IOException {
-		ZipEntry newEntry = new ZipEntry(pathname);
-
-		// if the contents are being compressed then we get the below for free.
-		if (!useCompression) {
-			newEntry.setMethod(ZipEntry.STORED);
-			newEntry.setSize(contents.length);
-			CRC32 checksumCalculator = new CRC32();
-			checksumCalculator.update(contents);
-			newEntry.setCrc(checksumCalculator.getValue());
-		}
-
-		outputStream.putNextEntry(newEntry);
-		outputStream.write(contents);
-		outputStream.closeEntry();
-	}
-
-	public void writeFolder(String destinationPath) throws IOException {
-		if (!destinationPath.endsWith("/"))
-			destinationPath = destinationPath + '/';
-		ZipEntry newEntry = new ZipEntry(destinationPath);
-		outputStream.putNextEntry(newEntry);
-		outputStream.closeEntry();
-	}
-
-	/**
-	 * Write the passed resource to the current archive
-	 * 
-	 * @param resource
-	 *            org.eclipse.core.resources.IFile
-	 * @param destinationPath
-	 *            java.lang.String
-	 * @exception java.io.IOException
-	 * @exception org.eclipse.core.runtime.CoreException
-	 */
-	public void write(IFile resource, String destinationPath) throws IOException, CoreException {
-		InputStream contentStream = null;
-		try {
-			contentStream = resource.getContents(false);
-			write(contentStream, destinationPath);
-		} finally {
-			if (contentStream != null)
-				contentStream.close();
-		}
-	}
-
-	public void write(InputStream contentStream, String destinationPath) throws IOException, CoreException {
-		ByteArrayOutputStream output = null;
-
-		try {
-			output = new ByteArrayOutputStream();
-			int chunkSize = contentStream.available();
-			byte[] readBuffer = new byte[chunkSize];
-			int n = contentStream.read(readBuffer);
-
-			while (n > 0) {
-				output.write(readBuffer);
-				n = contentStream.read(readBuffer);
-			}
-		} finally {
-			if (output != null)
-				output.close();
-		}
-
-		write(destinationPath, output.toByteArray());
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/package.html b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/package.html
deleted file mode 100644
index 9c904da..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/package.html
+++ /dev/null
@@ -1,368 +0,0 @@
-<html>
-<head>
-<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-<link rel="stylesheet" href="../../../../..//apistyles.css" type="text/css">
-<title>modulecore api overview</title>
-</head>
-<body>
-<p>
-        The ComponentCore API allows clients to work with the Structural 
-        Metamodels that define abstract modules within Eclipse projects. 
-        These metamodels are exposed through the Virtual Path API layer 
-        (see <a href="ComponentCore.html">ComponentCore</a>). Clients 
-        should also review the <b>org.eclipse.wst.common.componentcore.resources</b>
-        package.
-		</p>
-<a name="top"></a>
-<table width="500">
-<tr>
-<td>
-<p>
-			The following document includes information on these topics:
-			<ul>
-				
-<li>
-<a href="#structural-metamodel">ComponentCore Metamodel (CCM)</a> 
-					used to understand which files should or should not be 
-					included within a module.</li> 
-				
-<li>
-<a href="#constraints">Constraints</a> enforced by the 
-					design</li> 
-				
-<li>
-<a href="#module-core-examples">The API entry-point</a>
-</li>
-			
-</ul>
-		
-</p>
-</td>
-</tr>
-</table>
-<a name="structural-metamodel"></a>
-<table width="100%" cellspacing="5" cellpadding="2" border="0">
-<tbody>
-<tr>
-<td valign="top" bgcolor="#0080c0" align="left" colspan="2"><b><font face="Arial,Helvetica" color="#ffffff">ComponentCore Metamodel (CCM)</font></b></td>
-</tr>
-</tbody>
-</table>
-<BR>
-<table width="500">
-<tr>
-<td>
-<p>
-            The ComponentCore Metamodel (CCM) is an EMF model that allows 
-			the tooling to understand most project structures. Each project 
-			has a single CCM which is stored under the project root named
-            <I>.wtpmodules</I>
-            . The XML format is defined by the 
-            <a href="../../../../../overview/componentCore.xsd">ComponentCore schema</a>.
-            The following diagram is a UML representation of the 
-			ComponentCore Metamodel. This information is published for 
-			potential contributors of editors, but the EMF model is 
-			not exposed directly as API, and could change in view of 
-			changes for WTP 1.1.
-		</p>
-</td>
-</tr>
-</table>
-<table cellpadding="10" cellspacing="10">
-<tr>
-<td>
-<p>
-<img src="../../../../../overview/componentcore_model.jpg"></p>
-</td>
-</tr>
-<tr>
-<td>
-<p>
-<i>Figure 1: The Component Core Metamodel</i>
-</p>
-</td>
-</tr>
-</table>
-<table width="500">
-<tr>
-<td>
-<p>
-            Each logical component contained in the project is represented by a
-            <b>WorkbenchComponent</b> element. The <b>WorkbenchComponent</b> defines 
-            information about the type of component, the resources consumed by the 
-            module from the project, and the referenced components. The 
-            <b>WorkbenchComponent</b> is very generic, and as modeled, does 
-            not necessarily correspond to only J2EE artifacts.
-        </p>
-</td>
-</tr>
-</table>
-<table width="500">
-<tr>
-<td>
-<p>
-            The <b>WorkbenchComponent</b> has a
-            <i>name</i>
-            , which is the name that will be used when the runtime form of the
-            component is constructed. For a web application, the
-            <i>name</i>
-            might be "MyWebApplication".
-        </p>
-</td>
-</tr>
-</table>
-<table width="500">
-<tr>
-<td>
-<p>
-            The <b>WorkbenchComponent</b> may be uniquely referenced by a URI. The 
-            fully qualified URI to any component must begin with the component
-            protocol ("component:"), specify a subprotocol ("resource|classpath") and
-            then a path to the referenced component. A <b>WorkbenchComponent</b> with the
-            name "MyWebApplication" defined in a project named
-            "MyWebModulesProject" would be referenced by the following URI:
-            "component:/resource/MyWebModulesProject/MyWebApplication". As a future 
-            extension, a component referenced on the classpath of a project (perhaps 
-            a Utility Jar or an EJB Client Jar), the URI might be something like:
-            "component:/classpath/MyWebModulesProject/CustomerEJBClient.jar". 
-        </p>
-</td>
-</tr>
-</table>
-<table width="500">
-<tr>
-<td>
-<p>
-            The <b>WorkbenchComponent</b> has a <b>ComponentType</b>. The 
-            <b>ComponentType</b> defines a <i>componentTypeId</i>
-            , which indicates the specific kind of component. The Web Tools Platform
-            uses the <i>componentTypeId</i>
-            to determine how to work with the content component of the <b>WorkbenchComponent</b>
-            and prepare the component for deployment. The <b>ComponentType</b> may 
-            also define the runtime-paths of special metadata resources which are 
-            important to the <b>WorkbenchComponent</b>. "Metadata" refers to resources 
-            which explain the content details of the specific modules. An example of 
-            such a file would be the "WEB-INF/web.xml" deployment descriptor for 
-            Web Applications.
-        </p>
-</td>
-</tr>
-</table>
-<table width="500">
-<tr>
-<td>
-<p>
-            The <b>WorkbenchComponent</b> contains a list of ComponentResources. Each
-            <b>ComponentResource</b> has "sourcePath" and a corresponding
-            "runtimePath". The "sourcePath" can reference either a file or folder,
-            but the referenced resource must be contained in the same project as the
-            <b>WorkbenchComponent</b> definition. The "runtimePath" specifies a location
-            relative to the deployed structure of the <b>WorkbenchComponent</b> where the
-            contents of the referenced resource will be represented when the module is
-            prepared for runtime.
-        </p>
-</td>
-</tr>
-</table>
-<table width="500">
-<tr>
-<td>
-<p>
-            The <b>WorkbenchComponent</b> contains a list of <b>ReferencedComponent</b>s. 
-            Each <b>ReferencedComponent</b> provides a handle that must resolve to a 
-            <b>WorkbenchComponent</b>, a runtimePath that defines where the constructed 
-            component will be placed within the context of the runtime 
-            <b>WorkbenchComponent</b>, and a <b>DependencyType</b>
-            that can be either "consume" or "use" to indicate how the contents of
-            that <b>ReferencedComponent</b> should be absorbed by the <b>WorkbenchComponent</b>.
-            <b>ReferencedComponent</b>s may reference <b>WorkbenchComponent</b>s in 
-            other projects and on current project's classpath (Not yet implemented). 
-            The <b>DependencyType</b> will determine whether the contents of
-            the <b>ReferencedComponent</b> are absorbed as-is or archived into a *.{w|j|e}ar
-            file.
-        </p>
-</td>
-</tr>
-</table>
-<table width="500">
-<tr>
-<td>
-<p>
-            The <b>ProjectComponents</b> object provides a root container for all
-            <b>WorkbenchComponent</b>s defined in a given project.
-        </p>
-</td>
-</tr>
-</table>
-<table width="500">
-<tr>
-<td>
-<p>
-            
-<b>ComponentCore</b> provides a facade to manage the underlying model for
-            clients. Static methods
-            <code>ModuleCore.getModuleCoreForRead()</code>
-            and
-            <code>ModuleCore.getModuleCoreForWrite()</code>
-            may be used to acquire an ModuleCore adapter, and clients are responsible
-            for invoking
-            <code>dispose()</code>
-            whenever they are finished using the model.
-        </p>
-</td>
-</tr>
-</table>
-<a href="#top">top</a><a name="constraints"></a>
-<table width="100%" cellspacing="5" cellpadding="2" border="0">
-<tbody>
-<tr>
-<td valign="top" bgcolor="#0080c0" align="left" colspan="2"><b><font face="Arial,Helvetica" color="#ffffff">Constraints enforced by the CCM</font></b></td>
-</tr>
-</tbody>
-</table>
-<table width="500">
-<tr>
-<td>
-<p>
-            The following constraints are enforced by the model:
-            <ol>
-                
-<li>
-                    
-<p>
-                        The solution will not check dependencies for components that are
-                        contained in the same project. To get the full benefits of
-                        inter-component dependency checking, components must be separated
-                        into different projects. We do not have the necessary
-                        flexibility in constructing and scoping classpaths on a level
-                        more granular than the project level, which would be needed
-                        to support this functionality.
-                    </p>
-                
-</li>
-                
-<li>
-                    
-<p>
-                        The solution will not allow a single component to span more than
-                        one project. Within that project, we will have fairly broad
-                        flexibility to specify which resources map to which components.
-                        Each component within a project must have its own source folder,
-                        but a component may contain more than one source folder. Each
-                        source folder may be contained by at most one component. Components
-                        may reference dependent components in other projects (so a Web
-                        Application may reference a Web Library outside of the
-                        project that contains the Web Application).
-                    </p>
-                
-</li>
-                
-<li>
-                    
-<p>
-                        The solution will not allow more than one server target per
-                        component (and really per-project) at a time. The ability to
-                        switch this server target (via some action or property
-                        setting) will continue to be possible. Users that need the
-                        capability to develop for multiple server targets will need
-                        to manually switch and test as necessary.
-                    </p>
-                
-</li>
-                
-<li>
-                    
-<p>
-                        Each component in a project may have its own output folder
-                        structure automatically constructed for it. The output
-                        structure will match the J2EE specification output structure
-                        required for the component type (for J2EE modules). A new
-                        builder will handle this responsibility and work
-                        cooperatively with the Java builder to construct a
-                        deployable, on-disk representation of the module structure.
-                        The reference implementation will follow this pattern, but 
-                        hooks will be made available to vary this behavior.
-                        The necessity for this on-disk structure to match a
-                        J2EE-compliant layout is motivated by the requirement to have
-                        in-workbench testing, so that users will not have to deal
-                        with a deployer actually constructing a deployable module and
-                        shipping it off to a server to test their code. This approach
-                        is consistent with existing Ant-based approaches and
-                        Application Servers which can run in a "debug" mode on disk.
-                        Our value-add will be greater automation and integration with
-                        the workbench -- particularly for incremental based support.
-                        The specialized module builder would not be necessary if the
-                        source was already in the appropriate J2EE specification
-                        compliant structure. The default creation will still
-                        encourage a single module per project, which conforms to the
-                        correct J2EE structure.
-                    </p>
-                
-</li>
-                
-<li>
-                    
-<p>
-                        Components will be described using a simple XML format, and each
-                        project will contain one
-                        <I>.wtpmodules</I>
-                        file that will describe all of the components for that project.
-                        The level of tooling to help users create these files is yet
-                        to be determined for WTP M4. This would be a great area for
-                        other interested developers to suggest and provide tooling
-                        (e.g. a Wizard or Editor) to create these files from existing
-                        structures. A schema is provided to make it easier for
-                        consumers that want to build their own
-                        <I>.wtpmodules</I>
-                        by hand to take advantage of the content assist in the XML
-                        editor.
-                    </p>
-                
-</li>
-            
-</ol>
-        
-</p>
-</td>
-</tr>
-</table>
-<a href="#top">top</a><a name="module-core-examples"></a>
-<table width="100%" cellspacing="5" cellpadding="2" border="0">
-<tbody>
-<tr>
-<td valign="top" bgcolor="#0080c0" align="left" colspan="2"><b><font face="Arial,Helvetica" color="#ffffff">ComponentCore API: Working with the metamodel</font></b></td>
-</tr>
-</tbody>
-</table>
-<BR>
-<table width="500">
-<tr>
-<td>
-<p>
-			ComponentCore uses a handle based model much like the existing Platform 
-			Resource model. The ComponentCore facade is not tied to any project, and 
-			the handles that it returns may or may not exist. The complexity of 
-			managing the underlying EMF model is handled under the cover for users. 
-        </p>
-</td>
-</tr>
-</table>
-<table cellpadding="10" cellspacing="10">
-<tr>
-<td>
-<p>
-<img src="../../../../../overview/componentcore_package.jpg"></p>
-</td>
-</tr>
-<tr>
-<td>
-<p>
-<i>Figure 2: The ComponentCore API</i>
-</p>
-</td>
-</tr>
-</table>
-<a href="#top">top</a>
-</body>
-</html>
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/package.xml b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/package.xml
deleted file mode 100644
index 3b5c004..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/package.xml
+++ /dev/null
@@ -1,331 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<html>
-    <head>
-        <meta
-            name="root"
-            content="../../../../../" />
-        <title>modulecore api overview</title>
-    </head>
-
-    <body>  
-		<abstract>
-        The ComponentCore API allows clients to work with the Structural 
-        Metamodels that define abstract modules within Eclipse projects. 
-        These metamodels are exposed through the Virtual Path API layer 
-        (see <a href="ComponentCore.html">ComponentCore</a>). Clients 
-        should also review the <b>org.eclipse.wst.common.componentcore.resources</b>
-        package.
-		</abstract>
-
-		<a name="top"/>
-		<p>
-			The following document includes information on these topics:
-			<ul>
-				<li><a href="#structural-metamodel">ComponentCore Metamodel (CCM)</a> 
-					used to understand which files should or should not be 
-					included within a module.</li> 
-				<li><a href="#constraints">Constraints</a> enforced by the 
-					design</li> 
-				<li><a href="#module-core-examples">The API entry-point</a></li>
-			</ul>
-		</p>
-		<a name="structural-metamodel"/>
-        <h2>ComponentCore Metamodel (CCM)</h2>
-        <BR /> 
-        <p>
-            The ComponentCore Metamodel (CCM) is an EMF model that allows 
-			the tooling to understand most project structures. Each project 
-			has a single CCM which is stored under the project root named
-            <I>.wtpmodules</I>
-            . The XML format is defined by the 
-            <a href="../../../../../overview/componentCore.xsd">ComponentCore schema</a>.
-            The following diagram is a UML representation of the 
-			ComponentCore Metamodel. This information is published for 
-			potential contributors of editors, but the EMF model is 
-			not exposed directly as API, and could change in view of 
-			changes for WTP 1.1.
-		</p>	  
-		<img src="../../../../../overview/componentcore_model.jpg" caption="The Component Core Metamodel" /> 
-        <p>
-            Each logical component contained in the project is represented by a
-            <b>WorkbenchComponent</b> element. The <b>WorkbenchComponent</b> defines 
-            information about the type of component, the resources consumed by the 
-            module from the project, and the referenced components. The 
-            <b>WorkbenchComponent</b> is very generic, and as modeled, does 
-            not necessarily correspond to only J2EE artifacts.
-        </p>
-        <p>
-            The <b>WorkbenchComponent</b> has a
-            <i>name</i>
-            , which is the name that will be used when the runtime form of the
-            component is constructed. For a web application, the
-            <i>name</i>
-            might be "MyWebApplication".
-        </p>
-        <p>
-            The <b>WorkbenchComponent</b> may be uniquely referenced by a URI. The 
-            fully qualified URI to any component must begin with the component
-            protocol ("component:"), specify a subprotocol ("resource|classpath") and
-            then a path to the referenced component. A <b>WorkbenchComponent</b> with the
-            name "MyWebApplication" defined in a project named
-            "MyWebModulesProject" would be referenced by the following URI:
-            "component:/resource/MyWebModulesProject/MyWebApplication". As a future 
-            extension, a component referenced on the classpath of a project (perhaps 
-            a Utility Jar or an EJB Client Jar), the URI might be something like:
-            "component:/classpath/MyWebModulesProject/CustomerEJBClient.jar". 
-        </p>
-        <p>
-            The <b>WorkbenchComponent</b> has a <b>ComponentType</b>. The 
-            <b>ComponentType</b> defines a <i>componentTypeId</i>
-            , which indicates the specific kind of component. The Web Tools Platform
-            uses the <i>componentTypeId</i>
-            to determine how to work with the content component of the <b>WorkbenchComponent</b>
-            and prepare the component for deployment. The <b>ComponentType</b> may 
-            also define the runtime-paths of special metadata resources which are 
-            important to the <b>WorkbenchComponent</b>. "Metadata" refers to resources 
-            which explain the content details of the specific modules. An example of 
-            such a file would be the "WEB-INF/web.xml" deployment descriptor for 
-            Web Applications.
-        </p>
-        <p>
-            The <b>WorkbenchComponent</b> contains a list of ComponentResources. Each
-            <b>ComponentResource</b> has "sourcePath" and a corresponding
-            "runtimePath". The "sourcePath" can reference either a file or folder,
-            but the referenced resource must be contained in the same project as the
-            <b>WorkbenchComponent</b> definition. The "runtimePath" specifies a location
-            relative to the deployed structure of the <b>WorkbenchComponent</b> where the
-            contents of the referenced resource will be represented when the module is
-            prepared for runtime.
-        </p>
-        <p>
-            The <b>WorkbenchComponent</b> contains a list of <b>ReferencedComponent</b>s. 
-            Each <b>ReferencedComponent</b> provides a handle that must resolve to a 
-            <b>WorkbenchComponent</b>, a runtimePath that defines where the constructed 
-            component will be placed within the context of the runtime 
-            <b>WorkbenchComponent</b>, and a <b>DependencyType</b>
-            that can be either "consume" or "use" to indicate how the contents of
-            that <b>ReferencedComponent</b> should be absorbed by the <b>WorkbenchComponent</b>.
-            <b>ReferencedComponent</b>s may reference <b>WorkbenchComponent</b>s in 
-            other projects and on current project's classpath (Not yet implemented). 
-            The <b>DependencyType</b> will determine whether the contents of
-            the <b>ReferencedComponent</b> are absorbed as-is or archived into a *.{w|j|e}ar
-            file.
-        </p>
-        <p>
-            The <b>ProjectComponents</b> object provides a root container for all
-            <b>WorkbenchComponent</b>s defined in a given project.
-        </p>
-        <p>
-            <b>ComponentCore</b> provides a facade to manage the underlying model for
-            clients. Static methods
-            <code>ModuleCore.getModuleCoreForRead()</code>
-            and
-            <code>ModuleCore.getModuleCoreForWrite()</code>
-            may be used to acquire an ModuleCore adapter, and clients are responsible
-            for invoking
-            <code>dispose()</code>
-            whenever they are finished using the model.
-        </p>  
-		<a href="#top">top</a>
-		<a name="constraints"/>
-        <h2>Constraints enforced by the CCM</h2>
-        <p>
-            The following constraints are enforced by the model:
-            <ol>
-                <li>
-                    <p>
-                        The solution will not check dependencies for components that are
-                        contained in the same project. To get the full benefits of
-                        inter-component dependency checking, components must be separated
-                        into different projects. We do not have the necessary
-                        flexibility in constructing and scoping classpaths on a level
-                        more granular than the project level, which would be needed
-                        to support this functionality.
-                    </p>
-                </li>
-                <li>
-                    <p>
-                        The solution will not allow a single component to span more than
-                        one project. Within that project, we will have fairly broad
-                        flexibility to specify which resources map to which components.
-                        Each component within a project must have its own source folder,
-                        but a component may contain more than one source folder. Each
-                        source folder may be contained by at most one component. Components
-                        may reference dependent components in other projects (so a Web
-                        Application may reference a Web Library outside of the
-                        project that contains the Web Application).
-                    </p>
-                </li>
-                <li>
-                    <p>
-                        The solution will not allow more than one server target per
-                        component (and really per-project) at a time. The ability to
-                        switch this server target (via some action or property
-                        setting) will continue to be possible. Users that need the
-                        capability to develop for multiple server targets will need
-                        to manually switch and test as necessary.
-                    </p>
-                </li>
-                <li>
-                    <p>
-                        Each component in a project may have its own output folder
-                        structure automatically constructed for it. The output
-                        structure will match the J2EE specification output structure
-                        required for the component type (for J2EE modules). A new
-                        builder will handle this responsibility and work
-                        cooperatively with the Java builder to construct a
-                        deployable, on-disk representation of the module structure.
-                        The reference implementation will follow this pattern, but 
-                        hooks will be made available to vary this behavior.
-                        The necessity for this on-disk structure to match a
-                        J2EE-compliant layout is motivated by the requirement to have
-                        in-workbench testing, so that users will not have to deal
-                        with a deployer actually constructing a deployable module and
-                        shipping it off to a server to test their code. This approach
-                        is consistent with existing Ant-based approaches and
-                        Application Servers which can run in a "debug" mode on disk.
-                        Our value-add will be greater automation and integration with
-                        the workbench -- particularly for incremental based support.
-                        The specialized module builder would not be necessary if the
-                        source was already in the appropriate J2EE specification
-                        compliant structure. The default creation will still
-                        encourage a single module per project, which conforms to the
-                        correct J2EE structure.
-                    </p>
-                </li>
-                <li>
-                    <p>
-                        Components will be described using a simple XML format, and each
-                        project will contain one
-                        <I>.wtpmodules</I>
-                        file that will describe all of the components for that project.
-                        The level of tooling to help users create these files is yet
-                        to be determined for WTP M4. This would be a great area for
-                        other interested developers to suggest and provide tooling
-                        (e.g. a Wizard or Editor) to create these files from existing
-                        structures. A schema is provided to make it easier for
-                        consumers that want to build their own
-                        <I>.wtpmodules</I>
-                        by hand to take advantage of the content assist in the XML
-                        editor.
-                    </p>
-                </li>
-            </ol>
-        </p>  
-		<a href="#top">top</a>
-		<a name="module-core-examples"/>
-        <h2>ComponentCore API: Working with the metamodel</h2>
-        <BR />  
-        <p>
-			ComponentCore uses a handle based model much like the existing Platform 
-			Resource model. The ComponentCore facade is not tied to any project, and 
-			the handles that it returns may or may not exist. The complexity of 
-			managing the underlying EMF model is handled under the cover for users. 
-        </p> 
-        <img src="../../../../../overview/componentcore_package.jpg" caption="The ComponentCore API" />  
-        <!--
-        <p>
-            Clients should use one of
-            <code>ModuleCore.getModuleCoreForRead()</code>
-            or
-            <code>ModuleCore.getModuleCoreForWrite()</code>
-            to acquire an instance of ModuleCore.                         
-			<codesnippet caption="Acquiring an instance of ComponentCore for read-only access">
-IProject currentProject = ... 
-ModuleCore moduleCoreInstance = ModuleCore.getModuleCoreForRead(currentProject);
-WorkbenchComponent[] modules = moduleCoreInstance.getWorkbenchComponents(); 
-... work with modules ... 
-moduleCoreInstance.dispose();
-			</codesnippet> 
-        </p>
-        <p>
-            For clients that would like to build up their own models for a given
-            project, or modify the existing metamodel, the ModuleCore instance should
-            be acquired for write-access. 
-        </p>
-		<codesnippet caption="Creating a WorkbenchComponent">            
-...
-import org.eclipse.emf.common.util.URI; 
-...
-
-public static void createWebAppModule(IProject aTargetProject, 
-                      IFolder aJavaSourceFolder, 
-                      IFolder aWebContentFolder, 
-                      IResource aWebAppDeploymentDescriptor, 
-                      IProgressMonitor aProgressMonitor) 
-{
-    ModuleCore moduleCoreInstance = null;
-    try {
-        moduleCoreInstance = 
-            ModuleCore.getModuleCoreForWrite(aTargetProject);
-
-        /* Create a new module that will be 
-            contained by the current ModuleCore */
-        WorkbenchComponent newModule = 
-            moduleCoreInstance.createWorkbenchComponent("MyWebModule.war");
-
-        /* A Java source folder that contains 
-                the classes for the current module */
-        ComponentResource javaSource = 
-            moduleCoreInstance.createComponentResource(
-                                                aJavaSourceFolder);
-        javaSource.setDeployedPath(
-                            URI.createURI("/WEB-INF/classes"));
-        newModule.getResources().add(javaSource);
-
-        /* A resource folder that contains 
-            the *.jsp, *.html, .img, ... files */
-        ComponentResource webContent = 
-            moduleCoreInstance.createComponentResource(
-                                                    aWebContentFolder);
-        webContent.setDeployedPath(URI.createURI("/"));
-        newModule.getResources().add(webContent);
-
-        /* A resource that points to a valid web.xml 
-                file that follows the J2EE Web Deployment
-                Descriptor Specification
-         */
-        ComponentResource deploymentDescriptor = 
-            moduleCoreInstance.createComponentResource(
-                                                aWebAppDeploymentDescriptor);
-        deploymentDescriptor.setDeployedPath(
-                                    URI.createURI("/WEB-INF/web.xml"));
-        newModule.getResources().add(deploymentDescriptor);
-
-        moduleCoreInstance.saveIfNecessary(aProgressMonitor);
-    } finally {
-        if (moduleCoreInstance != null) {
-            moduleCoreInstance.dispose();
-        }
-    }
-}
-		</codesnippet>  
-        <p>
-            For clients that would like to take an existing project an add Flexible
-            Project Support, use the ModuleCoreNature.addModuleCoreIfNecessary() API
-            to prepare the project to support flexible module structures. the
-            existing metamodel, then acquire the ModuleCore instance for modification.
-        </p>
-		<codesnippet caption="Add Flexible Project support to a new or existing project">
-... 
-import org.eclipse.emf.common.util.URI; 
-...
-public static void makeFlexible(IProject aTargetProject) {
-    ModuleCore moduleCoreInstance = null;
-    try {
-        ModuleCoreNature.addModuleCoreNatureIfNecessary(aTargetProject);
-        moduleCoreInstance = ModuleCore.getModuleCoreForWrite(aTargetProject);
-        ... work with moduleCoreInstance and underlying model ...
-        moduleCoreInstance.saveIfNecessary(aProgressMonitor);
-    } finally {
-        if (moduleCoreInstance != null) {
-            moduleCoreInstance.dispose();
-        }
-    }
-}
-		</codesnippet> 
-		-->
-		<a href="#top">top</a>
-    </body>
-</html>    
-    
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualComponent.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualComponent.java
deleted file mode 100644
index d07c71f..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualComponent.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.resources;
-
-import java.util.Properties;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-
-/**
- * Represents a component as defined by the .component file.
- * <p>
- * A component is a container of virtual resources which has other features that describe the
- * component including:
- * 
- * @plannedfor 1.0
- */
-public interface IVirtualComponent extends IAdaptable {
-	
-	IPath ROOT = new Path("/"); //$NON-NLS-1$
-	
-	/**
-	 * Type constant (bit mask value 1) which identifies component binary status.
-	 */
-	public static final int BINARY = 0x1;
-	
-	
-	/**
-	 * The name of the component must be unique within its enclosing project.
-	 * 
-	 * @return The name of the component.
-	 */
-	String getName();
-	
-	/**
-	 * @return The deployed name of the component.
-	 */
-	String getDeployedName();
-
-	/**
-	 * The componentTypeId is used to understand how this component should be edited and deployed.
-	 * Examples include "jst.web" or "jst.utility". The componentTypeId can be set to any value when
-	 * created so long as that value makes sense to the clients. Standard componentTypeIds may be
-	 * available for common component types.
-	 * 
-	 * @return The componentTypeId, a string based identifier that indicates the component
-	 */
-//	String getComponentTypeId();
-	
-	
-	/**
-	 * Returns reference to itself.
-	 * <p>
-	 *  
-	 * @return the name of the component that contains the virtual resource
-	 */
-	public IVirtualComponent getComponent();
-	
-
-	/**
-	 * 
-	 * The componentTypeId is used to understand how this component should be edited and deployed.
-	 * Examples include "jst.web" or "jst.utility". The componentTypeId can be set to any value when
-	 * created so long as that value makes sense to the clients. Standard componentTypeIds may be
-	 * available for common component types.
-	 * 
-	 * @param aComponentTypeId
-	 *            A value which is either standard for a common component type or client-defined for
-	 *            a custom component type
-	 */
-//	void setComponentTypeId(String aComponentTypeId);
-
-	/**
-	 * MetaProperties are String-based name-value pairs that include information about this
-	 * component that may be relevant to clients or the way that clients edit or deploy components.
-	 * 
-	 * @return A by-reference instance of the properties for this component.
-	 */
-	Properties getMetaProperties();
-	
-	/**
-	 * Adds a single property
-	 * @param property
-	 * 		A value which is name, value pair, see ComponentcoreFactory.eINSTANCE.createProperty()
-	 * 		
-	 */
-	void setMetaProperty(String name, String value);
-	
-	/**
-	 * Adds the properties provided as a list
-	 * @param properties
-	 * 			A list of properties
-	 */
-	void setMetaProperties(Properties properties);
-
-	/**
-	 * MetaResources provide a loose mechanism for components that would like to list off the
-	 * metadata-resources available in the component which can aid or expedite searching for this
-	 * resources.
-	 * <p>
-	 * Clients are not required to get or set the MetaResources for a component.
-	 * </p>
-	 * 
-	 * @return A by-value copy of the MetaResources array
-	 * @see #setMetaResources(IPath[])
-	 */
-	IPath[] getMetaResources();
-
-	/**
-	 * 
-	 * MetaResources provide a loose mechanism for components that would like to list off the
-	 * metadata-resources available in the component which can aid or expedite searching for this
-	 * resources.
-	 * <p>
-	 * Clients are not required to get or set the MetaResources for a component. The existing
-	 * MetaResources will be overwritten after the call to this method.
-	 * </p>
-	 * 
-	 * @param theMetaResourcePaths
-	 *            An array of paths that will become the new MetaResource array.
-	 */
-	void setMetaResources(IPath[] theMetaResourcePaths);
-
-
-	/**
-	 * Virtual components may reference other virtual components to build logical dependency trees. 
-	 * <p>
-	 * Each virtual reference will indicate how the content of the reference will be absorbed 
-	 * by this component. Each virtual reference will always specify an enclosing component that will
-	 * be this component.   
-	 * </p>
-	 * @return A by-value copy of the virtual reference array
-	 */
-	IVirtualReference[] getReferences();
-	/**
-	 * Virtual components may reference other virtual components to build logical dependency trees. 
-	 * <p>
-	 * Each virtual reference will indicate how the content of the reference will be absorbed 
-	 * by this component. Each virtual reference will always specify an enclosing component that will
-	 * be this component.   
-	 * </p>
-	 * @return A by-value copy of the virtual reference with given name, or null if none exist matching this name
-	 */
-	IVirtualReference getReference(String aComponentName);
-	
-	/**
-	 * Virtual components may reference other virtual components to build logical dependency trees. 
-	 * <p>
-	 * Each virtual reference will indicate how the content of the reference will be absorbed 
-	 * by this component. Each virtual reference will always specify an enclosing component that will
-	 * be this component. Any references specified in the array which do not specify an enclosing
-	 * component that matches this component will be modified to specify this virtual component. 
-	 * </p>
-	 * <p>
-	 * Existing virtual references will be overwritten when this method is called.
-	 * </p>
-	 * @param theReferences A by-value copy of the virtual reference array
-	 */
-	void setReferences(IVirtualReference[] theReferences);
-	
-	public void addReferences(IVirtualReference[] references);
-	
-	/**
-	 * Returns true if this component is of binary type
-	 * 
-	 * @return The binary status.
-	 */
-	boolean isBinary();		
-	
-	
-	/**
-	 * Create the underlying model elements if they do not already exist. Resources
-	 * may be created as a result of this method if the mapped path does not exist. 
-	 * 
-	 * @param updateFlags Any of IVirtualResource or IResource update flags. If a 
-	 * 			resource must be created, the updateFlags will be supplied to the 
-	 * 			resource creation operation.
-	 * @param aMonitor
-	 * @throws CoreException
-	 */
-	public void create(int updateFlags, IProgressMonitor aMonitor) throws CoreException; 
-	
-	/**
-	 * Returns a handle to the root folder.
-	 * <p> 
-	 * This is a resource handle operation; neither the container
-	 * nor the result need exist in the workspace.
-	 * The validation check on the resource name/path is not done
-	 * when the resource handle is constructed; rather, it is done
-	 * automatically as the resource is created.
-	 * </p>
-	 *
-	 * @param name the string name of the member folder
-	 * @return the (handle of the) member folder
-	 */
-	public IVirtualFolder getRootFolder();
-	
-	/**
-	 * Returns the project which contains the component. 
-	 * <p>
-	 * The name of the project may not (and most likely will not) be referenced in the 
-	 * runtime path of this virtual path, but will be referenced by the workspace-relative path. 
-	 * </p>
-	 * <p>
-	 * This is a resource handle operation; neither the resource nor the resulting project need
-	 * exist.
-	 * </p>
-	 * 
-	 * @return the project handle
-	 */
-	public IProject getProject();
-	
-	/**
-	 * Returns whether this component is backed by an accessible Component. 
-	 */
-	public boolean exists();
-	
-	/**
-	 * Returns the components which reference this component.  This is only a one layer
-	 * deep search algorithm.
-	 * 
-	 * @return array of IVirtualComponents
-	 */
-	public IVirtualComponent[] getReferencingComponents();
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualContainer.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualContainer.java
deleted file mode 100644
index c2411ad..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualContainer.java
+++ /dev/null
@@ -1,283 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.resources;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-/**
- * Represents a component as defined by the WTP Modules file. A 
- * virtual container represents the root of the component. 
- * <p>
- * Virtual containers can provide handles to virtual files and 
- * virtual folders that it contains. 
- * </p>
- * <p>
- * To acquire a handle to a component, use the following snippet:<br> 
- * <code>ModuleCore.createContainer(containingProject, componentName)</code>
- * which will create a handle to a virtual container contained by 
- * <i>containingProject</i> with the name <i>componentName</i>. If the 
- * a component of the given name exists, then 
- * {@link org.eclipse.wst.common.componentcore.resources.IVirtualResource#exists()}
- * will return true. Otherwise, use {@link #create(int, IProgressMonitor)} to 
- * create the relevant model elements. If a client needs to add a 
- * mapping from a folder in the same project to root, use 
- * {@link #createLink(IPath, int, IProgressMonitor)} with a 
- * project-relative path. 
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * @plannedfor 1.0
- */
-public interface IVirtualContainer extends IVirtualResource {  
-
-	
-	/**
-	 * Create the underlying model elements if they do not already exist. Resources
-	 * may be created as a result of this method if the mapped path does not exist. 
-	 * 
-	 * @param updateFlags Any of IVirtualResource or IResource update flags. If a 
-	 * 			resource must be created, the updateFlags will be supplied to the 
-	 * 			resource creation operation.
-	 * @param aMonitor
-	 * @throws CoreException
-	 */
-	public void create(int updateFlags, IProgressMonitor aMonitor) throws CoreException; 
- 
- 
-	/**
-	 * Returns whether a virtual resource of some type with the given path 
-	 * exists relative to this resource.
-	 * The supplied path may be absolute or relative; in either case, it is
-	 * interpreted as relative to this resource.  Trailing separators are ignored.
-	 * If the path is empty this container is checked for existence.
-	 *
-	 * @param path the path of the resource
-	 * @return <code>true</code> if a resource of some type with the given path 
-	 *     exists relative to this resource, and <code>false</code> otherwise
-	 * @see IVirtualResource#exists()
-	 */
-	public boolean exists(IPath path);
-
-	/**
-	 * Finds and returns the member virtual resource (folder or file)
-	 * with the given name in this container, or <code>null</code> if no such
-	 * resource exists.
-	 * 
-	 *
-	 * @param name the string name of the member resource
-	 * @return the member resource, or <code>null</code> if no such
-	 * 		resource exists
-	 */
-	public IVirtualResource findMember(String name);
-
-	/**
-	 * Finds and returns the member resource (folder, or file)
-	 * with the given name in this container, or <code>null</code> if 
-	 * there is no such resource.
-	 * <p>
-	 * If the <code>includePhantoms</code> argument is <code>false</code>, 
-	 * only a member resource with the given name that exists will be returned.
-	 * If the <code>includePhantoms</code> argument is <code>true</code>,
-	 * the method also returns a resource if the workspace is keeping track of a
-	 * phantom with that name.
-	 * </p>
-	 * <p>
-	 * Note that no attempt is made to exclude team-private member resources
-	 * as with <code>members</code>.
-	 * </p>
-	 *
-	 * @param name the string name of the member resource
-	 * @param includePhantoms <code>true</code> if phantom resources are
-	 *   of interest; <code>false</code> if phantom resources are not of
-	 *   interest
-	 * @return the member resource, or <code>null</code> if no such
-	 * 		resource exists
-	 * @see #members()
-	 * @see IVirtualResource#isPhantom()
-	 */
-	public IVirtualResource findMember(String name, int searchFlags);
-
-	/**
-	 * Finds and returns the member resource identified by the given path in
-	 * this container, or <code>null</code> if no such resource exists.
-	 * The supplied path may be absolute or relative; in either case, it is
-	 * interpreted as relative to this resource.   Trailing separators and the path's
-	 * device are ignored. If the path is empty this container is returned.  
-	 *
-	 * @param path the path of the desired resource
-	 * @return the member resource, or <code>null</code> if no such
-	 * 		resource exists
-	 */
-	public IVirtualResource findMember(IPath path);
-
-	/**
-	 * Finds and returns the member resource identified by the given path in
-	 * this container, or <code>null</code> if there is no such resource.
-	 * The supplied path may be absolute or relative; in either case, it is
-	 * interpreted as relative to this resource.  Trailing separators and the path's
-	 * device are ignored.
-	 * If the path is empty this container is returned. 
-	 *
-	 * @param path the path of the desired resource
-	 * @param includePhantoms <code>true</code> if phantom resources are
-	 *   of interest; <code>false</code> if phantom resources are not of
-	 *   interest
-	 * @return the member resource, or <code>null</code> if no such
-	 * 		resource exists
-	 * @see #members(boolean)
-	 * @see IVirtualResource#isPhantom()
-	 */
-	public IVirtualResource findMember(IPath path, int searchFlags); 
-
-	/**
-	 * Returns a handle to the file identified by the given path in this
-	 * container.
-	 * <p> 
-	 * This is a resource handle operation; neither the resource nor
-	 * the result need exist in the workspace.
-	 * The validation check on the resource name/path is not done
-	 * when the resource handle is constructed; rather, it is done
-	 * automatically as the resource is created.
-	 * <p>
-	 * The supplied path may be absolute or relative; in either case, it is
-	 * interpreted as relative to this resource and is appended
-	 * to this container's full path to form the full path of the resultant resource.
-	 * A trailing separator is ignored. The path of the resulting resource must 
-	 * have at least two segments.
-	 * </p>
-	 *
-	 * @param path the path of the member file
-	 * @return the (handle of the) member file
-	 * @see #getFolder(IPath)
-	 */
-	public IVirtualFile getFile(IPath path);
-
-	/**
-	 * Returns a handle to the folder identified by the given path in this
-	 * container.
-	 * <p> 
-	 * This is a resource handle operation; neither the resource nor
-	 * the result need exist in the workspace.
-	 * The validation check on the resource name/path is not done
-	 * when the resource handle is constructed; rather, it is done
-	 * automatically as the resource is created. 
-	 * <p>
-	 * The supplied path may be absolute or relative; in either case, it is
-	 * interpreted as relative to this resource and is appended
-	 * to this container's full path to form the full path of the resultant resource.
-	 * A trailing separator is ignored. The path of the resulting resource must
-	 * have at least two segments.
-	 * </p>
-	 *
-	 * @param path the path of the member folder
-	 * @return the (handle of the) member folder
-	 * @see #getFile(IPath)
-	 */
-	public IVirtualFolder getFolder(IPath path); 
-
-	/**
-	 * Returns a handle to the file with the given name in this folder.
-	 * <p> 
-	 * This is a resource handle operation; neither the resource nor
-	 * the result need exist in the workspace.
-	 * The validation check on the resource name/path is not done
-	 * when the resource handle is constructed; rather, it is done
-	 * automatically as the resource is created.
-	 * </p>
-	 *
-	 * @param name the string name of the member file
-	 * @return the (handle of the) member file
-	 * @see #getFolder(String)
-	 */
-	public IVirtualFile getFile(String name);
-
-	/**
-	 * Returns a handle to the folder with the given name in this folder.
-	 * <p> 
-	 * This is a resource handle operation; neither the container
-	 * nor the result need exist in the workspace.
-	 * The validation check on the resource name/path is not done
-	 * when the resource handle is constructed; rather, it is done
-	 * automatically as the resource is created.
-	 * </p>
-	 *
-	 * @param name the string name of the member folder
-	 * @return the (handle of the) member folder
-	 * @see #getFile(String)
-	 */
-	public IVirtualFolder getFolder(String name);
-
-	/**
-	 * Returns a list of existing member resources (projects, folders and files)
-	 * in this resource, in no particular order.
-	 * <p>
-	 * This is a convenience method, fully equivalent to <code>members(IVirtualResource.NONE)</code>.
-	 * Team-private member resources are <b>not</b> included in the result.
-	 * </p><p>
-	 * Note that the members of a project or folder are the files and folders
-	 * immediately contained within it.  The members of the workspace root
-	 * are the projects in the workspace.
-	 * </p>
-	 *
-	 * @return an array of members of this resource
-	 * @exception CoreException if this request fails. Reasons include:
-	 * <ul>
-	 * <li> This resource does not exist.</li>
-	 * <li> This resource is a project that is not open.</li>
-	 * </ul>
-	 * @see #findMember(IPath)
-	 * @see IVirtualResource#isAccessible()
-	 */
-	public IVirtualResource[] members() throws CoreException;
-
-	/**
-	 * Returns a list of all member resources (projects, folders and files)
-	 * in this resource, in no particular order.
-	 * <p>
-	 * If the <code>INCLUDE_PHANTOMS</code> flag is not specified in the member 
-	 * flags (recommended), only member resources that exist will be returned.
-	 * If the <code>INCLUDE_PHANTOMS</code> flag is specified,
-	 * the result will also include any phantom member resources the
-	 * workspace is keeping track of.
-	 * </p><p>
-	 * If the <code>INCLUDE_TEAM_PRIVATE_MEMBERS</code> flag is specified 
-	 * in the member flags, team private members will be included along with
-	 * the others. If the <code>INCLUDE_TEAM_PRIVATE_MEMBERS</code> flag
-	 * is not specified (recommended), the result will omit any team private
-	 * member resources.
-	 * </p>
-	 * <p>
-	 * If the <code>EXCLUDE_DERIVED</code> flag is not specified, derived 
-	 * resources are included. If the <code>EXCLUDE_DERIVED</code> flag is 
-	 * specified in the member flags, derived resources are not included.
-	 * </p>
-	 *
-	 * @param memberFlags bit-wise or of member flag constants
-	 *   (<code>INCLUDE_PHANTOMS</code>, <code>INCLUDE_TEAM_PRIVATE_MEMBERS</code>
-	 *   and <code>EXCLUDE_DERIVED</code>) indicating which members are of interest
-	 * @return an array of members of this resource
-	 * @exception CoreException if this request fails. Reasons include:
-	 * <ul>
-	 * <li> This resource does not exist.</li>
-	 * <li> the <code>INCLUDE_PHANTOMS</code> flag is not specified and
-	 *     this resource does not exist.</li>
-	 * <li> the <code>INCLUDE_PHANTOMS</code> flag is not specified and
-	 *     this resource is a project that is not open.</li>
-	 * </ul>
-	 * @see IVirtualResource#exists()
-	 * @plannedfor 2.0
-	 */
-	public IVirtualResource[] members(int memberFlags) throws CoreException;
-	
-	public IVirtualResource[] getResources(String aResourceType);	
-}
- 
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualFile.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualFile.java
deleted file mode 100644
index c5d4440..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualFile.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.resources;
-
-import org.eclipse.core.resources.IFile;
-/**
- * Represents a file that can be navigated through 
- * an abstract ("virtual") path. 
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * @plannedfor 1.0
- */
-public interface IVirtualFile extends IVirtualResource {  
-	/**
-	 * returns the underlying IFile, returns first IFile if multiple exist.
-	 * 
-	 * @return the underlying IFile
-	 */
-	public IFile getUnderlyingFile();
-	/**
-	 * returns the array of underlying IFiles that are mapped to the same runtime path.
-	 * 
-	 * @return the array of underlying IFiles mapped to the runtime path
-	 */
-	public IFile[] getUnderlyingFiles();
-	
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualFolder.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualFolder.java
deleted file mode 100644
index 3519e84..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualFolder.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.resources;
-
-import org.eclipse.core.resources.IContainer;
-/**
- * Represents a folder that can be navigated through 
- * an abstract ("virtual") path.
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * @plannedfor 1.0
- */
-public interface IVirtualFolder extends IVirtualContainer { 
-	/**
-	 * returns the underlying IFolder mapped to the runtime path, 
-	 * returns first IFolder if multiple exist.
-	 * 
-	 * @return the underlying IFolder
-	 */
-	public IContainer getUnderlyingFolder();
-	/**
-	 * returns the underlying IFolders mapped to the runtime path. 
-	 * Multiple IFolders can be mapped to the same runtime path.
-	 * 
-	 * @return the array of underlying IFolders
-	 */
-	public IContainer[] getUnderlyingFolders();
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualReference.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualReference.java
deleted file mode 100644
index 688cf12..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualReference.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.resources;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.wst.common.componentcore.internal.DependencyType;
-
-/**
- * Represents a dependency between two components: EnclosingComponent->ReferencedComponent. 
- * <p>
- * The ReferencedComponent may exist in another project or as a binary form on the classpath 
- * of the project.
- * </p>
- * @plannedfor 1.0
- */
-public interface IVirtualReference {
-	
-	/**
-	 * Indicates that the dependency should be archived into a *.?ar format before being absorbed.
-	 */
-	int DEPENDENCY_TYPE_USES = DependencyType.USES;
-	/**
-	 * Indicates that the dependency will be absorbed as is without archiving. 
-	 */
-	int DEPENDENCY_TYPE_CONSUMES = DependencyType.CONSUMES;
-	
-	/**
-	 * Creates this virtual reference in model, if it doesn't already exist.
-	 * @param updateFlags Currently no update flags apply. 
-	 * @param aMonitor A progress monitor to track the completion of the operation
-	 */
-	public void create(int updateFlags, IProgressMonitor aMonitor);
-	
-	/**
-	 * Returns whether this reference actual exists in the model
-	 * @return whether this reference actual exists in the model
-	 */
-	public boolean exists();
-	
-	/**
-	 * The runtime path indicates where the contents of the referenced
-	 * component will be absorbed within the context of the enclosing component.
-	 * @param aRuntimePath A value component-relative path. 
-	 */
-	public void setRuntimePath(IPath aRuntimePath);
-	/**
-	 * The runtime path indicates where the contents of the referenced
-	 * component will be absorbed within the context of the enclosing component.
-	 * @return A value component-relative path. 
-	 */
-	public IPath getRuntimePath();
-	
-	/**
-	 * The dependencyType indicates how the contents of the referenced component will be absorbed.
-	 * @param aDependencyType One of DEPENDENCY_TYPE_USES or DEPENDENCY_TYPE_CONSUMES
-	 * @see #DEPENDENCY_TYPE_CONSUMES
-	 * @see #DEPENDENCY_TYPE_USES
-	 */
-	public void setDependencyType(int aDependencyType);
-	
-
-	/**
-	 * @return One of DEPENDENCY_TYPE_USES or DEPENDENCY_TYPE_CONSUMES
-	 * @see #DEPENDENCY_TYPE_CONSUMES
-	 * @see #DEPENDENCY_TYPE_USES
-	 */
-	public int getDependencyType();
-	
-	/**
-	 * The enclosing component contains this reference, and will absorb the contents of the referenced component
-	 * @return The enclosing component
-	 */
-	public IVirtualComponent getEnclosingComponent();
-	
-	/**
-	 * The referenced component is "targeted" by the reference, and will be absorbed by the enclosing component. 
-	 * @return the referenced component.
-	 */
-	public IVirtualComponent getReferencedComponent();
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualResource.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualResource.java
deleted file mode 100644
index eee8e16..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualResource.java
+++ /dev/null
@@ -1,405 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.resources;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-
-
-/**
- * <p>
- * Allows clients to work with flexible project structures 
- * using API similar to the Eclipse Platform IResource model.
- * </p>
- * <p>
- * IVirtualResource allows resources to be accessed through a
- * abstract path referred to as a "runtime path". 
- * A virtual resource may represent multiple underlying resources.
- * A virtual resource is contained by exactly one component.
- * A resource may be represented by multiple virtual resources, which
- * may be contained by one or more components. 
- * </p>
- * <p>
- * IVirtualResource allows clients to acquire
- * information about the underlying resource including the name, 
- * and the paths which are relevant to the current resource, such
- * as the {@link #getRuntimePath() runtime path}, the 
- * {@link #getWorkspaceRelativePath() workspace-relative path}
- * of the underlying resource, and the 
- * {@link #getProjectRelativePath() project-relative path}
- * of the underlying resource.
- * </p>
- * <a name="references" />
- * <p>Each IVirtualResource can represent an <b>implicit</b> reference or
- * an <b>explicit</b> reference. An <b>explicit</b> reference is a formal
- * mapping from some path within the file structure to a runtime path. Changing
- * or removing an explicit reference only requires model modifications. An 
- * <b>implicit</b> reference has a root which is derived from an explicit path,
- * but some fragment of the path towards the end is derived from the literal 
- * path within the file structure. Modifications to implicit paths may cause 
- * changes to structure on disk. For resource modifications that should not modify
- * structures on disk, use {@link #IGNORE_UNDERLYING_RESOURCE}.
- * </p>
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * @plannedfor 1.0
- */
-public interface IVirtualResource extends ISchedulingRule, IAdaptable {  
-																	
-
-	/*
-	 * ==================================================================== 
-	 * Constants defining resource types: There are four possible resource 
-	 * types and their type constants are in the hex range 0x10 to 0x80 
-	 * as defined below.
-	 * ====================================================================
-	 */
-
-	/**
-	 * Type constant (bit mask value 16) which identifies file resources.
-	 * 
-	 * @see IVirtualResource#getType()
-	 * @see IVirtualFile
-	 */
-	public static final int FILE = 0x10;
-
-	/**
-	 * Type constant (bit mask value 32) which identifies folder resources.
-	 * 
-	 * @see IVirtualResource#getType()
-	 * @see IVirtualFolder
-	 */
-	public static final int FOLDER = 0x20;
-
-	/**
-	 * Type constant (bit mask value 64) which identifies the root resource.
-	 * 
-	 * @see IVirtualResource#getType()
-	 * @see IVirtualContainer
-	 */
-	public static final int COMPONENT = 0x40;
-	
-	/**
-	 * General purpose zero-valued bit mask constant. Useful whenever you need to supply a bit mask
-	 * with no bits set.
-	 * <p>
-	 * Example usage: <code>
-	 * <pre>
-	 * delete(IVirtualResource.NONE, null)
-	 * </pre>
-	 * </code>
-	 * </p>
-	 * 
-	 * @plannedfor 2.0
-	 */
-	public static final int NONE = 0;
-
-	/*
-	 * ==================================================================== Constants for update
-	 * flags for delete, move, copy, open, etc.:
-	 * ====================================================================
-	 */
-
-	/**
-	 * Update flag constant (bit mask value 256) indicating that the operation should proceed even if
-	 * the resource is out of sync with the local file system.
-	 * 
-	 * @plannedfor 2.0
-	 */
-	public static final int FORCE = 0x100; 
-
-	/**
-	 * Indicates that exclusions enumerated in the model should be ignored. (bit mask value 512)  
-	 */
-	public static final int IGNORE_EXCLUSIONS = 0x200;
-
-	/**
-	 * Indicates that modifications should only modify the metamodel and ignore the underlying
-	 * resources where applicable.  See the 
-	 * <a href="IVirtualResource.html#references">documentation on references</a> 
-	 * for more information on why this flag is relevant. (bit mask value 1024)  
-	 */
-	public static final int IGNORE_UNDERLYING_RESOURCE = 0x400;  
-	
-	/**
-	 * Create a mapping from the supplied location to the runtime path of this 
-	 * virtual resource. Model changes will occur as a result of this method, 
-	 * and potentially resource-level creations as well.
-	 * 
-	 * @param aProjectRelativeLocation A project relative location that will be represented by the runtime path after this call
-	 * @param updateFlags A bitmask of flags to supply to the method. 
-	 * @param monitor
-	 * @throws CoreException
-	 */
-	public void createLink(IPath aProjectRelativeLocation, int updateFlags, IProgressMonitor monitor) throws CoreException;
-
-	/**
-	 * Removes the mapping, if it exists, from the supplied location to the runtime path of this 
-	 * virtual resource. Model changes will occur as a result of this method, 
-	 * and potentially resource-level creations as well.
-	 * 
-	 * @param aProjectRelativeLocation A project relative location whose mapping to the runtime path of this object should be removed.
-	 * @param updateFlags A bitmask of flags to supply to the method. 
-	 * @param monitor
-	 * @throws CoreException
-	 */
-	public void removeLink(IPath aProjectRelativeLocation, int updateFlags, IProgressMonitor monitor) throws CoreException;
-
-	
-	/**   
-	 * Remove the resource from the flexible structure. Removing the resource could require
-	 * changes to the underlying metamodel or changes to the file structure. To avoid
-	 * changes the actual disk structure, use {@link #IGNORE_UNDERLYING_RESOURCE}.
-	 * <p>
-	 * Update flags supplied to this method will be passed into any IResource modification
-	 * API which is called as a result of this method's invocation.  
-	 * </p>
-	 * @see #IGNORE_UNDERLYING_RESOURCE
-	 * @see IResource#delete(int, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void delete(int updateFlags, IProgressMonitor monitor) throws CoreException;
-
-	/**
-	 * Compares two objects for equality; for resources, equality is defined in terms of their
-	 * handles: same resource type, equal full paths, and identical workspaces. Resources are not
-	 * equal to objects other than resources.
-	 * 
-	 * @param other
-	 *            the other object
-	 * @return an indication of whether the objects are equals
-	 * @see #getType()
-	 * @see #getWorkspaceRelativePath() 
-	 */
-	public boolean equals(Object other);
-
-	/**
-	 * Returns whether this virtual resource is backed by an accessible IResource. 
-	 * <p>
-	 * <code>IVirtualResource</code> objects are lightweight handle objects used to access
-	 * IResources. However, having an IVirtualResource handle does not necessarily mean the
-	 * underlying resource represented by the handle exists in the workspace, or is accessible.
-	 * For more detailed information concerning the existence or accessibility of the underlying 
-	 * resource, {@link #getUnderlyingResource()}.
-	 * </p>
-	 * 
-	 * @return <code>true</code> if the underlying resource exists and is accessible, otherwise <code>false</code>
-	 * @see org.eclipse.core.resources.IResource#exists()
-	 * @see #getUnderlyingResource();
-	 */
-	public boolean exists();
-
-	/**
-	 * Returns the file extension portion of this virtual resource's name, or <code>null</code> if it does
-	 * not have one. The file extension of the virtual resource will be returned, which may or may not match
-	 * that of the underlying resource. 
-	 * <p>
-	 * The file extension portion is defined as the string following the last period (".") character
-	 * in the name. If there is no period in the name, the path has no file extension portion. If
-	 * the name ends in a period, the file extension portion is the empty string.
-	 * </p>
-	 * <p>
-	 * This is a resource handle operation; the resource need not exist.
-	 * </p>
-	 * 
-	 * @return a string file extension
-	 * @see #getName()
-	 */
-	public String getFileExtension();
-
-	/**
-	 * Returns the full, absolute path of the underlying resource relative to the workspace.
-	 * <p>
-	 * This is a resource handle operation; the resource need not exist. If this resource does
-	 * exist, its path can be safely assumed to be valid.
-	 * </p>
-	 * 
-	 * @return the absolute path of this resource
-	 * @see #getProjectRelativePath()
-	 * @see IResource#getFullPath()
-	 */
-	public IPath getWorkspaceRelativePath();
-
-
-	/**
-	 * Returns a relative path of the underlying resource with respect to its project.  
-	 * <p>
-	 * This is a resource handle operation; the resource need not exist. If this resource does
-	 * exist, its path can be safely assumed to be valid.
-	 * </p>
-	 * <p>
-	 * Project-relative paths are recommended over absolute paths, since the former are not affected
-	 * if the project is renamed.
-	 * </p>
-	 * 
-	 * @return the relative path of this resource with respect to its project
-	 * @see #getWorkspaceRelativePath()
-	 * @see #getProject()
-	 * @see IResource#getProjectRelativePath()
-	 */
-	public IPath getProjectRelativePath();
-
-	/**
-	 * Returns the runtime path of this virtual resource. The runtime path
-	 * is determined through the metamodel and represents the path that the
-	 * underlying resource will be accessed at runtime. 
-	 * 
-	 * @return the runtime path of this virtual resource
-	 */
-	public IPath getRuntimePath();
-
-	/**
-	 * Returns the name of this virtual resource. The name of a virtual resource 
-	 * is synonymous with the last segment of its runtime path.
-	 * <p>
-	 * This is a resource handle operation; the resource need not exist.
-	 * </p>
-	 * <p>
-	 * If this resource exists, its name can be safely assumed to be valid.
-	 * </p>
-	 * 
-	 * @return the name of the virtual resource
-	 * @see #getRuntimePath()
-	 */
-	public String getName();
-
-	/**
-	 * Returns the name of the component that contains this virtual resource.
-	 * <p>
-	 * Each virtual resource is contained by at least one component. A component
-	 * represents a logical collection of files. If the underlying resource is 
-	 * contained by multiple components, then the component name returned by
-	 * this method will be determined by how the virtual resource was created. 
-	 * For each virtual resource, the component name will be the same as the 
-	 * component name of the parent.
-	 *  
-	 * @return the name of the component that contains the virtual resource
-	 */
-	public IVirtualComponent getComponent();
-
-	/**
-	 * Returns the virtual resource which contains this virtual resource, or <code>null</code> if it has
-	 * no parent (that is, the virtual resource represents the root of the component).
-	 * <p>
-	 * The full path of the parent resource is the same as this resource's full path with the last
-	 * segment removed.
-	 * </p>
-	 * <p>
-	 * This is a resource handle operation; neither the resource nor the resulting resource need
-	 * exist.
-	 * </p>
-	 * 
-	 * @return the container of the virtual resource, or <code>null</code> if this virtual resource represents the root of the component
-	 */
-	public IVirtualContainer getParent();
-
-	/**
-	 * Returns the project which contains the component which contains this virtual resource. 
-	 * <p>
-	 * The name of the project may not (and most likely will not) be referenced in the 
-	 * runtime path of this virtual path, but will be referenced by the workspace-relative path. 
-	 * </p>
-	 * <p>
-	 * This is a resource handle operation; neither the resource nor the resulting project need
-	 * exist.
-	 * </p>
-	 * 
-	 * @return the project handle
-	 */
-	public IProject getProject();
-
-	/**
-	 * Returns the type of this resource. The returned value will be one of <code>FILE</code>,
-	 * <code>FOLDER</code>, <code>COMPONENT</code>
-	 * <p>
-	 * <ul>
-	 * <li> All resources of type <code>FILE</code> implement <code>IVirtualFile</code>.</li>
-	 * <li> All resources of type <code>FOLDER</code> implement <code>IVirtualFolder</code>.</li>
-	 * <li> All resources of type <code>COMPONENT</code> implement <code>IVirtualContainer</code>.</li>
-	 * </ul>
-	 * </p>
-	 * <p>
-	 * This is a resource handle operation; the resource need not exist in the workspace.
-	 * </p>
-	 * 
-	 * @return the type of this resource
-	 * @see #FILE
-	 * @see #FOLDER
-	 * @see #COMPONENT
-	 */
-	public int getType();
-	
-	/**
-	 * A virtual resource is a representation of one or more Eclipse Platform resources. 
-	 * <p>
-	 * Returns the "primary" underlying resource. The resource may or may not exist. The resource
-	 * will be contained by the project returned by {@link #getProject()}.  
-	 * </p>
-	 * <p>
-	 * Since a virtual resource could represent multiple resources, this method will return 
-	 * the "primary" resource. For clients that wish to take advantage of the multiple resources
-	 * at a single path, use {@link #getUnderlyingResources()}. 
-	 * @return The primary resource that backs this virtual resource.
-	 */
-	public IResource getUnderlyingResource();
-	
-	/**
-	 * A virtual resource is a representation of one or more Eclipse Platform resources. 
-	 * <p>
-	 * Returns all underlying resources. The resources may or may not exist. The resources
-	 * will be contained by the project returned by {@link #getProject()}.  
-	 * </p>
-	 * <p>
-	 * Since a virtual resource could represent multiple resources, this method will return 
-	 * all underlying resources. For clients that prefer to acknowledge only one resource, 
-	 * at a single path, use {@link #getUnderlyingResource()}. 
-	 * @return All resources that back this virtual resource.
-	 */
-	public IResource[] getUnderlyingResources(); 
-
-	/**
-	 * Returns whether this resource is accessible. For files and folders, this is equivalent to
-	 * existing; for projects, this is equivalent to existing and being open. The workspace root is
-	 * always accessible.
-	 * 
-	 * @return <code>true</code> if this resource is accessible, and <code>false</code>
-	 *         otherwise
-	 * @see #exists()
-	 * @see IProject#isOpen()
-	 */
-	public boolean isAccessible();
-	
-	/**
-	 * The resourceType provides meta-information about the types of content this virtual resource may represent. Examples
-	 * include "java", "resources", "bpel", etc. 
-	 * <p>
-	 * The resourceType may be null, and {@link IVirtualComponent} will always return null for this method. 
-	 * </p>
-	 * @return A client-set resourceType string
-	 */
-	public String getResourceType();
-	
-	/**
-	 * The resourceType provides meta-information about the types of content this virtual resource may represent. Examples
-	 * include "java", "resources", "bpel", etc. 
-	 * <p>
-	 * The resourceType may be null, and {@link IVirtualComponent} will always return null for this method. 
-	 * </p>
-	 * @param A client-set resourceType string
-	 */
-	public void setResourceType(String aResourceType);
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/package.html b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/package.html
deleted file mode 100644
index d791ba2..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/package.html
+++ /dev/null
@@ -1,80 +0,0 @@
-<html>
-<head>
-<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-<link rel="stylesheet" href="../../../../..//apistyles.css" type="text/css">
-<title>modulecore resources api overview</title>
-</head>
-<body>
-<p>
-        The ComponentCore Virtual Path API allows clients to navigate 
-        logical collections of files within Eclipse projects using API 
-        similar to the Eclipse IResource API. 
-		</p>
-<a name="top"></a><a name="virtual-path"></a>
-<table width="100%" cellspacing="5" cellpadding="2" border="0">
-<tbody>
-<tr>
-<td valign="top" bgcolor="#0080c0" align="left" colspan="2"><b><font face="Arial,Helvetica" color="#ffffff">Virtual Path API</font></b></td>
-</tr>
-</tbody>
-</table>
-<BR>
-<table width="500">
-<tr>
-<td>
-<p>
-	        The Virtual Path API provides a facade to the flexible project model. 
-	        Each IVirtualResource represents a resource from the runtime component 
-	        under a virtual runtime path. Each IVirtualResource may represent one 
-	        or more Eclipse Platfrom resources located at the same runtime path.
-        </p>
-</td>
-</tr>
-</table>
-<table width="500">
-<tr>
-<td>
-<p>
-        	Each IVirtualResource is contained by exactly one IVirtualComponent. 
-        	However, the underlying resources that are represented by the 
-        	IVirtualResource may be contained by multiple IVirtualComponents. 
-        	IVirtualComponents are contained by IFlexibleProjects. Each
-        	IFlexibleProject may contain one or more IVirtualComponents. 
-        </p>
-</td>
-</tr>
-</table>
-<table cellpadding="10" cellspacing="10">
-<tr>
-<td>
-<p>
-<img src="../../../../../../overview/mapping.jpg"></p>
-</td>
-</tr>
-<tr>
-<td>
-<p>
-<i>Figure 1: A visual representation of a possible mapping between a Virtual structure and a Platform Resource structure.</i>
-</p>
-</td>
-</tr>
-</table>
-<table cellpadding="10" cellspacing="10">
-<tr>
-<td>
-<p>
-<img src="../../../../../../overview/virtual_path_api.jpg"></p>
-</td>
-</tr>
-<tr>
-<td>
-<p>
-<i>Figure 2: Virtual Path Model</i>
-</p>
-</td>
-</tr>
-</table>
-<a href="#top">top</a>
-</body>
-</html>
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/package.xml b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/package.xml
deleted file mode 100644
index 5999f55..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/package.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<html>
-    <head>
-        <meta
-            name="root"
-            content="../../../../../" />
-        <title>component core resources api overview</title>
-    </head>
-
-    <body>  
-		<abstract>
-        The ComponentCore Virtual Path API allows clients to navigate 
-        logical collections of files within Eclipse projects using API 
-        similar to the Eclipse IResource API. 
-		</abstract>
-
-		<a name="top"/>
-		<!--
-		<p>
-			The following document includes information on these topics:
-			<ul>
-				<li><a href="#virtual-path">Pointer 1</a> A description</li>  
-			</ul>
-		</p>
-		-->
-		<a name="virtual-path"/>
-        <h2>Virtual Path API</h2>
-        <BR /> 
-        <p>
-	        The Virtual Path API provides a facade to the flexible project model. 
-	        Each IVirtualResource represents a resource from the runtime component 
-	        under a virtual runtime path. Each IVirtualResource may represent one 
-	        or more Eclipse Platfrom resources located at the same runtime path.
-        </p>
-        <p>
-        	Each IVirtualResource is contained by exactly one IVirtualComponent. 
-        	However, the underlying resources that are represented by the 
-        	IVirtualResource may be contained by multiple IVirtualComponents. 
-        	IVirtualComponents are contained by IFlexibleProjects. Each
-        	IFlexibleProject may contain one or more IVirtualComponents. 
-        </p>
-        <img src="../../../../../../overview/mapping.jpg" 
-        	 caption="A visual representation of a possible mapping between a Virtual structure and a Platform Resource structure." 
-        	 width="600" height="466"
-        	 />
-        <img src="../../../../../../overview/virtual_path_api.jpg" caption="Virtual Path Model" />
-        <!--
-        <codesnippet caption="An example snippet.">
-... 
-import org.eclipse.emf.common.util.URI; 
-...
-public static void makeFlexible(IProject aTargetProject) {
-    ModuleCore moduleCoreInstance = null;
-    try {
-        ModuleCoreNature.addModuleCoreNatureIfNecessary(aTargetProject);
-        moduleCoreInstance = ModuleCore.getModuleCoreForWrite(aTargetProject);
-        ... work with moduleCoreInstance and underlying model ...
-        moduleCoreInstance.saveIfNecessary(aProgressMonitor);
-    } finally {
-        if (moduleCoreInstance != null) {
-            moduleCoreInstance.dispose();
-        }
-    }
-}        
-        </codesnippet>
-        <codesnippet caption="An example snippet.">
-... 
-import org.eclipse.emf.common.util.URI; 
-...
-public static void makeFlexible(IProject aTargetProject) {
-    ModuleCore moduleCoreInstance = null;
-    try {
-        ModuleCoreNature.addModuleCoreNatureIfNecessary(aTargetProject);
-        moduleCoreInstance = ModuleCore.getModuleCoreForWrite(aTargetProject);
-        ... work with moduleCoreInstance and underlying model ...
-        moduleCoreInstance.saveIfNecessary(aProgressMonitor);
-    } finally {
-        if (moduleCoreInstance != null) {
-            moduleCoreInstance.dispose();
-        }
-    }
-}        
-        </codesnippet>
-        -->
-		<a href="#top">top</a>
-    </body>
-</html>    
-    
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.modulecore/plugin.properties b/plugins/org.eclipse.wst.common.modulecore/plugin.properties
deleted file mode 100644
index aef7448..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/plugin.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-###############################################################################
-# Copyright (c) 2003, 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
-###############################################################################
-provider=Eclipse.org
diff --git a/plugins/org.eclipse.wst.common.modulecore/plugin.xml b/plugins/org.eclipse.wst.common.modulecore/plugin.xml
deleted file mode 100644
index a93e275..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/plugin.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-     <extension
-         point="org.eclipse.emf.ecore.generated_package">
-      <package
-            uri="componentcore.xmi"
-            class="org.eclipse.wst.common.componentcore.internal.ComponentcorePackage">
-      </package>
-   </extension>   
-   
-   <!--============================-->
-   <!-- Module Core Project Nature Contributions-->
-   <!--============================-->
-   <extension
-         id="ModuleCoreNature"
-         name="Web Properties"
-         point="org.eclipse.core.resources.natures">
-      <runtime>
-         <run
-               class="org.eclipse.wst.common.componentcore.ModuleCoreNature">
-         </run>
-      </runtime>
-   </extension>
-   <extension
-         point="org.eclipse.wst.common.emfworkbench.integration.editModel">
-      <editModel
-            editModelID="org.eclipse.wst.modulecore.structuralModel"
-            factoryClass="org.eclipse.wst.common.componentcore.internal.impl.ModuleStructuralModelFactory">
-         <editModelResource
-               autoload="false"
-               URI=".settings/.component"/>
-      </editModel> 
-   </extension>
-	
-	<extension point="org.eclipse.core.runtime.contentTypes">
- 			<file-association
-				content-type="org.eclipse.core.runtime.xml"
-				file-names=".component"/>
-	</extension>
-
-	<extension point="org.eclipse.team.core.ignore">
-		<ignore
-        enabled="true"
-        pattern=".deployables"/>
-	</extension>
-	<extension-point id="ComponentProjectMigrator" name="ComponentProjectMigrator" schema="schema/ComponentProjectMigrator.exsd"/>
-	<extension-point id="artifactedit" name="Component Artifact Edit" schema="schema/artifactedit.exsd"/>
-	
-	<!-- Contribute a URIResolverExtension for flexible projects -->
-	<extension point="org.eclipse.wst.common.uriresolver.resolverExtensions">
-      <resolverExtension
-            stage="prenormalization"
-            class="org.eclipse.wst.common.componentcore.internal.util.ComponentResolver">
-            <projectNature value="org.eclipse.wst.common.modulecore.ModuleCoreNature" />
-			<projectNature value="org.eclipse.wst.web.StaticWebNature"/>
-      </resolverExtension>
-   </extension>
-   
-  <extension point="org.eclipse.core.runtime.adapters">
-    <factory 
-      class="org.eclipse.wst.common.componentcore.datamodel.FacetDataModelConfigAdapter$Factory" 
-      adaptableType="org.eclipse.wst.common.frameworks.datamodel.IDataModel">
-      <adapter type="org.eclipse.wst.common.project.facet.core.IActionConfig"/>
-    </factory>
-  </extension>
-   
-</plugin>
diff --git a/plugins/org.eclipse.wst.common.modulecore/schema/ComponentProjectMigrator.exsd b/plugins/org.eclipse.wst.common.modulecore/schema/ComponentProjectMigrator.exsd
deleted file mode 100644
index 507ed10..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/schema/ComponentProjectMigrator.exsd
+++ /dev/null
@@ -1,103 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.common.modulecore">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.common.modulecore" id="ComponentProjectMigrator" name="Component Project Migrator"/>
-      </appInfo>
-      <documentation>
-         This allows specific implementations of components to contribute migrators Those plugins have dependencies on the modulecore plugin, but not vice versa. In order for code defined within the modulecore plugin to execute these actions, we need this extension point.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="migratorExtension"/>
-         </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">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="migratorExtension">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The class for the migrator.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;This extension point is part of an interim API that is still under development and expected to change significantly before reaching stability. It is being made available at this early stage to solicit feedback from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken (repeatedly) as the API evolves.&lt;/b&gt;
-      </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) 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/plugins/org.eclipse.wst.common.modulecore/schema/artifactedit.exsd b/plugins/org.eclipse.wst.common.modulecore/schema/artifactedit.exsd
deleted file mode 100644
index b83b0c4..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/schema/artifactedit.exsd
+++ /dev/null
@@ -1,112 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.common.modulecore">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.common.modulecore" id="artifactedit" name="Component Artifact Edit"/>
-      </appInfo>
-      <documentation>
-         This is for INTERNAL use only!  It is used for the base artifact edit types only.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="artifactedit">
-      <complexType>
-         <attribute name="typeID" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;This extension point is part of an interim API that is still under development and expected to change significantly before reaching stability. It is being made available at this early stage to solicit feedback from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken (repeatedly) as the API evolves.&lt;/b&gt;
-      </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) 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/plugins/org.eclipse.wst.common.modulecore/schema/componentCore.xsd b/plugins/org.eclipse.wst.common.modulecore/schema/componentCore.xsd
deleted file mode 100644
index a2d8828..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/schema/componentCore.xsd
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.eclipse.org/webtools/moduleCore" xmlns:tns="http://www.eclipse.org/webtools/moduleCore">
-	<element name="project-modules">
-		<complexType>
-			<sequence minOccurs="1" maxOccurs="unbounded">
-				<element name="wb-module">
-					<complexType>
-                        <sequence minOccurs="0" maxOccurs="1">
-                        	<element name="module-type">
-                        		<complexType>
-                        			<attribute name="module-type-id"
-                        				type="string">
-                        			</attribute>
-                        		</complexType>
-                        	</element>
-                        	<sequence minOccurs="0" maxOccurs="unbounded">
-                        		<element name="wb-resource">
-                                    <complexType>
-                                    	<attribute name="source-path"
-                                    		type="string" use="required">
-                                    	</attribute>
-                                    	<attribute name="deploy-path"
-                                    		type="string" use="required">
-                                    	</attribute>
-                                    </complexType>
-                        		</element>
-                        	</sequence>
-                        	<sequence minOccurs="0" maxOccurs="unbounded">
-                        		<element name="dependent-module">
-                                    <complexType>
-                                    	<attribute name="handle"
-                                    		type="string" use="required">
-                                    	</attribute>
-                                    	<attribute name="deploy-path"
-                                    		type="string" use="required">
-                                    	</attribute>
-                                    	<attribute name="dependency-type"
-                                    		type="string">
-                                    	</attribute>
-                                    </complexType>
-                        		</element>
-                        	</sequence>
-                        </sequence>
-                        <attribute name="deploy-name" type="string" use="required"></attribute>
-					</complexType>
-				</element>
-			</sequence>
-			<attribute name="id" type="string"></attribute>
-		</complexType>
-	</element>
-
-</schema>
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.ui/.classpath b/plugins/org.eclipse.wst.common.ui/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/plugins/org.eclipse.wst.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"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/plugins/org.eclipse.wst.common.ui/.cvsignore b/plugins/org.eclipse.wst.common.ui/.cvsignore
deleted file mode 100644
index 0aa63e1..0000000
--- a/plugins/org.eclipse.wst.common.ui/.cvsignore
+++ /dev/null
@@ -1,7 +0,0 @@
-bin
-ui.jar
-build.xml
-temp.folder
-org.eclipse.wst.common.ui_1.0.0.jar
-@dot
-src.zip
diff --git a/plugins/org.eclipse.wst.common.ui/.project b/plugins/org.eclipse.wst.common.ui/.project
deleted file mode 100644
index 8f557ef..0000000
--- a/plugins/org.eclipse.wst.common.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.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.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/plugins/org.eclipse.wst.common.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.common.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index c49d712..0000000
--- a/plugins/org.eclipse.wst.common.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,20 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Eclipse Base UI extensions
-Bundle-SymbolicName: org.eclipse.wst.common.ui; singleton:=true
-Bundle-Version: 1.0.0.qualifier
-Bundle-Activator: org.eclipse.core.internal.compatibility.PluginActivator
-Bundle-Vendor: Eclipse.org
-Bundle-Localization: plugin
-Export-Package: org.eclipse.wst.common.ui.internal,
- org.eclipse.wst.common.ui.internal.dialogs,
- org.eclipse.wst.common.ui.internal.dnd,
- org.eclipse.wst.common.ui.internal.viewers,
- org.eclipse.wst.common.ui.provisional.editors
-Require-Bundle: org.eclipse.core.runtime.compatibility,
- org.eclipse.ui.ide,
- org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.core.resources
-Eclipse-AutoStart: true
-Plugin-Class: org.eclipse.wst.common.ui.internal.UIPlugin
diff --git a/plugins/org.eclipse.wst.common.ui/README.txt b/plugins/org.eclipse.wst.common.ui/README.txt
deleted file mode 100644
index 4fc93df..0000000
--- a/plugins/org.eclipse.wst.common.ui/README.txt
+++ /dev/null
@@ -1 +0,0 @@
-UI Utility classes for actions, drag'n'drop and wizards.
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.ui/about.html b/plugins/org.eclipse.wst.common.ui/about.html
deleted file mode 100644
index 6f6b96c..0000000
--- a/plugins/org.eclipse.wst.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>February 24, 2005</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/plugins/org.eclipse.wst.common.ui/build.properties b/plugins/org.eclipse.wst.common.ui/build.properties
deleted file mode 100644
index 36e8b2c..0000000
--- a/plugins/org.eclipse.wst.common.ui/build.properties
+++ /dev/null
@@ -1,9 +0,0 @@
-bin.includes = plugin.properties,\
-               plugin.xml,\
-               .,\
-               META-INF/,\
-               about.html
-jars.compile.order = .
-source.. = src/
-output.. = bin/
-src.includes = component.xml
diff --git a/plugins/org.eclipse.wst.common.ui/component.xml b/plugins/org.eclipse.wst.common.ui/component.xml
deleted file mode 100644
index d3d9ccc..0000000
--- a/plugins/org.eclipse.wst.common.ui/component.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<component xmlns="http://eclipse.org/wtp/releng/tools/component-model"
-	name="org.eclipse.wst.common">
-	<component-depends unrestricted="true"></component-depends>
-	<plugin id="org.eclipse.wst.common.ui" fragment="false" />
-	<plugin id="org.eclipse.wst.common.ui.properties" fragment="false" />
-	<plugin id="org.eclipse.wst.common.uriresolver" fragment="false" />
-	
-<!--	<description url="http://eclipse.org/webtools/wst/components/common/overview.html" /> -->
-
-<!--	<package name="org.eclipse.wst.common.ui.viewers"> -->
-<!--		<type name="SelectSingleFileView" />  -->  <!-- ?, does eclipse provide better support? -->
-<!--		<type name="ResourceFilter" /> -->
-<!--		<type name="SelectMultiFilePage" /> -->
-<!--		<type name="SelectSingleFilePage" /> -->
-<!--		<type name="TableNavigator" /> -->       <!-- No, should be in eclipse base -->
-<!--		<type name="NavigableTableViewer" /> --> <!-- No, should be in eclipse base -->
-<!--	</package> -->
-<!--	<package name="org.eclipse.wst.common.ui.actionhandler.action"> -->
-<!--		<type name="CutAction" />  -->    <!-- No to these four,  should be removed? -->
-<!--		<type name="PasteAction" /> -->
-<!--		<type name="CopyAction" />  -->
-<!--		<type name="EditAction" /> -->
-<!--	</package>  -->
-<!--	<package name="org.eclipse.wst.common.ui"> -->
-<!--  	<type name="UIPlugin" />  -->    <!-- No, delete this -->
-<!-- 	<type name="OverlayIconManager" />  --> <!--  No -->
-<!--  	<type name="WindowUtility" />  -->   <!-- Remove class, clean up xsd.ui -->
-<!--    <type name="ImageFactory" />  -->   <!-- No -->
-<!--	</package> -->
-<!--	<package name="org.eclipse.wst.common.ui.wizards">  -->
-<!--  		<type name="ExampleProjectCreationOperation" />  -->  <!-- referenced externally only within package (ExampleProjectCreationWizardPage -->
-<!-- 		<type name="ExampleProjectCreationWizardPage" /> --> <!-- referenced externally only within package (ExampleProjectCreationWizard, and Operation -->
-<!--  		<type name="ExampleProjectCreationWizard" />  --> <!-- referenced by XMLExampleProjectCreationWizard, which is deprecated and going to be removed in M4  -->
-<!--	</package> -->
-<!--	<package name="org.eclipse.wst.common.ui.dnd"> -->
-<!--		<type name="ViewerDropAdapter" />  -->
-<!--		<type name="DragAndDropCommand" /> -->  <!-- referenced externally only within package -->
-<!--		<type name="DragAndDropManager" /> -->  <!--   -->
-<!--		<type name="ObjectTransfer" />  -->
-<!--		<type name="DefaultDragAndDropCommand" />  -->
-<!--		<type name="ViewerDragAdapter" /> -->
-<!--	</package>  -->
-<!--	<package name="org.eclipse.wst.common.ui.resource"> -->
-<!--		<type name="ResourceDeleteListener" />  -->  <!-- no references -->
-<!--	</package> -->
-<!--	<package name="org.eclipse.wst.common.ui.dialogs">  -->
-<!--		<type name="SelectSingleFileDialog" />  -->    <!-- No, should look into base for support? -->
-<!--	</package>  -->
-<!--	<package name="org.eclipse.wst.common.ui.actionhandler">
-		<type name="ActionHandlerListener" />
-	</package>
--->
-<!-- provisional APIs -->
-<!--
-	<package name="org.eclipse.wst.common.uriresolver">
-		<type name="URIResolverPlugin"  subclass="false" instantiate="false"/>
-		<type name="URIResolver" implement="false"/>
-		<type name="URIResolverExtension" implement="true"/>
-	</package>
--->
-</component>
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.ui/plugin.properties b/plugins/org.eclipse.wst.common.ui/plugin.properties
deleted file mode 100644
index eb3402d..0000000
--- a/plugins/org.eclipse.wst.common.ui/plugin.properties
+++ /dev/null
@@ -1,132 +0,0 @@
-! SelectSingleFilePage and SelectMultiFilePage
-_UI_LABEL_SOURCE_FILES   = Workbench Files
-_UI_LABEL_SELECTED_FILES = Selected Files
-
-_UI_IMPORT_BUTTON          = Import Files...
-_UI_IMPORT_BUTTON_TOOL_TIP = Import files from file system
-
-
-! SelectMultiFilePage
-! NOTE TO TRANSLATOR: the following three lines refers to _UI_LABEL_SELECTED_FILES label above
-_UI_ADD_BUTTON_TOOL_TIP    = Add files to Selected Files list.
-_UI_REMOVE_BUTTON_TOOL_TIP = Remove files from Selected Files list.
-_UI_REMOVE_ALL_BUTTON_TOOL_TIP =  Remove all files from Selected Files list.
-
-! NOTE TO TRANSLATOR: No translation needed of following three lines
-_UI_ADD_BUTTON             = >
-_UI_REMOVE_BUTTON          = <
-_UI_REMOVE_ALL_BUTTON      = <<
-
-! SelectJavaProjectView
-_UI_LABEL_CHOOSE_FOLDER = Select a project or folder:
-
-! SelectJavaProjectDialog
-_UI_LABEL_FOLDER_SELECTION = Container Selection
-
-! TextViewerOperationAction
-_UI_MENU_COPY         = &Copy
-_UI_MENU_CUT          = Cu&t
-_UI_MENU_DELETE       = Delete
-_UI_MENU_PASTE        = &Paste
-_UI_MENU_PREFIX       = Prefix
-_UI_MENU_REDO         = Redo
-_UI_MENU_SELECT_ALL   = Select All
-_UI_MENU_SHIFT_LEFT   = Shift Left
-_UI_MENU_SHIFT_RIGHT  = Shift Right
-_UI_MENU_STRIP_PREFIX = Strip Prefix
-_UI_MENU_UNDO         = Undo
-
-! SourceViewerGotoLineAction
-_UI_MENU_GOTO_LINE           = Go To Line...
-_UI_GOTO_LINE_DIALOG_TITLE   = Go To Line
-_UI_GOTO_LINE_DIALOG_TEXT    = Enter Line Number
-
-_UI_FILE_CHANGED_TITLE = File Changed
-_UI_FILE_DELETED_SAVE_CHANGES = The file has been deleted from the file system. Do you want to save your changes or close the editor without saving?
-_UI_FILE_DELETED_EDITOR_CLOSED = The file has been deleted from the file system. This editor will be closed.
-_UI_FILE_CHANGED_LOAD_CHANGES = The file has been changed on the file system. Do you want to load the changes?
-_UI_SAVE_BUTTON = Save
-_UI_CLOSE_BUTTON = Close
-
-
-! XSL Prefererence
-_UI_XSLT_SELECT     = Select which element to use for your stylesheet
-_UI_XSLT_STYLESHEET = &Use <xsl:stylesheet>
-_UI_XSLT_TRANSFORM  = U&se <xsl:transform>
-
-! XSL Debug Prefererence
-_UI_XSL_DEBUG_SELECT_LAUNCHER = Set the default XSL launcher for the XSL Debugging and Transformation tool
-_UI_XSL_DEBUG_LOCAL           = &XSL application
-_UI_XSL_DEBUG_REMOTE          = XS&L remote application
-_UI_XSL_TILE_EDITOR           = &Show all debugging files in a tile editor
-_UI_XSL_DEBUG_AND_TRANSFORM   = &Run transformation and open a debugging session
-_UI_XSL_CONTEXT_URI           = Context Path 
-_UI_XSL_CONTEXT               = Specify a &context path for resolving URIs in xsl:import, xsl:include or document()
-
-
-_UI_OVERRIDE_FILE    = Overwrite existing files
-_UI_JAVA_EXIST_FILE1 = The following Java classes already exist.
-_UI_JAVA_EXIST_FILE2 = Do you want to overwrite the existing file?
-      
-! some options strings common to several plugins
-_UI_ERROR_CREATING_FILE_TITLE = Error Creating File
-_UI_ERROR_CREATING_FILE_SHORT_DESC = Error creating file "{0}"
-_UI_ERROR_CREATING_FILE_LONG_DESC = An error occured while attempting to create the file "{0}".
-_UI_PARENT_FOLDER_IS_READ_ONLY = The parent directory "{0}" is read only.
-_UI_UNKNOWN_ERROR_WITH_HINT = Unknown error. Ensure that the parent directory "{0}" is writeable.
-_UI_UNKNOWN_ERROR = Unknown error. Ensure that the parent directory "{0}" is writeable.
-
-! usage - this label is followed by two radio button options for the file location
-_UI_LABEL_INCLUDE_URL_FILE = Select file location
-_UI_RADIO_FILE             = Workbench projects
-_UI_RADIO_URL              = HTTP
-
-!======================================================================================
-!
-! Here is the list of Error string that have message IDs - make sure they are unique
-!  Range for b2bgui messageIDs: IWAX1201 - IWAX1400
-!
-!======================================================================================
-
-_ERROR_THE_CONTAINER_NAME = The specified container must exist in the workspace and its path must start at the workspace root.
-
-_ERROR_LOCAL_LOCATION     = The local location of this container cannot be resolved.
-_ERROR_NOT_JAVA_PROJECT   = The specified project is not a Java project.
-
-!NOTE TO TRANSLATOR: this error message text is followed by a message from another plugin
-_ERROR_INVALID_JAVA_PACKAGE = IWAX1201E Invalid package name error:
-
-!NOTE TO TRANSLATOR: (_ERROR_BAD_FILENAME_EXTENSION + string + _UI_LABEL_OR + string) or (_ERROR_BAD_FILENAME_EXTENSION)
-_ERROR_BAD_FILENAME_EXTENSION         = The file name must end with
-_ERROR_FILE_ALREADY_EXISTS            = The same name already exists.
-
-_ERROR_CONTAINER_NOT_JAVA_BUILDPATH = The container is not a Java source folder for this project
-_ERROR_USE_PROJECT_JAVA_SOURCE_FOLDER = The project is not on the build path.  Select a Java source folder for the project.
-
-_UI_ERROR             = Error
-
-!NOTE TO TRANSLATOR: this warning message text is followed by a message from another plugin
-_WARN_INVALID_JAVA_PACKAGE = Invalid package name warning:
-
-_ERROR_ROOT_ELEMENT = The XML schema does not contain any global elements that can be used as a root element.
-_ERROR_SAVING_FILE = Error saving file "{0}"
-
-! File Validator
-_UI_ERROR_VALIDATE_FAIL_TITLE = Failed to check out necessary files
-_UI_ERROR_VALIDATE_FAIL_MESSAGE = Generation failed. Necessary files could not be checked out. 
-
-! PropertyDirtyChangeListener and PropertyResourceChangeListener
-_UI_ERROR_VALIDATE_EDIT_FAIL_ONE_FILE = Error
-
-ExampleProjectCreationWizard.title=New Example Project
-ExampleProjectCreationWizard.op_error.title=Project Creation Failed
-ExampleProjectCreationWizard.op_error.message=Project could not be created.
-
-ExampleProjectCreationWizard.overwritequery.title=Overwrite
-ExampleProjectCreationWizard.overwritequery.message=Do you want to overwrite {0}?
-
-
-ExampleProjectCreationOperation.op_desc=Creating example projects...
-ExampleProjectCreationOperation.op_desc_proj=Configuring project...
-
-ExampleProjectCreationWizardPage.error.alreadyexists=Project already exists.
diff --git a/plugins/org.eclipse.wst.common.ui/plugin.xml b/plugins/org.eclipse.wst.common.ui/plugin.xml
deleted file mode 100644
index 11cd5ea..0000000
--- a/plugins/org.eclipse.wst.common.ui/plugin.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-     <extension-point id="exampleProjectCreationWizard" name="Example Project Creation Wizard" schema="schema/exampleProjectCreationWizard.exsd"/>
-  
-
-</plugin>
diff --git a/plugins/org.eclipse.wst.common.ui/schema/exampleProjectCreationWizard.exsd b/plugins/org.eclipse.wst.common.ui/schema/exampleProjectCreationWizard.exsd
deleted file mode 100644
index 578c329..0000000
--- a/plugins/org.eclipse.wst.common.ui/schema/exampleProjectCreationWizard.exsd
+++ /dev/null
@@ -1,243 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.common.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.common.ui" id="ExampleProjectCreationWizard" name="Example Project Creation Wizard"/>
-      </appInfo>
-      <documentation>
-         This extension point allows to extend New project withard with the
-page set up setup information for the created project as well as source files that will be imported on the project creation.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="wizard"/>
-         </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">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="wizard">
-      <complexType>
-         <sequence>
-            <element ref="projectsetup" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Id of the wizard that this extension is intended for.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="banner" type="string">
-            <annotation>
-               <documentation>
-                  Plugin relative path to the image that will be displayed as a banner on the wizard.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="projectsetup">
-      <annotation>
-         <documentation>
-            Element that describes additional project setup.
-There will be as many pages created for the wizard as there are projectsetup elements.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="import" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="nature" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="references" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="pagetitle" type="string">
-            <annotation>
-               <documentation>
-                  Title of the wizard&apos;s page.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  Initial project name that will be provided on the wizard page.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="label" type="string">
-            <annotation>
-               <documentation>
-                  Label for the project name field on the wizard page.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="pagedescription" type="string">
-            <annotation>
-               <documentation>
-                  Description of the wizard page
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="open" type="string">
-            <annotation>
-               <documentation>
-                  Plugin relative path of the file that will be opened when wizard finished.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="import">
-      <annotation>
-         <documentation>
-            Element that describes what to import into the project when it&apos;s created.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="dest" type="string">
-            <annotation>
-               <documentation>
-                  Project relative path of the folder where project files will be imported to, if not specified, it&apos;s the projest itself.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="src" type="string">
-            <annotation>
-               <documentation>
-                  Plugin relative path of the import .zip file with the files to be imported into the project.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="nature">
-      <annotation>
-         <documentation>
-            Element that specified Eclipse nature that is applicable to the project.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  The id of the nature that will be opened when project will be created.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="references">
-      <annotation>
-         <documentation>
-            Element that specifies reference for the project that will be created.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  The id of the referenced project.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;This extension point is part of an interim API that is still under development and expected to change significantly before reaching stability. It is being made available at this early stage to solicit feedback from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken (repeatedly) as the API evolves.&lt;/b&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;pre&gt;
-   &lt;extension
-         point=&quot;org.eclipse.wst.common.ui.exampleProjectCreationWizard&quot;
-         id=&quot;org.eclipse.wst.xml.ui.ExampleProjectCreationWizardExtension&quot;&gt; 
-      &lt;wizard
-           id=&quot;org.eclipse.wst.xml.ui.ExampleProjectCreationWizard&quot;
-           banner=&quot;icons/newSampleProject_wizbanner.gif&quot;&gt;
-         &lt;projectsetup
-               pagetitle=&quot;%XMLExampleProjectCreationWizard.pagetitle&quot;
-               name=&quot;%XMLExampleProjectCreationWizard.projectname&quot;
-               label=&quot;%XMLExampleProjectCreationWizard.label&quot;
-               pagedescription=&quot;%XMLExampleProjectCreationWizard.pagedescription&quot;
-               open=&quot;readme.html&quot;&gt;
-            &lt;import
-                  dest=&quot;&quot;
-                  src=&quot;examples/EditingAndValidatingXML.zip&quot;&gt;
-            &lt;/import&gt;
-        &lt;/projectsetup&gt;
-     &lt;/wizard&gt;
-   &lt;/extension&gt;
-&lt;/pre&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) 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/UIPlugin.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/UIPlugin.java
deleted file mode 100644
index 978fc3e..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/UIPlugin.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 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
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *******************************************************************************/
-package org.eclipse.wst.common.ui.internal;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.text.MessageFormat;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPluginDescriptor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class UIPlugin extends AbstractUIPlugin {
-	//The shared instance.
-	private static UIPlugin plugin;
-	
-	/**
-	 * The constructor.
-	 */
-	public UIPlugin() {
-		super();
-		plugin = this;
-	}
-	
-	public UIPlugin(IPluginDescriptor descriptor) {
-		super(descriptor);
-		plugin = this;
-	}
-	
-	/**
-	 * Returns the shared instance.
-	 */
-	public static UIPlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns the workspace instance.
-	 */
-	public static IWorkspace getWorkspace() {
-		return ResourcesPlugin.getWorkspace();
-	}
-
-	/**
-	 * Returns the string from the plugin's resource bundle,
-	 * or 'key' if not found.
-	 */
-	public static String getResourceString(String key) {
-		ResourceBundle aResourceBundle = getDefault().getResourceBundle();
-		try {
-			return (aResourceBundle != null) ? aResourceBundle.getString(key) : key;
-		} catch (MissingResourceException e) {
-			return key;
-		}
-	}
-	
-	/**
-	 * This gets the string resource and does one substitution.
-	 */
-	public static String getString(String key, Object s1)
-	{
-	  return MessageFormat.format(getResourceString(key), new Object [] { s1 });
-	}
-
-	/**
-	 * This gets the string resource and does two substitutions.
-	 */
-	public static String getString(String key, Object s1, Object s2)
-	{
-	  return MessageFormat.format(getResourceString(key), new Object [] { s1, s2 });
-	}     
-	
-	/**
-	 * Returns the plugin's resource bundle,
-	 */
-	public ResourceBundle getResourceBundle() {
-		try {
-			return Platform.getResourceBundle(plugin.getBundle());
-		} catch (MissingResourceException x) {
-			log(x);
-		}
-		return null;
-	}
-
-	public ImageDescriptor getImageDescriptor(String name) {
-		try {
-			URL url= new URL(getBundle().getEntry("/"), name);
-			return ImageDescriptor.createFromURL(url);
-		} catch (MalformedURLException e) {
-			return ImageDescriptor.getMissingImageDescriptor();
-		}
-	}
-	
-    public Image getImage(String iconName)
-    {
-      ImageRegistry imageRegistry = getImageRegistry();
-      
-      if (imageRegistry.get(iconName) != null)
-      {
-        return imageRegistry.get(iconName);
-      }
-      else
-      {
-        imageRegistry.put(iconName, ImageDescriptor.createFromFile(getClass(), iconName));
-        return imageRegistry.get(iconName);
-      }
-    }
-    
-    public static String getPluginId() {
-		return getDefault().getBundle().getSymbolicName();
-	}	
-
-	public static void log(IStatus status) {
-		getDefault().getLog().log(status);
-	}
-
-	public static void log(String message, Throwable e) {
-		log(new Status(IStatus.ERROR, getPluginId(), IStatus.ERROR, message, e));
-	}
-	
-	public static void log(String message) {
-		log(new Status(IStatus.ERROR, getPluginId(), IStatus.ERROR, message, null));
-	}
-
-	public static void log(Throwable e) {
-		log(new Status(IStatus.ERROR, getPluginId(), IStatus.ERROR, e.getLocalizedMessage(), e));
-	}
-	/* (non-Javadoc)
-	 * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		// TODO Auto-generated method stub
-		super.start(context);
-	}
-	/* (non-Javadoc)
-	 * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		// TODO Auto-generated method stub
-		super.stop(context);
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/dialogs/SelectSingleFileDialog.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/dialogs/SelectSingleFileDialog.java
deleted file mode 100644
index d4e2f04..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/dialogs/SelectSingleFileDialog.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 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
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *******************************************************************************/
-package  org.eclipse.wst.common.ui.internal.dialogs;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.TitleAreaDialog;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.SWT;
-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.ui.internal.WorkbenchImages;
-import org.eclipse.ui.internal.ide.IDEInternalWorkbenchImages;
-import org.eclipse.wst.common.ui.internal.viewers.SelectSingleFileView;
-
-
-
-public class SelectSingleFileDialog extends TitleAreaDialog
-{            
-  protected SelectSingleFileView selectSingleFileView; 
-  protected Button okButton;
- 
-  public SelectSingleFileDialog(Shell parentShell, IStructuredSelection selection, boolean isFileMandatory) 
-  {
-    super(parentShell);                      
-    if (selection == null)
-    {
-      selection = new StructuredSelection();
-    }
-    selectSingleFileView = new SelectSingleFileView(selection, isFileMandatory)
-    {
-	  public void createFilterControl(Composite composite)
-	  {
-		SelectSingleFileDialog.this.createFilterControl(composite);
-	  }
-    };  
-  }
-
-  protected Control createDialogArea(Composite parent) 
-  {                                                 
-    Composite dialogArea = (Composite)super.createDialogArea(parent);
-    
-    //TODO.. enable context help
-    //WorkbenchHelp.setHelp(dialogArea, B2BGUIContextIds.BTBG_SELECT_SINGLE_FILE_DIALOG);
-
-    Composite composite = new Composite(dialogArea, SWT.NONE);
-    composite.setLayout(new GridLayout());
-    GridData gd = new GridData(GridData.FILL_BOTH);
-    gd.widthHint = 350;
-    gd.heightHint = 350;
-    composite.setLayoutData(gd);   
-            
-    SelectSingleFileView.Listener listener = new SelectSingleFileView.Listener()
-    {                                             
-      public void setControlComplete(boolean isComplete)
-      {                            
-        okButton.setEnabled(isComplete);
-      }
-    };
-    selectSingleFileView.setListener(listener);
-    selectSingleFileView.createControl(composite);
-    return dialogArea;
-  }  
-
-  protected void createButtonsForButtonBar(Composite parent) 
-  {
-    okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
-    okButton.setEnabled(false);
-    createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
-  }  
-       
-  public void create()
-  {
-    super.create();
-    selectSingleFileView.setVisibleHelper(true);   
-	  setTitleImage(WorkbenchImages.getImageDescriptor(IDEInternalWorkbenchImages.IMG_DLGBAN_SAVEAS_DLG).createImage());
-  }
-
-  public void createFilterCombo(Composite composite)
-  {
-  } 
-
-  public IFile getFile()
-  {  
-    return selectSingleFileView.getFile();
-  }   
-
-  public void addFilterExtensions(String[] filterExtensions)
-  { 
-    selectSingleFileView.addFilterExtensions(filterExtensions);
-  }
-
-  public void addFilterExtensions(String[] filterExtensions, IFile [] excludedFiles)
-  {
-    selectSingleFileView.addFilterExtensions(filterExtensions, excludedFiles);
-  }
-  
-  public void createFilterControl(Composite composite)
-  { 
-  }
-}
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/dnd/DefaultDragAndDropCommand.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/dnd/DefaultDragAndDropCommand.java
deleted file mode 100644
index 9631e6a..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/dnd/DefaultDragAndDropCommand.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 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
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *******************************************************************************/
-package org.eclipse.wst.common.ui.internal.dnd;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.swt.dnd.DND;
-
-
-abstract public class DefaultDragAndDropCommand implements DragAndDropCommand
-{
-  /**
-   * This keeps track of the owner that is the target of the drag and drop.
-   */
-  protected Object target;
-
-  /**
-   * This keeps track of the location of the drag and drop.
-   */
-  protected float location;
-
-  /**
-   * This keeps track of the lower range of locations in which the effect of this command remains unchanged.
-   */
-  protected float lowerLocationBound;
-
-  /**
-   * This keeps track of the upper range of locations in which the effect of this command remains unchanged.
-   */
-  protected float upperLocationBound;
-
-  /**
-   * This keeps track of the permitted operations.
-   */
-  protected int operations;
-
-  /**
-   * This keeps track of the current operation that will be returned by {@link #getOperation}.
-   */
-  protected int operation;
-
-  /**
-   * This keeps track of the feedback that will be returned by {@link #getFeedback}.
-   */
-  protected int feedback;
-
-  /**
-   * This keeps track of the collection of dragged sources.
-   */
-  protected Collection sources;
-
-  public DefaultDragAndDropCommand(Object target, float location, int operations, int operation, Collection sources)
-  {
-    this.target = target;
-    this.location = location;
-    this.operations = operations;
-    this.operation = operation;
-    this.sources = new ArrayList(sources);
-    if (!canExecute()) 
-    {
-      this.operation = DND.DROP_NONE;
-    }
-    
-  }
-
-  public int getFeedback()
-  {
-    if (isAfter())
-    {
-      return DND.FEEDBACK_INSERT_AFTER;
-    }
-    else 
-    {
-      return DND.FEEDBACK_INSERT_BEFORE;
-    }
-  }    
-
-  public boolean isAfter()
-  {
-    return location > 0.5;
-  }
-
-  public int getOperation()
-  {
-    return operation;
-  }
-
-  public void reinitialize(Object target, float location, int operations, int operation, Collection sources)
-  {
-    this.target = target;
-    this.location = location;
-    this.operations = operations;
-    this.operation = operation;
-    this.sources = new ArrayList(sources);
-    if (!canExecute()) 
-    {
-      this.operation = DND.DROP_NONE;
-    }
-  }    
-}
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/dnd/DragAndDropCommand.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/dnd/DragAndDropCommand.java
deleted file mode 100644
index 0ceb414..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/dnd/DragAndDropCommand.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 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
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *******************************************************************************/
-package org.eclipse.wst.common.ui.internal.dnd;
-
-import java.util.Collection;
-
-public interface DragAndDropCommand
-{
-  //  public DragAndDropCommand(Object target, float location, int operations, int operation, Collection sources);
-
-  public boolean canExecute();
-
-  public void execute();
-
-  public int getFeedback();
-  
-  public int getOperation();
-
-  public void reinitialize(Object target, float location, int operations, int operation, Collection sources);
-}
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/dnd/DragAndDropManager.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/dnd/DragAndDropManager.java
deleted file mode 100644
index 013a5b2..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/dnd/DragAndDropManager.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 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
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *******************************************************************************/
-package org.eclipse.wst.common.ui.internal.dnd;
-
-import java.util.Collection;
-
-public interface DragAndDropManager
-{
-  public DragAndDropCommand createCommand(Object target, float location, int operations, int operation, Collection source);
-}
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/dnd/ObjectTransfer.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/dnd/ObjectTransfer.java
deleted file mode 100644
index 684eafa..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/dnd/ObjectTransfer.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 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
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *******************************************************************************/
-package org.eclipse.wst.common.ui.internal.dnd;
-
-
-import org.eclipse.swt.dnd.ByteArrayTransfer;
-import org.eclipse.swt.dnd.TransferData;
-
-
-/**
- * This derived implementation of a byte array transfer short circuits the transfer process
- * so that a local transfer does not serialize the object
- * and hence can and will return the original object, not just a clone.
- * You only really need ever know about {@link #getInstance ObjectTransfer.getInstance()},
- * so that you can include it in when adding drag support to a viewer.
- * See {@link EditingDomainViewerDropAdapter} and {@link ViewerDragAdapter} for more details.
- * <p>
- * As an addded guard, the time is recorded and serialized in javaToNative
- * to that navive to java can ensure that it's returns the value that was really to have been transferred.
- */
-public class ObjectTransfer extends ByteArrayTransfer
-{
-  /**
-   * This is the register transfer type name.
-   */
-  protected static final String TYPE_NAME = "local-transfer-format";
-
-  /**
-   * This is the ID that is registered to the name.
-   */
-  protected static final int TYPE_ID = registerType(TYPE_NAME);
-
-  /**
-   * This is initialized and returned by {@link #getInstance}.
-   */
-  protected static ObjectTransfer instance;
-
-  /**
-   * This returns the one instance of this transfer agent.
-   */
-  public static ObjectTransfer getInstance()
-  {
-    if (instance == null)
-    {
-      instance = new ObjectTransfer();
-    }
-
-    return instance;
-  }
-
-  /**
-   * This records the time at which the transfer data was recorded.
-   */
-  protected long startTime;
-
-  /**
-   * This records the data being transferred.
-   */
-  protected Object object;
-
-  /**
-   * This creates an instance; typically you get one from {@link #getInstance}.
-   */
-  protected ObjectTransfer()
-  {
-  }
-
-  /**
-   * This returns the transfer ids that this agent supports.
-   */
-  protected int[] getTypeIds() 
-  {
-    return new int[] { TYPE_ID };
-  }
-
-  /**
-   * This returns the transfer names that this agent supports.
-   */
-  public String[] getTypeNames() 
-  {
-    return new String[] { TYPE_NAME };
-  }
-
-  /**
-   * This records the object and current time and encodes only the current time into the transfer data.
-   */
-  public void javaToNative(Object object, TransferData transferData) 
-  {
-    startTime = System.currentTimeMillis();
-    this.object = object;
-    if (transferData != null)
-    {
-      super.javaToNative(String.valueOf(startTime).getBytes(), transferData);
-    }
-  }
-
-  /**
-   * This decodes the time of the transfer and returns the recorded the object if the recorded time and the decoded time match.
-   */
-  public Object nativeToJava(TransferData transferData) 
-  {
-    long startTime  = Long.valueOf(new String((byte[])super.nativeToJava(transferData))).longValue();
-    return
-      this.startTime == startTime ?
-        object :
-        null;
-  }
-}
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/dnd/ViewerDragAdapter.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/dnd/ViewerDragAdapter.java
deleted file mode 100644
index d3aa343..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/dnd/ViewerDragAdapter.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 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
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *******************************************************************************/
-package org.eclipse.wst.common.ui.internal.dnd;
-
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.dnd.DragSourceEvent;
-import org.eclipse.swt.dnd.DragSourceListener;
-
-
-/**
- * This is an implemention of {@link DragSourceListener}.
- * It allows the selection in effect at the start of the drag and drop interaction to be recorded,
- * which is especially important for a drag and drop interaction within a single view.
- * This is how one of these adapters is typically hooked up:
- * <pre>
- *   viewer.addDragSupport
- *     (DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK, 
- *      new Transfer [] { LocalTransfer.getInstance() },
- *      ViewerDragAdapter(viewer));
- * </pre>
- * Doing so simply allows a drag operation to be initiated from the viewer
- * such that the viewer's selection is transferred to the drop target.
- * See {@link EditingDomainViewerDropAdapter} and {@link LocalTransfer} for more details.
- */
-public class ViewerDragAdapter implements DragSourceListener
-{
-  /**
-   * This keeps track of the viewer to which we are listening.
-   */
-  protected Viewer viewer;
-
-  /**
-   * This keeps track of the selection that is in effect at the start of the drag operation
-   */
-  protected ISelection selection;
-
-  /**
-   * This creates an instance for the given viewer.
-   */
-  public ViewerDragAdapter(Viewer viewer)
-  {
-    super();
-
-    // Remember the viewer and listen to SWT.DragDetect to alert the start of the drag operation.
-    //
-    this.viewer = viewer;
-  }
-
-  /**
-   * This is called when dragging is initiated; it records the {@link #selection} of {@link #viewer}.
-   */
-  public void dragStart(DragSourceEvent event)
-  {
-    selection = viewer.getSelection();
-  }
-
-  /**
-   * This is called when dragging is completed; it forgets the {@link #selection}.
-   */
-  public void dragFinished(DragSourceEvent event)
-  {
-    selection = null;
-  }
-  
-  /**
-   * This is called to transfer the data.
-   */
-  public void dragSetData(DragSourceEvent event)
-  {
-    if (ObjectTransfer.getInstance().isSupportedType(event.dataType))
-    {
-      event.data = selection;
-    }
-  }
-}
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/dnd/ViewerDropAdapter.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/dnd/ViewerDropAdapter.java
deleted file mode 100644
index 3bd03f2..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/dnd/ViewerDropAdapter.java
+++ /dev/null
@@ -1,768 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 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
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *******************************************************************************/
-package org.eclipse.wst.common.ui.internal.dnd;
-
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-
-import org.eclipse.jface.viewers.AbstractTreeViewer;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.custom.TableTreeItem;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTargetAdapter;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.dnd.TransferData;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.ScrollBar;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.swt.widgets.Widget;
-
-
-/**
- * This implementation of a drop target listener 
- * is designed to turn a drag and drop operation into a {@link Command} based on the model objects of an {@link EditingDomain}
- * and created by {@link DragAndDropManager#create}.
- * It is designed to do early data transfer so the the enablement and feedback of the drag and drop interaction
- * can intimately depend on the state of the model objects involed.
- * <p>
- * The base implementation of this class should be sufficient for most applications.
- * Any change in behaviour is typically accomplished by overriding 
- * {@link ItemProviderAdapter}.createDragAndDropCommand
- * to return a derived implementation of {@link DragAndDropCommand}.
- * This is how one these adapters is typically hooked up:
- * <pre>
- *   viewer.addDropSupport
- *     (DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK,
- *      new Transfer [] { ObjectTransfer.getInstance() },
- *      EditingDomainViewerDropAdapter(viewer));
- * </pre>
- * <p>
- * This implementation prefers to use a {@link ObjectTransfer}, 
- * which short-circuits the transfer process for simple transfers within the workbench,
- * the method {@link #getDragSource} can be overriden to change the behaviour.
- * The implementation also only handles an {@link IStructuredSelection},
- * but the method {@link #extractDragSource} can be overriden to change the behaviour.
- * <p>
- * You can call {@link #setHoverThreshold} to set the amount of time, in milliseconds, 
- * to hover over an item before {@link #hover} is called;
- * the default is 1500 milliseconds.
- */
-public class ViewerDropAdapter extends DropTargetAdapter
-{
-  /**
-   * This is the viewer for which this is a drop target listener.
-   */
-  protected Viewer viewer;
-
-  /**
-   * This is the collection of source objects being dragged.
-   */
-  protected Collection source;
-
-  /**
-   * This is the command created during dragging which provides the feedback and will carry out the action upon completion.
-   */
-  //  protected Command command;
-  protected DragAndDropCommand command;
- 
-  /**
-   * This records the object for which the {@link #command} was created.
-   */
-  protected Object commandTarget;
-
-  /**
-   * The amount of time to hover over a tree item before expanding it
-   */
-  protected int hoverThreshold = 1500;
-
-  /**
-   * The is the time the mouse first started hovering over the current item.
-   */
-  protected long hoverStart = 0;
-
-  /**
-   * This keeps track of the most recent item for the {@link #hoverStart}.
-   */
-  protected Widget previousItem;
-
-  /**
-   * This keeps track of the original operation that was in effect before we set the event.detail in here.
-   */
-  protected int originalOperation;
-
-  /**
-   * This keeps track of the information used to create the current command.
-   */
-  protected DragAndDropCommandInformation dragAndDropCommandInformation;
-
-  protected DragAndDropManager dragAndDropManager;
-
-  /**
-   * This creates and instance of the given domain and viewer.
-   */
-  public ViewerDropAdapter(Viewer viewer, DragAndDropManager dragAndDropManager)
-  {
-    this.viewer = viewer;
-    this.dragAndDropManager = dragAndDropManager;
-  }
-
-  /**
-   * This is called when the mouse first enters or starts dragging in the viewer.
-   */
-  public void dragEnter(DropTargetEvent event)
-  {
-    originalOperation = event.detail;
-    helper(event);
-  }
-
-  /**
-   * This is called when the mouse leaves or stops dragging in the viewer
-   */
-  public void dragLeave(DropTargetEvent event)
-  {
-    // Clean up the command if there is one.
-    //
-    if (command != null)
-    {
-//        command.dispose();
-      command = null;
-      commandTarget = null;
-    }
-
-    // Reset the other values.
-    //
-    previousItem = null;
-    hoverStart = 0;
-    source = null;
-  }
-
-  /**
-   * This is called when the operation has changed in some way, typically because the user changes keyboard modifiers.
-   */
-  public void dragOperationChanged(DropTargetEvent event)
-  {
-    originalOperation = event.detail;
-    helper(event);
-  }
-
-  /**
-   * This is called repeated when the mouse over the viewer.
-   */
-  public void dragOver(DropTargetEvent event) 
-  {
-    helper(event);
-  }
-
-  /**
-   * This is called just as the mouse is released over the viewer to initiate a drop.
-   */
-  public void dropAccept(DropTargetEvent event) 
-  {
-    // There seems to be a bug in SWT that the view may have scrolled.
-    // helper(event);
-  }
-
-  /**
-   * This is called to indate that the drop action should be invoked.
-   */
-  public void drop(DropTargetEvent event)
-  {
-    // There seems to be a bug in SWT that the view may have scrolled.
-    // helper(event);
-    if (dragAndDropCommandInformation != null)
-    {
-      command = dragAndDropCommandInformation.createCommand();
-
-      // Execute the command
-      command.execute();
-
-      // Clean up the state.
-      //
-      command = null;
-      commandTarget = null;
-      previousItem = null;
-      hoverStart = 0;
-      source = null;
-    }
-  }
-
-  /**
-   * This method is called the same way for each of the {@link org.eclipse.swt.dnd.DropTargetListener} methods, except during leave.
-   */
-  protected void helper(DropTargetEvent event)
-  {
-    // Try to get the source if there isn't one.
-    //
-    if (source == null)
-    {
-      source = getDragSource(event);
-    }                   
-    else if (event.currentDataType == null)
-    {
-      setCurrentDataType(event);
-    }
-
-    // If there's still no source, wait until the next time to try again.
-    //
-    if (source == null)
-    {
-      event.detail = DND.DROP_NONE;
-      event.feedback = DND.FEEDBACK_SELECT;
-    }
-    // Otherwise, if we need to scroll...
-    //
-    else if (scrollIfNeeded(event))
-    {
-      // In the case that we scroll, we just do all the work on the next event and only just scroll now.
-      //
-      event.feedback = DND.FEEDBACK_SELECT;
-    }
-    else
-    {
-      // Get the data from the item, if there is one.
-      //
-      Object target = event.item == null ? null : event.item.getData();
-      if (target instanceof TableTreeItem)
-      {
-        target = ((TableTreeItem)target).getData();
-      }
-
-      // Do the logic to determine the hover information.
-      // If we're over a new item from before.
-      //
-      if (event.item != previousItem)
-      {
-        // Remember the item and the time.
-        //
-        previousItem = event.item;
-        hoverStart = event.time;
-      } 
-      else if (target != null)
-      {
-        if (event.time - hoverStart > hoverThreshold)
-        {
-          hover(target);
-
-          // We don't need to hover over this guy again.
-          //
-          hoverStart = Integer.MAX_VALUE;
-        }
-      }
-
-      // Determine if we can create a valid command at the current mouse location.
-      //
-      boolean valid = false;
-
-      // If we don't have a previous cached command...
-      //
-      if (command == null)
-      {
-        // Create the command and test if it is executable.
-        //
-        commandTarget = target;
-        command = dragAndDropManager.createCommand(target, getLocation(event), event.operations, event.detail, source);
-        if (command != null)
-        {
-        	valid = command.canExecute();
-        }
-      }
-      else
-      {
-        int operation = originalOperation != event.detail ? originalOperation : event.detail;
-
-        // Check if the cached command is able to provide drag and drop feedback.
-        //
-        if (target == commandTarget)// && command instanceof DragAndDropFeedback)
-        {
-          float location = getLocation(event);
-
-          dragAndDropCommandInformation = 
-            new DragAndDropCommandInformation(target, location, event.operations, operation, source);
-
-          // If so, revalidate the command.
-          //
-          command.reinitialize(target, location, event.operations, operation, source);
-          if (command != null)
-          {
-          valid = command.canExecute();
-          }
-        }
-        else
-        {
-          // If not, dispose the current command and create a new one.
-          //
-          //          command.dispose();
-          commandTarget = target;
-
-          dragAndDropCommandInformation = 
-            new DragAndDropCommandInformation(target, getLocation(event), event.operations, operation, source);
-
-          // DragAndDropManager.create(domain, target, getLocation(event), event.operations, operation, source);
-          //
-          command = dragAndDropCommandInformation.createCommand();
-
-          if (command != null)
-          {
-          	valid = command.canExecute();
-          }
-        }
-      }
-
-      // If this command can provide detailed drag and drop feedback...
-      //
-      //if (command instanceof DragAndDropCommand)
-      if (command != null)
-      {
-        // Use the feedback for the operation and mouse point from the command.
-        //
-        event.detail = command.getOperation();
-        event.feedback = command.getFeedback();
-      }
-      else if (valid)
-      {
-        // All we can know is to provide selection feedback.
-        //
-        event.feedback = DND.FEEDBACK_SELECT;
-      }
-      else
-      {
-        // There is no executable command, so we'd better nix the whole deal.
-        //
-        event.detail = DND.DROP_NONE;
-        event.feedback = DND.FEEDBACK_SELECT;
-      }
-    }
-  }
-    
-
-  protected void setCurrentDataType(DropTargetEvent event)
-  {                                
-    ObjectTransfer objectTransfer = ObjectTransfer.getInstance();
-    TransferData [] dataTypes = event.dataTypes;
-    for (int i = 0; i < dataTypes.length; ++i)
-    {
-      TransferData transferData = dataTypes[i];
-      // If the local tansfer supports this datatype, switch to that data type
-      //
-      if (objectTransfer.isSupportedType(transferData))
-      {
-        event.currentDataType = transferData;
-      }
-    }
-  }
-
-  /** 
-   * This  attempts to extract the drag source from the event early, i.e., before the drop method.
-   * This implementation tries to use a {@link org.eclipse.wst.common.ui.internal.dnd.ObjectTransfer}.
-   */
-  protected Collection getDragSource(DropTargetEvent event)
-  {
-    // Check whether the current data type can be transfered locally.
-    //
-    ObjectTransfer objectTransfer = ObjectTransfer.getInstance();
-    if (!objectTransfer.isSupportedType(event.currentDataType))
-    {
-      // Iterate over the data types to see if there is a datatype that supports a local transfer.
-      //
-      setCurrentDataType(event);
-      return null;
-    }
-    else
-    {
-      // Transfer the data and extract it.
-      //
-      Object object = objectTransfer.nativeToJava(event.currentDataType);
-      if (object == null)
-      {
-      	return null;
-      }
-      else
-      {
-      	return extractDragSource(object);
-      }
-    }
-  }
-
-  /**
-   * This extracts a collection of dragged source objects from the given object retrieved from the transfer agent.
-   * This default implementation converts a structured selection into a collection of elements.
-   */
-  protected Collection extractDragSource(Object object)
-  {
-    // Transfer the data and convert the structured selection to a collection of objects.
-    //
-    if (object instanceof IStructuredSelection)
-    {
-      Collection result = new ArrayList();
-      for (Iterator elements = ((IStructuredSelection)object).iterator(); elements.hasNext(); )
-      {
-        result.add(elements.next());
-      }
-      return result;
-    }
-    else
-    {
-      return Collections.EMPTY_LIST;
-    }
-  }
-
-  /**
-   * This gets the amount of time, in milliseconds, to hover over an item before {@link #hover} is called.
-   */
-  public int getHoverThreshold()
-  {
-    return hoverThreshold;
-  }
-
-  /**
-   * This set the amount of time, in milliseconds, to hover over an item before {@link #hover} is called.
-   */
-  public void setHoverThreshold(int hoverThreshold)
-  {
-    this.hoverThreshold = hoverThreshold;
-  }
-
-  /**
-   * This is called when the cursor has hovered over the given target for longer than {@link #hoverThreshold}.
-   */
-  protected void hover(Object target)
-  {
-    if (viewer instanceof AbstractTreeViewer)
-    {
-      ((AbstractTreeViewer)viewer).expandToLevel(target, 1);
-    }
-  }
-
-  /** 
-   * This returns whether a scroll was performed based on the given drag coordinates.
-   */
-  protected boolean scrollIfNeeded(DropTargetEvent event)
-  {
-    // By default we'll not scroll
-    //
-    boolean result = false;
-
-    // We only handle a tree item right now.
-    //
-    if (event.item instanceof TreeItem)
-    {
-      // Tree items have special data that will help.
-      //
-      TreeItem treeItem = (TreeItem)event.item;
-
-      // We need need the point in the coordinates of the control and the control's bounds.
-      //
-      Tree tree = treeItem.getParent();
-      Point point = tree.toControl(new Point(event.x, event.y));
-      Rectangle bounds = tree.getClientArea();
-
-      // This is the distance in pixels from the top or bottom that will cause scrolling.
-      //
-      int scrollEpsilon = Math.min(treeItem.getBounds().height, bounds.height / 3);
-
-      // This will be the item that should be scrolled into the view.
-      //
-      TreeItem scrollTreeItem = null;
-
-      // If we should scroll up.
-      //
-      if (point.y < scrollEpsilon)
-      {
-        // Determine the parent to find the sibling.
-        //
-        TreeItem parent = treeItem.getParentItem();
-        // Walk through the siblings.
-        //
-        TreeItem [] children = parent == null ? tree.getItems() : parent.getItems();
-        for (int i = 0; i < children.length; ++i)
-        {
-          // Is this a match.
-          //
-          if (children[i] == treeItem)
-          {
-            // If there is a previous sibling...
-            //
-            if (i > 0)
-            {
-              scrollTreeItem = children[i - 1];
-
-              // Get the last deepest descendent of this previous sibling.
-              //
-              for (;;)
-              {
-                children = scrollTreeItem.getItems();
-                if (children != null && children.length != 0 && scrollTreeItem.getExpanded())
-                {
-                  scrollTreeItem = children[children.length - 1];
-                }
-                else
-                {
-                  break;
-                }
-              }
-            }
-            else
-            {
-              // The parent must be the previous.
-              //
-              scrollTreeItem = parent;
-            }
-
-            // We're done after the match.
-            //
-            break;
-          }
-        }
-      }
-      // If we should scroll down...
-      //
-      else if (bounds.height - point.y < scrollEpsilon)
-      {
-        // If this thing has visible children, then the first child must be next.
-        //
-        TreeItem [] children = treeItem.getItems();
-        if (children != null && children.length != 0 && treeItem.getExpanded())
-        {
-          scrollTreeItem = children[0];
-        }
-        else
-        {
-          // We need the parent to determine siblings and will walk up the tree if we are the last sibling.
-          //
-          while (scrollTreeItem == null)
-          {
-            // If there's no parent, we're done.
-            //
-            TreeItem parent = treeItem.getParentItem();
-            // Walk the children.
-            //
-            children = parent == null ? tree.getItems() : parent.getItems();
-            for (int i = 0; i < children.length; ++i)
-            {
-              // When we find the child.
-              //
-              if (children[i] == treeItem)
-              {
-                // If the next index is a valid index...
-                //
-                if (++i < children.length)
-                {
-                  // We've found the item.
-                  //
-                  scrollTreeItem = children[i];
-                }
-
-                // We're done with this parent.
-                //
-                break;
-              }
-            }
-
-            if (parent == null)
-            {
-              break;
-            }
-
-            // Walk up.
-            //
-            treeItem = parent;
-          }
-        }
-      }
-
-      // If we should scroll.
-      //
-      if (scrollTreeItem != null)
-      {
-        // Only scroll if we're on an item for a while.
-        //
-        if (previousItem != null && event.time - hoverStart > 200)
-        {
-          ScrollBar verticalScrollBar = tree.getVerticalBar();
-          if (verticalScrollBar != null)
-          {
-            int before = verticalScrollBar.getSelection();
-
-            // Make sure the item is scrolled in place.
-            //
-            tree.showItem(scrollTreeItem);
-
-            // Make sure we don't scroll again quickly.
-            //
-            previousItem = null;
-
-            // Indicate that we've done a scroll and nothing else should be done.
-            //
-            result = before != verticalScrollBar.getSelection();
-          }
-        }
-        else
-        {
-          // If the item changes, reset the timer information.
-          //
-          if (event.item != previousItem)
-          {
-            previousItem = event.item;
-            hoverStart = event.time;
-          }
-        }
-      }
-    }
-    else if (event.item instanceof TableItem)
-    {
-      // Table items have special data that will help.
-      //
-      TableItem tableItem = (TableItem)event.item;
-
-      // We need need the point in the coordinates of the control and the control's bounds.
-      //
-      Table table = tableItem.getParent();
-      Point point = table.toControl(new Point(event.x, event.y));
-      Rectangle bounds = table.getClientArea();
-      if (table.getHeaderVisible())
-      {
-        int offset = table.getItemHeight();
-        bounds.y += offset;
-        bounds.height -= offset;
-        point.y -= offset;
-      }
-
-      // The position of this item.
-      //
-      int index = table.indexOf(tableItem);
-
-      // This is the distance in pixels from the top or bottom that will cause scrolling.
-      //
-      int scrollEpsilon = Math.min(tableItem.getBounds(0).height, bounds.height / 3);
-
-      // This will be the item that should be scrolled into the view.
-      //
-      TableItem scrollTableItem = null;
-
-      // If we should scroll up.
-      //
-      if (point.y < scrollEpsilon)
-      {
-        if (index > 0)
-        {
-          scrollTableItem = table.getItems()[index - 1];
-        }
-      }
-      // If we should scroll down...
-      //
-      else if (bounds.height - point.y < scrollEpsilon)
-      {
-        if (index + 1 < table.getItems().length)
-        {
-          scrollTableItem =  table.getItems()[index + 1];
-        }
-      }
-
-      // If we should scroll.
-      //
-      if (scrollTableItem != null)
-      {
-        // Only scroll if we're on an item for a while.
-        //
-        if (previousItem != null && event.time - hoverStart > 200)
-        {
-          ScrollBar verticalScrollBar = table.getVerticalBar();
-          if (verticalScrollBar != null)
-          {
-            int before = verticalScrollBar.getSelection();
-
-            // Make sure the item is scrolled in place.
-            //
-            table.showItem(scrollTableItem);
-
-            // Make sure we don't scroll again quickly.
-            //
-            previousItem = null;
-
-            // Indicate that we've done a scroll and nothing else should be done.
-            //
-            result = before != verticalScrollBar.getSelection();
-          }
-        }
-        else
-        {
-          // If the item changes, reset the timer information.
-          //
-          if (event.item != previousItem)
-          {
-            previousItem = event.item;
-            hoverStart = event.time;
-          }
-        }
-      }
-    }
-
-    return result;
-  }
-
-  protected static float getLocation(DropTargetEvent event) 
-  {
-    if (event.item instanceof TreeItem)
-    {
-      TreeItem treeItem = (TreeItem)event.item;
-      Control control = treeItem.getParent();
-      Point point = control.toControl(new Point(event.x, event.y));
-      Rectangle bounds = treeItem.getBounds();
-      return (float)(point.y - bounds.y) / (float)bounds.height;
-    }
-    else if (event.item instanceof TableItem)
-    {
-      TableItem tableItem = (TableItem)event.item;
-      Control control = tableItem.getParent();
-      Point point = control.toControl(new Point(event.x, event.y));
-      Rectangle bounds = tableItem.getBounds(0);
-      return (float)(point.y - bounds.y) / (float)bounds.height;
-    }
-    else
-    {
-      return 0.0F;
-    }
-  }
-
-  protected class DragAndDropCommandInformation
-  {
-    //    protected EditingDomain domain;
-    protected Object target;
-    protected float location;
-    protected int operations;
-    protected int operation;
-    protected Collection source;
-    public DragAndDropCommandInformation
-      (Object target, float location, int operations, int operation, Collection source)
-    {
-      this.target = target;
-      this.location = location;
-      this.operations = operations;
-      this.operation = operation;
-      this.source = new ArrayList(source);
-    }
-
-    public DragAndDropCommand createCommand()
-    {
-      return dragAndDropManager.createCommand(target, location, operations, operation, source);
-    }
-  }
-}
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/viewers/NavigableTableViewer.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/viewers/NavigableTableViewer.java
deleted file mode 100644
index 9f03d3b..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/viewers/NavigableTableViewer.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 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
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *******************************************************************************/
-package org.eclipse.wst.common.ui.internal.viewers;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.widgets.Table;
-
-public class NavigableTableViewer extends TableViewer
-{
-   TableNavigator navigator;
-
-   public NavigableTableViewer(Table parent)
-   {
-      super(parent);
-      navigator = new TableNavigator(getTable(), this);
-   }
-
-   //override setCellEditors to put in call to moveAboveCellEditors for TableNavigator
-   public void setCellEditors(CellEditor[] editors)
-   {
-     super.setCellEditors(editors);
-     navigator.moveCellEditorsAbove(editors);
-
-   }
-
-   //override refresh so that TableNavigator is refreshed for all model changes
-   public void refresh()
-   {
-   	if( !this.getTable().isDisposed() )
-   	{
-      	super.refresh();
-      	navigator.refresh();
-   	}
-   }
-
-}
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/viewers/ResourceFilter.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/viewers/ResourceFilter.java
deleted file mode 100644
index aaa3f5d..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/viewers/ResourceFilter.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 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
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *******************************************************************************/
-package org.eclipse.wst.common.ui.internal.viewers;
-
-import java.util.Collection;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-
-public class ResourceFilter extends ViewerFilter 
-{
-  protected String[] fExtensions;
-  protected IFile[] fExcludedFiles;
-  protected Collection fExcludes;
-	
-  public ResourceFilter(String[] extensions, Collection exclude) 
-  {
-    fExtensions= extensions;
-    fExcludes= exclude;
-    fExcludedFiles = null;
-  }
-
-  public ResourceFilter(String[] extensions, IFile[] excludedFiles, Collection exclude) 
-  {
-    fExtensions= extensions;
-    fExcludes= exclude;
-    fExcludedFiles = excludedFiles;
-  }
-	
-  public boolean isFilterProperty(Object element, Object property) 
-  {
-    return false;
-  }
-	
-  public boolean select(Viewer viewer, Object parent, Object element) 
-  {
-    if (element instanceof IFile) 
-    {
-      if (fExcludes != null && fExcludes.contains(element)) 
-      {
-	return false;
-      }
-      String name= ((IFile)element).getName();
-      if (fExcludedFiles != null) 
-      {
-        for (int j= 0; j < fExcludedFiles.length; j++) 
-        {
-          if ( ((IFile)element).getLocation().
-               toOSString().compareTo((fExcludedFiles[j]).getLocation().toOSString()) == 0 )
-           return false;             
-        }            
-      }
-      if (fExtensions.length == 0) 
-      {
-        // assume that we don't want to filter any files based on 
-        // extension
-        return true;
-      }
-      for (int i= 0; i < fExtensions.length; i++) 
-      {
-        if (name.endsWith(fExtensions[i]))
-        {
-          return true;
-        }
-      } 
-      return false;
-    } 
-    else if (element instanceof IContainer) 
-    { // IProject, IFolder
-      try 
-      {
-      	IResource[] resources= ((IContainer)element).members();
-	for (int i= 0; i < resources.length; i++) 
-        {
-	  // recursive!
-	  if (select(viewer, parent, resources[i])) 
-          {
-	    return true;
-	  }
-	}
-      } 
-      catch (CoreException e) 
-      {
-      }				
-    }
-    return false;
-  }
-}
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/viewers/SelectMultiFilePage.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/viewers/SelectMultiFilePage.java
deleted file mode 100644
index 2ee7982..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/viewers/SelectMultiFilePage.java
+++ /dev/null
@@ -1,389 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 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
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *******************************************************************************/
-package org.eclipse.wst.common.ui.internal.viewers;
-
-import java.util.*;
-import org.eclipse.jface.viewers.*;
-import org.eclipse.jface.wizard.*;
-import org.eclipse.swt.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.widgets.List;
-import org.eclipse.core.resources.*;
-import org.eclipse.ui.*;
-import org.eclipse.ui.model.*;
-import org.eclipse.ui.wizards.datatransfer.*;
-import org.eclipse.wst.common.ui.internal.UIPlugin;
-
-
-// Page to specify the source files
-public class SelectMultiFilePage extends WizardPage {
-  IWorkbench workbench;
-  IStructuredSelection selection;
-  boolean isFileMandatory;
-  TreeViewer sourceFileViewer;
-  Button addButton;
-  Button removeButton;
-  Button removeAllButton;
-  org.eclipse.swt.widgets.List selectedListBox;
-  Button importButton;
-  private Vector fFilters;
-  protected IFile[] fileNames;
-  IWorkspaceRoot workspaceRoot;
-
-  private final static int SIZING_LISTS_HEIGHT = 200;
-  private final static int SIZING_LISTS_WIDTH = 150;
-
-  // parameter isFileMandatory is used to determine if at least one file must be selected  
-  // before being able to proceed to the next page
-  public SelectMultiFilePage(
-      IWorkbench workbench,
-      IStructuredSelection selection,
-      boolean isFileMandatory) {
-    super("SelectMultiFilePage");
-    this.workbench = workbench;
-    this.selection = selection;
-    this.isFileMandatory = isFileMandatory;
-    this.workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-    this.fileNames = null;
-  }
-
-  public void createControl(Composite parent) {
-    
-    Composite pageContent = new Composite(parent, SWT.NONE);
-    GridLayout layout = new GridLayout();
-    layout.numColumns = 3;
-    pageContent.setLayout(layout);
-    pageContent.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-    GridData outerFrameGridData = (GridData) pageContent.getLayoutData();
-    //		outerFrameGridData.horizontalAlignment = GridData.HORIZONTAL_ALIGN_FILL;
-    //		outerFrameGridData.verticalAlignment = GridData.VERTICAL_ALIGN_FILL;
-
-    //    WorkbenchHelp.setHelp(
-    //        pageContent,
-    //        B2BGUIContextIds.BTBG_SELECT_MULTI_FILE_PAGE);
-
-    createLabels(pageContent);
-    createSourceViewer(pageContent);
-    createButtonPanel(pageContent);
-    createSelectedListBox(pageContent);
-    createImportButton(pageContent);
-
-    setControl(pageContent);
-    if (isFileMandatory)
-      setPageComplete(false);
-
-  }
-
-  public IFile[] getFiles() {
-    return fileNames;
-  }
-
-  // This is a convenience method that allows filtering of the given file
-  // exensions. It internally creates a ResourceFilter so that users of this
-  // class don't have to construct one.
-  // If the extensions provided don't have '.', one will be added.
-  public void addFilterExtensions(String[] filterExtensions) {
-    // First add the '.' to the filterExtensions if they don't already have one
-    String[] correctedFilterExtensions =
-      new String[filterExtensions.length];
-    for (int i = 0; i < filterExtensions.length; i++) {
-      // If the extension doesn't start with a '.', then add one.
-      if (filterExtensions[i].startsWith("."))
-        correctedFilterExtensions[i] = filterExtensions[i];
-      else
-        correctedFilterExtensions[i] = "." + filterExtensions[i];
-    }
-
-    ViewerFilter filter =
-      new ResourceFilter(correctedFilterExtensions, null);
-    addFilter(filter);
-  }
-
-  public boolean isValidSourceFileViewerSelection(ISelection selection) {
-    return true;
-  }
-
-  public void setVisible(boolean visible) {
-    if (visible == true) {
-      if (fFilters != null) {
-        sourceFileViewer.resetFilters();
-        for (Iterator i = fFilters.iterator(); i.hasNext();)
-          sourceFileViewer.addFilter((ViewerFilter) i.next());
-      }
-      sourceFileViewer.setInput(ResourcesPlugin.getWorkspace().getRoot());
-    }
-    super.setVisible(visible);
-  }
-
-  public void setFiles(String[] fileNames) {
-    int size = Arrays.asList(fileNames).size();
-    Vector iFileNames = new Vector();
-    for (int i = 0; i < size; i++) {
-      IResource resource = workspaceRoot.findMember(fileNames[i]);
-      if (resource instanceof IFile)
-        iFileNames.addElement(resource);
-    }
-    IFile[] dummyArray = new IFile[iFileNames.size()];
-    this.fileNames = (IFile[]) (iFileNames.toArray(dummyArray));
-  }
-
-  public void resetFilters() {
-    fFilters = null;
-  }
-
-  public void addFilter(ViewerFilter filter) {
-    if (fFilters == null)
-      fFilters = new Vector();
-    fFilters.add(filter);
-  }
-
-  public void setAddButtonEnabled(boolean isEnabled) {
-    addButton.setEnabled(isEnabled);
-  }
-
-  public void setRemoveButtonEnabled(boolean isEnabled) {
-    removeButton.setEnabled(isEnabled);
-  }
-
-  private void createLabels(Composite pageContent) {
-    Label label = new Label(pageContent, SWT.LEFT);
-    label.setText(UIPlugin.getResourceString("_UI_LABEL_SOURCE_FILES"));
-
-    GridData data = new GridData();
-    data.horizontalAlignment = GridData.FILL;
-    data.horizontalSpan = 2;
-    label.setLayoutData(data);
-
-    label = new Label(pageContent, SWT.LEFT);
-    label.setText(UIPlugin.getResourceString("_UI_LABEL_SELECTED_FILES"));
-  }
-
-  public boolean checkIfFileInTarget(IFile fileToCheck) {
-    String[] strings = selectedListBox.getItems();
-    int size = selectedListBox.getItemCount();
-    for (int i = 0; i < size; i++) {
-      if (strings[i].compareTo(fileToCheck.getFullPath().toString())
-          == 0)
-        return true;
-    }
-    return false;
-  }
-
-  private void createSourceViewer(Composite parent) {
-    sourceFileViewer =
-      new TreeViewer(
-          new Tree(
-              parent,
-              SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER));
-    sourceFileViewer.setContentProvider(new WorkbenchContentProvider());
-    sourceFileViewer.setLabelProvider(new WorkbenchLabelProvider());
-    sourceFileViewer
-    .addSelectionChangedListener(new ISelectionChangedListener() {
-      public void selectionChanged(SelectionChangedEvent event) {
-        java.util.List list;
-        ISelection selection = event.getSelection();
-        boolean newFilesSelected = false;
-
-        if (selection instanceof IStructuredSelection) {
-          list = ((IStructuredSelection) selection).toList();
-          for (Iterator i = list.iterator(); i.hasNext();) {
-            IResource resource = (IResource) i.next();
-            if (resource instanceof IFile) {
-              if (checkIfFileInTarget((IFile) resource) == false)
-                newFilesSelected = true;
-            }
-          }
-          setAddButtonEnabled(newFilesSelected);
-        }
-      }
-    });
-    sourceFileViewer.addDoubleClickListener(new IDoubleClickListener() {
-      public void doubleClick(DoubleClickEvent event) {
-        addSelectedFilesToTargetList();
-      }
-    });
-
-    Control treeWidget = sourceFileViewer.getTree();
-    GridData gd = new GridData(GridData.FILL_BOTH);
-    gd.widthHint = SIZING_LISTS_WIDTH;
-    gd.heightHint = SIZING_LISTS_HEIGHT;
-    treeWidget.setLayoutData(gd);
-  }
-
-  private void createButtonPanel(Composite pageContent) {
-    Composite buttonPanel = new Composite(pageContent, SWT.NONE);
-    GridLayout layout = new GridLayout();
-    layout.numColumns = 1;
-    buttonPanel.setLayout(layout);
-    
-    GridData gridData = new GridData();
-    gridData.grabExcessHorizontalSpace = false;
-    gridData.grabExcessVerticalSpace = true;
-    gridData.verticalAlignment = GridData.CENTER;
-    gridData.horizontalAlignment = GridData.CENTER;
-    buttonPanel.setLayoutData(gridData);
-
-    addButton = new Button(buttonPanel, SWT.PUSH);
-    addButton.setText(UIPlugin.getResourceString("_UI_ADD_BUTTON"));
-    gridData = new GridData();
-    gridData.horizontalAlignment = GridData.FILL;
-    gridData.verticalAlignment = GridData.CENTER;
-    addButton.setLayoutData(gridData);
-    addButton.addSelectionListener(new ButtonSelectListener());
-    addButton.setToolTipText(
-        UIPlugin.getResourceString("_UI_ADD_BUTTON_TOOL_TIP"));
-    addButton.setEnabled(false);
-
-    removeButton = new Button(buttonPanel, SWT.PUSH);
-    removeButton.setText(UIPlugin.getResourceString("_UI_REMOVE_BUTTON"));
-    gridData = new GridData();
-    gridData.horizontalAlignment = GridData.FILL;
-    gridData.verticalAlignment = GridData.CENTER;
-    removeButton.setLayoutData(gridData);
-    removeButton.addSelectionListener(new ButtonSelectListener());
-    removeButton.setToolTipText(
-        UIPlugin.getResourceString("_UI_REMOVE_BUTTON_TOOL_TIP"));
-    removeButton.setEnabled(false);
-
-    removeAllButton = new Button(buttonPanel, SWT.PUSH);
-    removeAllButton.setText(UIPlugin.getResourceString("_UI_REMOVE_ALL_BUTTON"));
-    gridData = new GridData();
-    gridData.horizontalAlignment = GridData.FILL;
-    gridData.verticalAlignment = GridData.CENTER;
-    removeAllButton.setLayoutData(gridData);
-    removeAllButton.addSelectionListener(new ButtonSelectListener());
-    removeAllButton.setToolTipText(
-        UIPlugin.getResourceString("_UI_REMOVE_ALL_BUTTON_TOOL_TIP"));
-    removeAllButton.setEnabled(false);
-  }
-
-  private void createSelectedListBox(Composite parent) {
-    selectedListBox = new List(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-    selectedListBox.addSelectionListener(new SelectionListener() {
-      public void widgetDefaultSelected(SelectionEvent event) {
-      }
-
-      public void widgetSelected(SelectionEvent event) {
-        java.util.List list;
-        if (selectedListBox.getSelectionCount() > 0)
-          setRemoveButtonEnabled(true);
-        else
-          setRemoveButtonEnabled(false);
-        return;
-      }
-    });
-
-    GridData gd = new GridData(GridData.FILL_BOTH);
-    gd.widthHint = SIZING_LISTS_WIDTH;
-    gd.heightHint = SIZING_LISTS_HEIGHT;
-    selectedListBox.setLayoutData(gd);
-  }
-
-  void createImportButton(Composite parent) {
-    importButton = new Button(parent, SWT.PUSH);
-    importButton.setText(UIPlugin.getResourceString("_UI_IMPORT_BUTTON"));
-    
-    GridData gridData = new GridData();
-    gridData.horizontalAlignment = GridData.CENTER;
-    importButton.setLayoutData(gridData);
-    importButton.addSelectionListener(new SelectionListener() {
-      public void widgetDefaultSelected(SelectionEvent e) {
-      }
-
-      public void widgetSelected(SelectionEvent e) {
-        FileSystemImportWizard importWizard =
-          new FileSystemImportWizard();
-        importWizard.init(workbench, selection);
-        Shell shell = Display.getCurrent().getActiveShell();
-        WizardDialog wizardDialog =
-          new WizardDialog(shell, importWizard);
-        wizardDialog.create();
-        wizardDialog.open();
-        sourceFileViewer.refresh();
-      }
-    });
-    importButton.setToolTipText(
-        UIPlugin.getResourceString("_UI_IMPORT_BUTTON_TOOL_TIP"));
-  }
-
-  public void addSelectedFilesToTargetList() {
-    ISelection selection = sourceFileViewer.getSelection();
-
-    if (isValidSourceFileViewerSelection(selection)) {
-      java.util.List list = null;
-      if (selection instanceof IStructuredSelection) {
-        list = ((IStructuredSelection) selection).toList();
-
-        if (list != null) {
-          list = ((IStructuredSelection) selection).toList();
-          for (Iterator i = list.iterator(); i.hasNext();) {
-            IResource resource = (IResource) i.next();
-            if (resource instanceof IFile) {
-              // Check if its in the list. Don't add it if it is.
-              String resourceName =
-                resource.getFullPath().toString();
-              if (selectedListBox.indexOf(resourceName) == -1)
-                selectedListBox.add(resourceName);
-            }
-          }
-          setFiles(selectedListBox.getItems());
-        }
-
-        setAddButtonEnabled(false);
-
-        if (selectedListBox.getItemCount() > 0) {
-          removeAllButton.setEnabled(true);
-          if (isFileMandatory)
-            setPageComplete(true);
-          if (selectedListBox.getSelectionCount() > 0)
-            setRemoveButtonEnabled(true);
-          else
-            setRemoveButtonEnabled(false);
-        }
-      }
-    }
-  }
-
-  class ButtonSelectListener implements SelectionListener {
-    public void widgetDefaultSelected(SelectionEvent e) {
-    }
-
-    public void widgetSelected(SelectionEvent e) {
-      if (e.widget == addButton) {
-        addSelectedFilesToTargetList();
-      } else if (e.widget == removeButton) {
-        String[] strings = selectedListBox.getSelection();
-        int size = selectedListBox.getSelectionCount();
-        for (int i = 0; i < size; i++) {
-          selectedListBox.remove(strings[i]);
-        }
-        removeButton.setEnabled(false);
-        if (selectedListBox.getItemCount() == 0) {
-          removeAllButton.setEnabled(false);
-          if (isFileMandatory)
-            setPageComplete(false);
-        }
-        setFiles(selectedListBox.getItems());
-      } else if (e.widget == removeAllButton) {
-        selectedListBox.removeAll();
-        removeButton.setEnabled(false);
-        removeAllButton.setEnabled(false);
-        if (isFileMandatory)
-          setPageComplete(false);
-        setFiles(selectedListBox.getItems());
-      }
-    }
-  }
-}
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/viewers/SelectSingleFilePage.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/viewers/SelectSingleFilePage.java
deleted file mode 100644
index 78af295..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/viewers/SelectSingleFilePage.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 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
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *******************************************************************************/
-package org.eclipse.wst.common.ui.internal.viewers;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.IWorkbench;
-//import org.eclipse.ui.help.WorkbenchHelp;
-
-public class SelectSingleFilePage extends WizardPage
-{
-  protected IWorkbench workbench;
-  protected SelectSingleFileView selectSingleFileView;
-  
-  // parameter isFileMandatory is used to determine if a file must be selected  
-  // before being able to proceed to the next page
-  public SelectSingleFilePage(IWorkbench workbench, IStructuredSelection selection, boolean isFileMandatory)
-  {
-    super("SelectSingleFilePage");
-    this.workbench = workbench;           
-    selectSingleFileView = new SelectSingleFileView(selection, isFileMandatory);    
-  }
-
-  public void setVisible(boolean visible)
-  {
-    selectSingleFileView.setVisibleHelper(visible);
-    super.setVisible(visible);
-  }
-
-  public void createControl(Composite parent)
-  {                          
-    SelectSingleFileView.Listener listener = new SelectSingleFileView.Listener()
-    {                                             
-      public void setControlComplete(boolean isComplete)
-      {
-        setPageComplete(isComplete);
-      }
-    };
-    selectSingleFileView.setListener(listener);
-    Control control = selectSingleFileView.createControl(parent);
-//    WorkbenchHelp.setHelp(control, B2BGUIContextIds.BTBG_SELECT_SINGLE_FILE_PAGE);
-    setControl(control);
-  }  
-
-  public void addFilter(ViewerFilter filter) 
-  { 
-    selectSingleFileView.addFilter(filter);
-  }
-
-  public void addFilterExtensions(String[] filterExtensions)
-  { 
-    selectSingleFileView.addFilterExtensions(filterExtensions);
-  }     
-
-  public void resetFilters()
-  {    
-    selectSingleFileView.resetFilters();
-  }
-  
-  public IFile getFile()
-  {  
-    return selectSingleFileView.getFile();
-  }
-  
-  
-  /**
-   * Returns the selectSingleFileView.
-   * @return SelectSingleFileView
-   */
-  public TreeViewer getSourceFileViewer() {
-    return selectSingleFileView.sourceFileViewer;
-  }
-
-  /**
-   * Returns the selectSingleFileView.
-   * @return SelectSingleFileView
-   */
-  public SelectSingleFileView getSelectSingleFileView() {
-    return selectSingleFileView;
-  }
-}
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/viewers/SelectSingleFileView.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/viewers/SelectSingleFileView.java
deleted file mode 100644
index b63c506..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/viewers/SelectSingleFileView.java
+++ /dev/null
@@ -1,400 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 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
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *******************************************************************************/
-package org.eclipse.wst.common.ui.internal.viewers;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Vector;
-
-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.ResourcesPlugin;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-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.ViewerFilter;
-import org.eclipse.jface.wizard.WizardDialog;
-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.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.model.WorkbenchContentProvider;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-import org.eclipse.ui.wizards.datatransfer.FileSystemImportWizard;
-import org.eclipse.wst.common.ui.internal.UIPlugin;
-
-    
-
-public class SelectSingleFileView
-{                                
-  protected Composite            composite;
-  protected IStructuredSelection selection;
-  protected boolean              isFileMandatory;
-  protected TreeViewer           sourceFileViewer;
-  protected Button               importButton;
-  protected Vector               fFilters;
-  protected IFile                selectedFile;
-  protected ISelection           defaultSelection;  
-  protected Listener             listener;
-  
-  public static interface Listener
-  {
-    public void setControlComplete(boolean isComplete); 
-  }
-
-  public SelectSingleFileView(IStructuredSelection selection, boolean isFileMandatory)
-  {                      
-    this.selection = selection;
-    this.isFileMandatory = isFileMandatory;
-    this.selectedFile= null;
-    this.defaultSelection = null;      
-  }                              
-
-  public Composite createControl(Composite parent)
-  {              
-    Composite composite = new Composite(parent, SWT.NONE);
-    composite.setLayout(new GridLayout());
-    composite.setLayoutData(new GridData(GridData.FILL_BOTH));
-	Label label = new Label(composite, SWT.NONE);
-	label.setText(UIPlugin.getResourceString("_UI_LABEL_SOURCE_FILES"));
-    createSourceViewer(composite);
-	  createFilterControl(composite);   
-    createImportButton(composite);  
-    return composite;
-  }
-
-
-  protected void createFilterControl(Composite composite) 
-  {	
-  } 
-
-public void setListener(Listener listener)
-  {
-    this.listener = listener;
-  }  
-
-  protected void createSourceViewer(Composite parent)
-  {
-    sourceFileViewer = new TreeViewer(new Tree(parent, SWT.SINGLE | SWT.BORDER));
-    sourceFileViewer.setContentProvider(new WorkbenchContentProvider());
-    sourceFileViewer.setLabelProvider(new WorkbenchLabelProvider());
-    sourceFileViewer.addSelectionChangedListener(new ISelectionChangedListener() 
-    {
-      public void selectionChanged(SelectionChangedEvent event) 
-      {                  
-        boolean isComplete = true;
-        java.util.List list;
-        ISelection selection = event.getSelection();
-        if (selection instanceof IStructuredSelection) 
-        {
-          list = ((IStructuredSelection)selection).toList();
-          for (Iterator i = list.iterator(); i.hasNext();)
-          {
-            IResource resource = (IResource) i.next();
-            if (resource instanceof IFile) 
-            {
-              selectedFile = (IFile) resource;
-              if (isFileMandatory) 
-              {                                   
-                isComplete = true;
-                break;     
-              }                                   
-            }            
-            else 
-            {
-              selectedFile = null;
-              if (isFileMandatory) 
-              {            
-                isComplete = false;
-              }
-            }
-          } 
-          
-          if (listener != null)
-          {           
-            listener.setControlComplete(isComplete);
-          }
-        }
-      }	
-    });
-    Control treeWidget = sourceFileViewer.getTree();
-    GridData gd = new GridData(GridData.FILL_BOTH);
-    treeWidget.setLayoutData(gd);
-  }
-  
-                                        
-  protected void createImportButton(Composite parent)
-  {   
-    importButton = new Button(parent, SWT.NONE);
-    importButton.setText(UIPlugin.getResourceString("_UI_IMPORT_BUTTON"));
-    
-    GridData gridData = new GridData();    
-    gridData.horizontalAlignment = GridData.CENTER;
-    importButton.setLayoutData(gridData);
-    importButton.addSelectionListener(new SelectionListener()
-    {
-      public void widgetDefaultSelected(SelectionEvent e)
-      {
-      }
-
-      public void widgetSelected(SelectionEvent e)
-      {                 
-        // This listener is if the Import Wizard adds a new few, we want
-        // it to be selected when we come back from it
-        ImportAddResourceListener importAddResourceListener= new ImportAddResourceListener();
-        
-        ResourcesPlugin.getWorkspace().addResourceChangeListener(importAddResourceListener);
-          
-        FileSystemImportWizard importWizard = new FileSystemImportWizard();
-        IWorkbench workbench = UIPlugin.getDefault().getWorkbench();
-        selection = (IStructuredSelection) sourceFileViewer.getSelection();
-        importWizard.init(workbench, selection != null ? selection : new StructuredSelection());
-        Shell shell = Display.getCurrent().getActiveShell();
-        WizardDialog wizardDialog = new WizardDialog(shell, importWizard);
-        wizardDialog.create();
-        wizardDialog.open();
-        sourceFileViewer.refresh();
-        ResourcesPlugin.getWorkspace().removeResourceChangeListener(importAddResourceListener);
-        IFile importedFile = importAddResourceListener.getImportedFile();
-        if (importedFile != null) 
-        {          
-          StructuredSelection structuredSelection = new StructuredSelection(importedFile);
-          sourceFileViewer.setSelection(structuredSelection);
-        }
-      }
-    });                  
-    importButton.setToolTipText(UIPlugin.getResourceString("_UI_IMPORT_BUTTON_TOOL_TIP"));
-  } 
-
-  public IFile getFile()
-  {
-    return selectedFile;
-  }
-
-  public void setDefaultSelection(ISelection selection)
-  {
-    this.defaultSelection = selection;
-  } 
-
-  public void resetFilters()
-  {
-    fFilters=null;
-  }
-
-  public void addFilter(ViewerFilter filter) 
-  {
-    if (fFilters == null)
-    {
-      fFilters= new Vector();
-    }
-    fFilters.add(filter);
-  }
-
-  // This is a convenience method that allows filtering of the given file
-  // exensions. It internally creates a ResourceFilter so that users of this
-  // class don't have to construct one.
-  // If the extensions provided don't have '.', one will be added.
-  public void addFilterExtensions(String[] filterExtensions)
-  {
-    // First add the '.' to the filterExtensions if they don't already have one
-    String[] correctedFilterExtensions = new String[filterExtensions.length];
-    for (int i=0; i < filterExtensions.length; i++) 
-    {
-      // If the extension doesn't start with a '.', then add one.
-      if (filterExtensions[i].startsWith("."))
-      {
-        correctedFilterExtensions[i] = filterExtensions[i];
-      }
-      else
-      {
-        correctedFilterExtensions[i] = "." + filterExtensions[i];
-      }
-    }
-
-    ViewerFilter filter = new ResourceFilter(correctedFilterExtensions, null);
-    addFilter(filter);
-  }                     
-
-// This is a convenience method that allows filtering of the given file
-// exensions. It internally creates a ResourceFilter so that users of this
-// class don't have to construct one.
-// If the extensions provided don't have '.', one will be added.
-  public void addFilterExtensions(String[] filterExtensions, IFile [] excludedFiles)
-  {
-    // First add the '.' to the filterExtensions if they don't already have one
-    String[] correctedFilterExtensions = new String[filterExtensions.length];
-    for (int i=0; i < filterExtensions.length; i++)
-    {
-      // If the extension doesn't start with a '.', then add one.
-      if (filterExtensions[i].startsWith("."))
-      {
-        correctedFilterExtensions[i] = filterExtensions[i];
-      }
-      else
-      {
-        correctedFilterExtensions[i] = "." + filterExtensions[i];
-      }
-    }
-    ViewerFilter filter;
-    if (excludedFiles != null)
-    {
-      filter = new ResourceFilter(correctedFilterExtensions, excludedFiles, null);
-    }
-    else
-    {
-      filter = new ResourceFilter(correctedFilterExtensions, null);
-    }
-    addFilter(filter);
-  }
-  
-  // This is a convenience method that allows filtering of the given file
-  // exensions. It internally creates a ResourceFilter so that users of this
-  // class don't have to construct one.
-  // If the extensions provided don't have '.', one will be added.
-  public void setFilterExtensions(String[] filterExtensions)
-  {
-	// First add the '.' to the filterExtensions if they don't already have one
-	String[] correctedFilterExtensions = new String[filterExtensions.length];
-	for (int i=0; i < filterExtensions.length; i++) 
-	{		
-	  // If the extension doesn't start with a '.', then add one.
-	  if (filterExtensions[i].startsWith("."))
-	  {
-		correctedFilterExtensions[i] = filterExtensions[i];
-	  }
-	  else
-	  {
-		correctedFilterExtensions[i] = "." + filterExtensions[i];
-	  }
-	}
-	ViewerFilter filter = new ResourceFilter(correctedFilterExtensions, null);
-    fFilters= new Vector();
-	fFilters.add(filter);
-	if (sourceFileViewer != null)
-	{	
-	  sourceFileViewer.getTree().setRedraw(false);
-      sourceFileViewer.resetFilters();
-      for (Iterator i=fFilters.iterator(); i.hasNext();)
-      {     
-	    sourceFileViewer.addFilter((ViewerFilter)i.next());
- 	  }
-	  sourceFileViewer.getTree().setRedraw(true);
-	  sourceFileViewer.getTree().redraw();
-	}	
-  }     
-                                 
-  // this method should be called by a Wizard page or Dialog when it becomes visible
-  public void setVisibleHelper(boolean visible)
-  {    
-    if (visible == true) 
-    {
-      if (fFilters != null) 
-      {
-        sourceFileViewer.resetFilters();
-        for (Iterator i=fFilters.iterator(); i.hasNext();) 
-       	  sourceFileViewer.addFilter((ViewerFilter)i.next());
-      }
-      sourceFileViewer.setInput(ResourcesPlugin.getWorkspace().getRoot());
-      sourceFileViewer.expandToLevel(2);
-
-      if (defaultSelection != null) 
-      {
-        sourceFileViewer.setSelection(defaultSelection, true);        
-      }   
-      else if (!sourceFileViewer.getSelection().isEmpty())
-      {     
-        sourceFileViewer.setSelection(sourceFileViewer.getSelection());
-      } 
-      else
-      {                         
-        if (isFileMandatory && listener != null)
-        {           
-          listener.setControlComplete(false);
-        }
-      }         
-    }                                   
-  }
-  
-  class ImportAddResourceListener implements IResourceChangeListener, IResourceDeltaVisitor
-  {
-	Vector importedFiles;
-
-	ImportAddResourceListener()
-	{
-	  importedFiles = new Vector(); 
-	}
-  
-	public void resourceChanged(IResourceChangeEvent event)
-	{
-	  IResourceDelta resourceDelta = event.getDelta();
-    
-	  try
-	  {
-		if (resourceDelta != null) 
-		{
-		  resourceDelta.accept(this);
-		}
-	  }
-	  catch (Exception e)
-	  {
-		//TODO... log exception
-		//UIPlugin.getMsgLogger().write("Exception caught during resource change" + e);
-		//UIPlugin.getMsgLogger().writeCurrentThread(); 
-	  }      
-	}
-
-	public boolean visit(IResourceDelta delta)
-	{
-	  if (delta.getKind() == IResourceDelta.ADDED)
-	  {
-		if (delta.getResource() instanceof IFile) 
-		  importedFiles.add(delta.getResource());
-	  }
-	  return true;
-	}
-
-	public Collection getImportedFiles()
-	{
-	  return importedFiles;
-	}
-    
-	// This returns the first imported file in the list of imported files
-	public IFile getImportedFile()
-	{
-	  if (importedFiles.isEmpty() == false) 
-		return (IFile)importedFiles.firstElement();
-  
-	  return null;
-	}
-  }  
-  
-  public void addSelectionChangedTreeListener(ISelectionChangedListener treeListener) {
-  	sourceFileViewer.addSelectionChangedListener(treeListener);
-  }
-}              
-
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/viewers/TableNavigator.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/viewers/TableNavigator.java
deleted file mode 100644
index e729cfb..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/viewers/TableNavigator.java
+++ /dev/null
@@ -1,409 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 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
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *******************************************************************************/
-package org.eclipse.wst.common.ui.internal.viewers;
-
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.*;
-
-import org.eclipse.swt.custom.TableCursor;
-import org.eclipse.swt.custom.TableTreeItem;
-import org.eclipse.jface.viewers.*;
-
-
-  /**
-   * Adds a TableCursor to a StructuredViewer - for keyboard navigation of the table
-   * The intent of this class is to provide the standard listeners for using F2 to
-   * activate cell editors.
-   *
-   * Due to a current bug in the TableCursor, TableViewers using this class must make
-   * a call similar to the TableNavigator method moveCellEditorsAbove(cellEditors)
-   * whenever a setCellEditors call is made in the StructuredViewer.  This is so that the
-   * cell editor control shows up above the table cursor control.
-   */
-
-public class TableNavigator extends TableCursor
-{
-  private static final String TABLETREEITEM_ID = "TableTreeItemID";
-
-   final Table table;
-
-   public TableNavigator(Table table, StructuredViewer viewer)
-   {
-      super(table, SWT.NONE);
-      this.table = table;
-      final Table currentTable = table;
-      final StructuredViewer sViewer = viewer;
-
-      // Linux index out of bounds fix.  See defect 253429, 253433, and more
-      setVisible(false);
-
-      addPaintListener(viewer);
-      addKeyListeners(viewer);
-      addMouseListeners(viewer);
-      addSelectionListener(new SelectionAdapter()
-      {
-      	/**
-		 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(SelectionEvent)
-		 */
-		public void widgetSelected(SelectionEvent e) {
-			super.widgetSelected(e);
-			     if (sViewer instanceof TableTreeViewer)
-                 {
-                   TableTreeItem tableTreeItem = (TableTreeItem)getRow().getData(TABLETREEITEM_ID);
-                   StructuredSelection selection = new StructuredSelection(tableTreeItem.getData());
-                   sViewer.setSelection(selection, true);
-                 }
-		}
-
-
-      });
-      addFocusListener(new FocusAdapter(){
-         public void focusGained(FocusEvent e)
-         {
-         	// if e.source is not a child of the table then set selection - this is for tab into viewer
-         	Object eventSource = e.getSource();
-         	if (eventSource instanceof Control)
-         	{
-         	if (!isChild(currentTable, (Control)eventSource))
-         	{
-         	  if (currentTable.getItemCount() > 0 && currentTable.getSelectionCount() <= 0)
-              {
-                 if (sViewer instanceof TableTreeViewer)
-                 {
-                   TableTreeItem tableTreeItem = (TableTreeItem)getRow().getData(TABLETREEITEM_ID);
-                   StructuredSelection selection = new StructuredSelection(tableTreeItem.getData());
-                   sViewer.setSelection(selection, true);
-                 }
-                 else
-                 {
-               	   currentTable.setSelection(0); 
-               	   setSelection(0,0);
-                 }              
-              }              
-       	    }
-       	    else 
-       	    {
-       	      if (currentTable.getItems().length > 0)
-       	      {
-       	      	 // cursor can end up on a non-existent table row 
-       	         //   currently no way to get the current table cursor row 
-       	      	 //   so for now just catch the exception since it doesn't
-       	      	 //   cause any side effects.
-       	      	 try
-       	      	 {
-                   setVisible(true);
-       	      	 }
-       	      	 catch (Exception ee)
-       	      	 {     	            	      	
-       	      		currentTable.setSelection(0);       	      		         
-       	      		setSelection(0,0);
-       	      	 }
-       	       }       	    
-       	       else  // do not show table cursor if there are no elements in the table - avoid repaint
-       	       {
-       	         setVisible(false);
-       	       }
-              }
-         	}          
-          }
-          
-          protected boolean isChild(Control parent, Control child)
-          {
-            Control tempChild = child;
-            while (tempChild != null)
-            {
-              if (tempChild == parent)
-              {
-                return true;
-              }
-              tempChild = tempChild.getParent();
-            }
-            return false;
-          }
-          
-          /**
-           * @see org.eclipse.swt.events.FocusAdapter#focusLost(FocusEvent)
-           */
-          public void focusLost(FocusEvent e)
-          {
-            // Set the table navigator to be not visible if the the table
-            // is not in focus and a child of the table is not in focus
-            // note that we do this asynchronously so we don't mess up the
-            // current focus handling.
-            Display.getDefault().asyncExec(new Runnable()
-            { 
-              /**
-               * @see java.lang.Runnable#run()
-               */
-              public void run()
-              {
-                if (currentTable != null && !currentTable.isDisposed() && !currentTable.isFocusControl() &&
-                    !isChild(currentTable, Display.getDefault().getFocusControl()))
-                {
-                  setVisible(false);
-                }
-              }
-            });
-          }
-
-      }); 
-      
-     
-      
-
-      table.addFocusListener(new FocusAdapter()
-      {
-        /**
-         * @see org.eclipse.swt.events.FocusListener#focusGained(FocusEvent)
-         */
-        public void focusGained(FocusEvent e)
-        {
-          // only display navigator if there are items in the table 
-          // and if the focus wasn't gained from our own table navigator
-          // (ie focus came from outside)
-          if (currentTable.getItemCount() > 0 &&
-              (Display.getDefault().getFocusControl() != null) &&
-              !Display.getDefault().getFocusControl().equals(TableNavigator.this))
-          {
-            // note that we do this asynchronously so we don't mess up the
-            // current focus handling.
-            Display.getDefault().asyncExec(new Runnable()            
-            {
-              /**
-               * @see java.lang.Runnable#run()
-               */
-              public void run()
-              {
-                if (!isVisible())
-                {
-                  try
-                  {
-                    setVisible(true);
-                    setFocus();
-                  }
-                  catch (Exception e)
-                  {
-                      // catch IllegalArgumentExceptions here - index out of bounds on tableviewer
-                      if (currentTable.getItemCount() > 0)
-                      {
-                      currentTable.setSelection(0);                     
-                      setSelection(0,0);                   
-                      }
-                      else  // do not show table cursor if there are no elements in the table - avoid repaint
-                      {
-                        setVisible(false);
-                      }
-                  }
-                }
-              }
-            });
-          }
-        }
-      });           
-   }
-
-   public Table getTable()
-   {
-     return table;
-   }
-
-    public void addPaintListener(StructuredViewer viewer)
-    {
-      final StructuredViewer tableViewer = viewer;
-
-      addPaintListener(new PaintListener() 
-      {
-         public void paintControl(PaintEvent e)
-         {
-         	TableItem[] selection = table.getSelection();
-            final TableItem row = (selection.length == 0) ? table.getItem(table.getTopIndex()) : selection[0];
-            final String cellText = row.getText(getColumn());
-            final Image cellImage = row.getImage(getColumn());
-            final int col = getColumn();
-
-            Display.getCurrent().asyncExec(new Runnable()
-            {
-               public void run()
-               {
-                  if (!row.isDisposed())
-                  {
-                     String newText = row.getText(getColumn());
-                     TableItem cursorRow = getRow();
-                     if (!newText.equals(cellText) || !(row.getImage(col) == cellImage)) 
-                     {
-                       redraw();
-                     }
-                  }
-                }
-             });
-           }
-       });
-    }
-
-
-    public SelectionKeyAdapter getKeyAdapter(StructuredViewer viewer)
-    {
-        if (keyAdapter == null)
-        {
-           return new SelectionKeyAdapter(viewer);
-        }
-        else return keyAdapter;
-    }
-
-    public void setKeyAdapter(SelectionKeyAdapter kAdapter)
-    {
-       keyAdapter = kAdapter;
-    }
-
-    protected SelectionKeyAdapter keyAdapter = null;
-
-    public class SelectionKeyAdapter extends KeyAdapter
-    {
-       StructuredViewer structuredViewer;
-
-       public SelectionKeyAdapter(StructuredViewer viewer)
-       {
-          super();
-          this.structuredViewer = viewer;
-       }
-
-       int lastKeyPressed = -1;  // used to cache the last key for key combos
-
-       public void keyPressed(KeyEvent e) 
-       {       	
-               TableItem row = getRow();
-               int column = getColumn();                
-
-               // hack to emulate SHIFT+F10 popup menu - otherwise table cursor
-               //   obscures the table popup mechanism and it doesn't work.
-               if (lastKeyPressed == SWT.SHIFT && e.keyCode == SWT.F10)
-               {
-                  Menu popup = getTable().getMenu();
-                  popup.setVisible(true);
-               }
-               lastKeyPressed = e.keyCode;
-               
-               //jvh - look for + or - key
-               // column == 0
-               if (row.getData(TABLETREEITEM_ID) instanceof TableTreeItem)
-               {
-	               if (column == 0 && e.character == '+') 
-	               {
-               	  	  TableTreeItem tableTreeItem = (TableTreeItem)row.getData(TABLETREEITEM_ID);	               	
-	               	  ((TableTreeViewer)structuredViewer).setExpandedState(tableTreeItem.getData(), true);                       
-	               	  refresh();
-	               }
-	               else if (column == 0 && e.character == '-') 
-	               {
-	               	  TableTreeItem tableTreeItem = (TableTreeItem)row.getData(TABLETREEITEM_ID);	               	
-	               	  ((TableTreeViewer)structuredViewer).setExpandedState(tableTreeItem.getData(), false);                       
-                      refresh();
-	               }               
-               }
-               // use F2 to invoke editing for a cell
-               if (e.keyCode == SWT.F2)     
-               {
-               	  if (structuredViewer instanceof TableViewer)
-               	  {
-                    ((TableViewer)structuredViewer).editElement(row.getData(), column);   
-               	  }
-               	  else if (structuredViewer instanceof TableTreeViewer)
-               	  {  
-               	  	  TableTreeItem tableTreeItem = (TableTreeItem)row.getData(TABLETREEITEM_ID);
-               	  	 ((TableTreeViewer)structuredViewer).editElement(tableTreeItem.getData(), column);   
-               	  }
-               }
-        }
-    }
-
-    public void addKeyListeners(StructuredViewer viewer)
-    {
-      final StructuredViewer structuredViewer = viewer;
-                     
-      addKeyListener(getKeyAdapter(structuredViewer));
-    }      
-    
-   public void addMouseListeners(StructuredViewer viewer)
-   {
-      final StructuredViewer structuredViewer = viewer;
-
-      addMouseListener(new MouseAdapter()
-      {
-
-         public void mouseUp(MouseEvent e) 
-         {        
-               TableItem row = getRow();
-               int column = getColumn(); 
-         
-               // use mouse button 1 to invoke editing for a cell
-               if (e.button == 1)     
-               {
-                  if (structuredViewer instanceof TableViewer)
-                        {
-                     ((TableViewer)structuredViewer).editElement(row.getData(), column);   
-                        }
-                        else if (structuredViewer instanceof TableTreeViewer && column == 1)
-                        {
-                                 TableTreeItem tableTreeItem = (TableTreeItem)row.getData(TABLETREEITEM_ID);
-                                ((TableTreeViewer)structuredViewer).editElement(tableTreeItem.getData(), column);   
-                        }                                               
-               
-                 if (structuredViewer instanceof TableTreeViewer && row.getData(TABLETREEITEM_ID) instanceof TableTreeItem)
-                 {              
-                                   if (column == 0)
-                                   {
-                                    TableTreeItem tableTreeItem = (TableTreeItem)row.getData(TABLETREEITEM_ID);                             
-                                          boolean expandState = tableTreeItem.getExpanded();
-                       ((TableTreeViewer)structuredViewer).setExpandedState(tableTreeItem.getData(), !expandState);
-                       refresh();
-                    }
-                 }
-               }          
-            }
-      });
-     }
-
-
-  /**
-   * Ensure that cell editor control shows up above the table cursor control.
-   * Should be called whenever the table viewer makes a new call to setCellEditors
-   * i.e. in constructor and in refreshCellEditors
-   *
-   * @param - array of cell editors for the StructuredViewer
-   */
-
-  public void moveCellEditorsAbove(CellEditor[] editorArray)
-  {
-    for (int i = 0; i < editorArray.length ; i++)
-    {
-      CellEditor cEd = editorArray[i];
-      if (cEd != null && cEd.getControl() != null)
-      {
-        cEd.getControl().moveAbove(null);
-      }
-    }
-  }
-
-  public void refresh()
-  {
-     Display.getCurrent().asyncExec(new Runnable()
-     {
-        public void run()
-        {
-           if (!isDisposed() && isVisible())
-             redraw();
-        }
-     });
-  }
-}
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/provisional/editors/PostMultiPageEditorSite.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/provisional/editors/PostMultiPageEditorSite.java
deleted file mode 100644
index da78acd..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/provisional/editors/PostMultiPageEditorSite.java
+++ /dev/null
@@ -1,100 +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
- *******************************************************************************/
-package org.eclipse.wst.common.ui.provisional.editors;
-
-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.ui.IEditorPart;
-import org.eclipse.ui.part.MultiPageEditorPart;
-import org.eclipse.ui.part.MultiPageEditorSite;
-
-public class PostMultiPageEditorSite extends MultiPageEditorSite {
-	/**
-	 * The post selection change listener, initialized lazily;
-	 * <code>null</code> if not yet created.
-	 */
-	private ISelectionChangedListener postSelectionChangedListener = null;
-
-	public PostMultiPageEditorSite(MultiPageEditorPart multiPageEditor, IEditorPart editor) {
-		super(multiPageEditor, editor);
-	}
-
-	/**
-	 * Returns the selection changed listener which listens to the nested
-	 * editor's post selection changes, and calls
-	 * <code>handlePostSelectionChanged</code>.
-	 * 
-	 * @return the selection changed listener
-	 */
-	private ISelectionChangedListener getPostSelectionChangedListener() {
-		if (postSelectionChangedListener == null) {
-			postSelectionChangedListener = new ISelectionChangedListener() {
-				public void selectionChanged(SelectionChangedEvent event) {
-					PostMultiPageEditorSite.this.handlePostSelectionChanged(event);
-				}
-			};
-		}
-		return postSelectionChangedListener;
-	}
-
-	/**
-	 * Handles a post selection changed event from the nested editor. The
-	 * default implementation gets the selection provider from the multi-page
-	 * editor's site, and calls <code>firePostSelectionChanged</code> on it
-	 * (only if it is an instance of <code>MultiPageSelectionProvider</code>),
-	 * passing a new event object.
-	 * <p>
-	 * Subclasses may extend or reimplement this method.
-	 * </p>
-	 * 
-	 * @param event
-	 *            the event
-	 */
-	protected void handlePostSelectionChanged(SelectionChangedEvent event) {
-		ISelectionProvider parentProvider = getMultiPageEditor().getSite().getSelectionProvider();
-		if (parentProvider instanceof PostMultiPageSelectionProvider) {
-			SelectionChangedEvent newEvent = new SelectionChangedEvent(parentProvider, event.getSelection());
-			((PostMultiPageSelectionProvider) parentProvider).firePostSelectionChanged(newEvent);
-		}
-	}
-
-	/**
-	 * The <code>MultiPageEditorSite</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 and <code>handlePostSelectionChanged</code> when a post
-	 * selection changed event occurs.
-	 * 
-	 * @param provider
-	 *            The selection provider.
-	 * @see PostMultiPageEditorSite#handleSelectionChanged(SelectionChangedEvent)
-	 */
-	public void setSelectionProvider(ISelectionProvider provider) {
-		ISelectionProvider oldSelectionProvider = getSelectionProvider();
-		if (oldSelectionProvider != null) {
-			if (oldSelectionProvider instanceof IPostSelectionProvider) {
-				((IPostSelectionProvider) oldSelectionProvider).removePostSelectionChangedListener(getPostSelectionChangedListener());
-			}
-		}
-
-		super.setSelectionProvider(provider);
-
-		if (provider != null) {
-			if (provider instanceof IPostSelectionProvider) {
-				((IPostSelectionProvider) provider).addPostSelectionChangedListener(getPostSelectionChangedListener());
-			}
-		}
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/provisional/editors/PostMultiPageSelectionProvider.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/provisional/editors/PostMultiPageSelectionProvider.java
deleted file mode 100644
index acdf9df..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/provisional/editors/PostMultiPageSelectionProvider.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.common.ui.provisional.editors;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.util.ListenerList;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jface.viewers.IPostSelectionProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.ui.part.MultiPageEditorPart;
-import org.eclipse.ui.part.MultiPageSelectionProvider;
-
-public class PostMultiPageSelectionProvider extends MultiPageSelectionProvider implements IPostSelectionProvider {
-	private ListenerList postListeners;
-
-	public PostMultiPageSelectionProvider(MultiPageEditorPart multiPageEditor) {
-		super(multiPageEditor);
-		postListeners = new ListenerList();
-	}
-
-	public void addPostSelectionChangedListener(ISelectionChangedListener listener) {
-		postListeners.add(listener);
-	}
-
-	public void firePostSelectionChanged(final SelectionChangedEvent event) {
-		Object[] listeners = postListeners.getListeners();
-		for (int i = 0; i < listeners.length; ++i) {
-			final ISelectionChangedListener pl = (ISelectionChangedListener) listeners[i];
-			Platform.run(new SafeRunnable() {
-				public void run() {
-					pl.selectionChanged(event);
-				}
-			});
-		}
-	}
-
-	public void removePostSelectionChangedListener(ISelectionChangedListener listener) {
-		postListeners.remove(listener);
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/provisional/editors/PostSelectionMultiPageEditorPart.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/provisional/editors/PostSelectionMultiPageEditorPart.java
deleted file mode 100644
index 00da77b..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/provisional/editors/PostSelectionMultiPageEditorPart.java
+++ /dev/null
@@ -1,44 +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
- *******************************************************************************/
-package org.eclipse.wst.common.ui.provisional.editors;
-
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.part.MultiPageEditorPart;
-
-/**
- * Adds posts selection notifications from contained editor parts to
- * listeners. This part was created as a workaround for
- * https://bugs.eclipse.org/bugs/show_bug.cgi?id=108324 and will be removed
- * once WTP is building on a platform milestone that includes a fix.
- */
-public abstract class PostSelectionMultiPageEditorPart extends MultiPageEditorPart {
-	public void init(IEditorSite site, IEditorInput input) throws PartInitException {
-		super.init(site, input);
-		site.setSelectionProvider(new PostMultiPageSelectionProvider(this));
-	}
-
-	protected void pageChange(int newPageIndex) {
-		super.pageChange(newPageIndex);
-		IEditorPart activeEditor = getEditor(newPageIndex);
-		if (activeEditor != null) {
-			ISelectionProvider selectionProvider = activeEditor.getSite().getSelectionProvider();
-			if (selectionProvider != null) {
-				SelectionChangedEvent event = new SelectionChangedEvent(selectionProvider, selectionProvider.getSelection());
-				((PostMultiPageSelectionProvider) getSite().getSelectionProvider()).firePostSelectionChanged(event);
-			}
-		}
-	}
-}
diff --git a/plugins/org.eclipse.wst.validation.ui/.classpath b/plugins/org.eclipse.wst.validation.ui/.classpath
deleted file mode 100644
index 1c68a63..0000000
--- a/plugins/org.eclipse.wst.validation.ui/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="validateui/"/>
-	<classpathentry kind="src" path="property_files"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/plugins/org.eclipse.wst.validation.ui/.cvsignore b/plugins/org.eclipse.wst.validation.ui/.cvsignore
deleted file mode 100644
index 994d5a2..0000000
--- a/plugins/org.eclipse.wst.validation.ui/.cvsignore
+++ /dev/null
@@ -1,6 +0,0 @@
-bin
-temp.folder
-build.xml
-runtime
-@dot
-src.zip
diff --git a/plugins/org.eclipse.wst.validation.ui/.project b/plugins/org.eclipse.wst.validation.ui/.project
deleted file mode 100644
index 32471f6..0000000
--- a/plugins/org.eclipse.wst.validation.ui/.project
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.validation.ui</name>
-	<comment></comment>
-	<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.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/plugins/org.eclipse.wst.validation.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.validation.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index abc5772..0000000
--- a/plugins/org.eclipse.wst.validation.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,21 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Validation Framework UI
-Bundle-SymbolicName: org.eclipse.wst.validation.ui; singleton:=true
-Bundle-Version: 1.0.1.qualifier
-Bundle-Activator: org.eclipse.wst.validation.internal.ui.plugin.ValidationUIPlugin
-Bundle-Vendor: Eclipse.org
-Bundle-Localization: plugin
-Export-Package: .,
- org.eclipse.wst.validation.internal.ui,
- org.eclipse.wst.validation.internal.ui.plugin
-Require-Bundle: org.eclipse.ui.ide,
- org.eclipse.core.resources,
- org.eclipse.ui,
- org.eclipse.swt,
- org.eclipse.wst.common.frameworks.ui,
- org.eclipse.core.runtime,
- org.eclipse.wst.common.frameworks,
- org.eclipse.wst.validation,
- org.eclipse.jem.util
-Eclipse-AutoStart: true
diff --git a/plugins/org.eclipse.wst.validation.ui/about.html b/plugins/org.eclipse.wst.validation.ui/about.html
deleted file mode 100644
index 6f6b96c..0000000
--- a/plugins/org.eclipse.wst.validation.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>February 24, 2005</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/plugins/org.eclipse.wst.validation.ui/build.properties b/plugins/org.eclipse.wst.validation.ui/build.properties
deleted file mode 100644
index caced11..0000000
--- a/plugins/org.eclipse.wst.validation.ui/build.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2004 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-# IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes = .,\
-               plugin.xml,\
-               plugin.properties,\
-               META-INF/,\
-               about.html
-source.. = validateui/,\
-                                property_files/
-output.. = bin/
diff --git a/plugins/org.eclipse.wst.validation.ui/build/buildcontrol.properties b/plugins/org.eclipse.wst.validation.ui/build/buildcontrol.properties
deleted file mode 100644
index 5938f6c..0000000
--- a/plugins/org.eclipse.wst.validation.ui/build/buildcontrol.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2004 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-# IBM Corporation - initial API and implementation
-###############################################################################
-CONTACT=ruthdaly@ca.ibm.com
-ComponentShortName=validationui
-ComponentFullName=Validation Framework UI
-ComponentCompetency=Validation
-JavaCompile.1=srcjar
-BuildVerification.1=dir
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation.ui/build/package.xml b/plugins/org.eclipse.wst.validation.ui/build/package.xml
deleted file mode 100644
index 0ae0c31..0000000
--- a/plugins/org.eclipse.wst.validation.ui/build/package.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<project name="com.ibm.etools.validation.ui" default="packagingPlugin" basedir="./..">
-    <target name="init">
-        <property name="packageDir" value=""/>
-        <property name="plugin.directory"  value="${basedir}"/>
-        <property name="plugin.id" value="com.ibm.etools.validation.ui"/>
-        <property name="plugin.version"  value=""/>
-    </target>
-    <target name="packagingPlugin" depends="init">
-        <echo message="${plugin.id}"/>
-        <copy todir="${packageDir}/plugins/${plugin.id}_${plugin.version}">
-            <fileset dir="${plugin.directory}">
-                <include name="plugin.properties"/>
-                <include name="plugin.xml"/>
-                <include name="runtime/validateui.jar"/>
-            </fileset>
-        </copy>
-    </target>
-</project>
diff --git a/plugins/org.eclipse.wst.validation.ui/build/sourcejar.txt b/plugins/org.eclipse.wst.validation.ui/build/sourcejar.txt
deleted file mode 100644
index b96f41c..0000000
--- a/plugins/org.eclipse.wst.validation.ui/build/sourcejar.txt
+++ /dev/null
@@ -1 +0,0 @@
-validateui
diff --git a/plugins/org.eclipse.wst.validation.ui/build/wsBuild.xml b/plugins/org.eclipse.wst.validation.ui/build/wsBuild.xml
deleted file mode 100644
index 77c0b82..0000000
--- a/plugins/org.eclipse.wst.validation.ui/build/wsBuild.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE project [
-	<!ENTITY baseBuild SYSTEM "file:../../wsBuildDef.xml">
-]>
-
-<project name="buildPlugin" default="build" basedir="./..">
-
-<!-- include the common xml build file -->
-&baseBuild;
-
-<target name="build" depends="prepare" if="plugin.id">
-	<antcall target="buildjar">
-		<param name="jarname" value="${defaultjarname}"/>
-		<param name="jarclasspath" value="${plugin.classpath}"/>
-	</antcall>
-</target>
-</project>
diff --git a/plugins/org.eclipse.wst.validation.ui/plugin.properties b/plugins/org.eclipse.wst.validation.ui/plugin.properties
deleted file mode 100644
index 5002309..0000000
--- a/plugins/org.eclipse.wst.validation.ui/plugin.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2004 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-# IBM Corporation - initial API and implementation
-###############################################################################
-#
-# Version 1.3
-#
-VBF_TITLE_PROPERTIES=Validation
-VBF_UI_POPUP_RUNVALIDATION=&Run Validation
-VBF_TITLE_PREFERENCE=Validation
diff --git a/plugins/org.eclipse.wst.validation.ui/plugin.xml b/plugins/org.eclipse.wst.validation.ui/plugin.xml
deleted file mode 100644
index eedab8f..0000000
--- a/plugins/org.eclipse.wst.validation.ui/plugin.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-    
-<!-- ============================================== -->
-<!-- Popup Contributions                            -->
-<!-- ============================================== -->
-<!-- By saying "adaptable=true", this item will appear on both IProject and IJavaProject -->
-   <extension
-         point="org.eclipse.ui.popupMenus">
-      <viewerContribution 
-            targetID="#CommonNavigatorPopupMenu"
-            id="ValidationMenuAction">
-         <action
-               label="%VBF_UI_POPUP_RUNVALIDATION"
-               class="org.eclipse.wst.validation.internal.ui.ValidationMenuAction"
-               menubarPath="additions"
-               enablesFor="+"
-               id="ValidationAction">
-         </action>
-      </viewerContribution>
-   </extension>
-  
-
-<!-- ====================================================== -->
-<!--           Validation preference page                   -->
-<!-- ====================================================== -->
-   <extension
-         point="org.eclipse.ui.preferencePages">
-      <page
-            name="%VBF_TITLE_PREFERENCE"
-            class="org.eclipse.wst.validation.internal.ui.ValidationPreferencePage"
-            id="ValidationPreferencePage">
-      </page>
-   </extension>
-   
-<!-- ====================================================== -->
-<!--           Validation properties page                   -->
-<!-- ====================================================== -->
-<!-- By saying "adaptable=true", this item will appear on both IProject and IJavaProject -->
-   <extension
-         point="org.eclipse.ui.propertyPages">
-      <page
-            adaptable="true"
-            objectClass="org.eclipse.core.resources.IProject"
-            name="%VBF_TITLE_PROPERTIES"
-            class="org.eclipse.wst.validation.internal.ui.ValidationPropertiesPage"
-            id="ValidationPropertiesPage">
-      </page>
-   </extension>
-
-</plugin>
diff --git a/plugins/org.eclipse.wst.validation.ui/prepareforpii.xml b/plugins/org.eclipse.wst.validation.ui/prepareforpii.xml
deleted file mode 100644
index 1c3e278..0000000
--- a/plugins/org.eclipse.wst.validation.ui/prepareforpii.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<project name="PrepareForPII" default="main" basedir=".">
-		
-	<!-- Setup temp variables -->
-	<target name="init">
-		<property name="nlsDir" value="d:/NLS/Corona/0526"/>
-		<property name="plugin" value="com.ibm.etools.validation.ui"/>
-		<property name="plugindir" value="d:/workspaceCorona/${plugin}"/>
-		<property name="outputDir" value="${nlsDir}/${plugin}"/>
-		
-	
-	</target>
-
-	<!-- Create the destination dir -->
-	<target name="nlsDir" depends="init">
-		<mkdir dir="${nlsDir}"/>
-	</target>
-	
-	<!-- Create the destination dir -->
-	<target name="plugindir" depends="nlsDir">
-		<delete dir="${outputDir}"/>
-		<mkdir dir="${outputDir}"/>
-	</target>
-
-	<!-- Move the files to the correct locations in the workspace. -->
-	<target name="main" depends="plugindir">
-	
-		<messageIdGen folderPath = "${plugindir}" componentId = "E" />
-		
-		<copy todir = "${outputDir}/property_files" >
-			 <fileset dir="${plugindir}/property_files">
-           	  <include name="**/*.properties"/>
-  			 </fileset>
-  		</copy>
-  		
-  		<copy file="${plugindir}/plugin.properties" todir="${outputDir}"/>
-  		
-	</target>
-</project>
diff --git a/plugins/org.eclipse.wst.validation.ui/property_files/validate_ui.properties b/plugins/org.eclipse.wst.validation.ui/property_files/validate_ui.properties
deleted file mode 100644
index 36173e0..0000000
--- a/plugins/org.eclipse.wst.validation.ui/property_files/validate_ui.properties
+++ /dev/null
@@ -1,113 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2004 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-# IBM Corporation - initial API and implementation
-###############################################################################
-#     *************************************************************************
-#     * Code oriented instructions:
-#     *
-#     * In the string, you may see the following special sequences:
-#     * a) {n}  where n is a number. These are replaceable parameters.
-#     * b) ''  In .properties files, in order to see one apostrophe (') in the final
-#     *    string, sometimes two apostrophes must be entered in the string. In the translated
-#     *    string, if there is at least one {n} in the string, then to show one apostrophe
-#     *    to the user, put two apostrophes in the string. If there are no {n} in the string,
-#     *    then put one apostrophe.
-#     *    For example, say that you want the user to read "George's file". 
-#     *        GEORGE=George's file was on the desk.
-#     *        GEORGE2=George''s file and {0} were on the desk.
-#     *    GEORGE uses one apostrophe because there are no {n} and GEORGE2
-#     *    uses two apostrophes because there is a {n}.
-#     * c) '' text '' where text can be any word(s). The text between the double
-#     *    apostrophes should not be translated. 
-#     * d) <text> where text can be any word(s). The text between the angle
-#     *    brackets should NOT be translated.
-#     * e) "text" where text can be any word(s). The text between the quotation 
-#     *    marks should NOT be translated.
-#     *    
-#     *************************************************************************
-#     * Other instructions
-#     * a) Do not translate any text that is on a line which begins with a comment 
-#     *    symbol (#).
-#     * b) Do not translate these words: 
-#     *        schema, EJB, RDB, JAR, RMI, BMP, CMP, OOSQL
-#     * c) Please return the .properties files using the same directory structure.
-#     *    This is necessary because two of the files have the same name.
-#     *
-#     *************************************************************************
-# Any other comments to the translators are on lines which start like this:  # 2TC:
-#
-# Version 1.12
-#
-#
-# ID:
-#    VBF - Validation Builder Framework
-#
-
-# 
-# Begin Validation Builder Framework UI Strings
-#
-# IDs:
-#    VBF_EXC=Exception or error text
-#    VBF_UI=UI label
-#
-PREF_BUTTON_OVERRIDE=Allow projects to override these preference settings
-PREF_BUTTON_FULL=Run validation when you manually build a project
-PREF_BUTTON_AUTO=Run validation automatically when you save changes to a resource
-PREF_BUTTON_SELECTALL=Select All
-PREF_BUTTON_DESELECTALL=Deselect All
-PREF_VALLIST_TITLE=The selected validators will run when validation is performed:
-PREF_LBL_MAXMSGS=Maximum number of validation messages on a project
-PREF_ERROR_INT=IWAE0001E The number of validation messages must be a positive integer.
-PREF_BUTTON_ASYNC=Run validation in a background thread
-
-PROP_BUTTON_OVERRIDE=Override validation preferences
-PROP_BUTTON_FULL=Run validation when you manually build {0}
-VBF_UI_LBL_AUTO_VALIDATE=Run validation automatically when you save changes to {0} resources.
-PROP_BUTTON_SELECTALL=Select All
-PROP_BUTTON_DESELECTALL=Deselect All
-VBF_UI_LBL_DESC=The selected validators will run when {0} is validated:
-PROP_LBL_MAXMSSGS=Maximum number of validation messages on {0}
-PROP_ERROR_INT=IWAE0002E The number of validation messages must be a positive integer.
-PROP_LBL_CANNOTOVERRIDE=To enable the "Override validation preferences" checkbox, select the "Allow projects to override these preference settings" checkbox in the workbench Preferences dialog.
-PROP_BUTTON_ASYNC=Run validation in a background thread on {0}
-
-VBF_EXC_INTERNAL=IWAE0003E An unexpected error occurred during validation. Read the log file.
-VBF_EXC_INTERNAL_PROJECT=IWAE0004E An unexpected error occurred during validation of project {0}. Read the log file.
-VBF_EXC_INTERNAL_TITLE=IWAE0005E Internal error
-VBF_EXC_INTERNAL_PAGE=IWAE0006E An unexpected error occured; click Cancel to close the wizard.
-
-VBF_EXC_INVALID_REGISTER=IWAE0007E Validators can run only on open resources.
-
-VBF_UI_NO_VALIDATORS_INSTALLED=No validators are installed.
-
-VBF_UI_LBL_NOVALIDATORS_DESC=It is not possible to run any Validators, at the project level, for this type of project.
-
-VBF_UI_NO_VALIDATORS_ENABLED=Enable at least one validator on {0}. To select the validators that you want to run, open this project''s Properties wizard, turn to the Validation section, and select one or more validators in the list.
-
-VBF_UI_CHECKBOXGROUP_TITLE=Validators
-
-VBF_UI_CLOSED_PROJECT=Validation cannot run on a closed project. Open project {0} and try again.
-VBF_UI_MSSGBOX_TITLE_NONINC=Some of the Validators Do Not Support Automatic Validation
-VBF_UI_AUTO_ON_NONINC=Although automatic validation has been selected, some of the validators will not be invoked during the automatic processing. The following validators do not support automatic validation: {0}
-
-VBF_UI_PRJNEEDINPUT=Project {0} and its children were not validated because none of the enabled validators validates that type of project.
-VBF_UI_RESNEEDINPUT=Resource {0} was not validated because none of the enabled validators validates that type of resource.
-
-VBF_UI_MAX_REPORTED=Validation was terminated on {0} because the maximum number of messages were reported.
-VBF_UI_PRJVALIDATED=Validation of project {0} is complete.
-VBF_UI_RESVALIDATED=Validation of resource {0} is complete.
-VBF_UI_CANCELLED=Validation cancelled.
-VBF_UI_COMPLETE=Validation completed.
-VBF_UI_CLOSE=Close
-VBF_UI_STATUS=Status
-VBF_UI_RESCANCELLED=Validation was cancelled on {0}.
-#
-# End Validation Builder Framework UI Strings
-#
-
diff --git a/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ContextIds.java b/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ContextIds.java
deleted file mode 100644
index ab3e337..0000000
--- a/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ContextIds.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.ui;
-
-import org.eclipse.wst.common.frameworks.internal.ui.WTPUIPlugin;
-
-public interface ContextIds {
-	static final String PREFIX = WTPUIPlugin.PLUGIN_ID;
-
-	// context ids for the Validation Properties Page
-	public static final String VALIDATION_PROPERTIES_PAGE = PREFIX + ".jvpp0000"; //$NON-NLS-1$
-	public static final String VALIDATION_PROPERTIES_PAGE_DISABLED_OVERRIDE = PREFIX + ".jvpp0001"; //$NON-NLS-1$
-	public static final String VALIDATION_PROPERTIES_PAGE_DISABLED_BUILD_NOVALSELECTED = PREFIX + ".jvpp0003"; //$NON-NLS-1$
-	public static final String VALIDATION_PROPERTIES_PAGE_DISABLED_AUTO_AUTOBUILD = PREFIX + ".jvpp0004"; //$NON-NLS-1$
-	public static final String VALIDATION_PROPERTIES_PAGE_DISABLED_AUTO_NOINCVALSELECTED = PREFIX + ".jvpp0005"; //$NON-NLS-1$
-	public static final String VALIDATION_PROPERTIES_PAGE_DISABLED_AUTO_NOINCVALCONFIG = PREFIX + ".jvpp0006"; //$NON-NLS-1$
-	public static final String VALIDATION_PROPERTIES_PAGE_AUTO_ENABLED = PREFIX + ".jvpp0020"; //$NON-NLS-1$
-	public static final String VALIDATION_PROPERTIES_PAGE_OVERRIDE_ENABLED = PREFIX + ".jvpp0030"; //$NON-NLS-1$
-	public static final String VALIDATION_PROPERTIES_PAGE_OVERRIDE_ENABLED_CANNOT_HONOUR_BOTH = PREFIX + ".jvpp0031"; //$NON-NLS-1$
-	public static final String VALIDATION_PROPERTIES_PAGE_OVERRIDE_ENABLED_CANNOT_HONOUR_AUTO = PREFIX + ".jvpp0032"; //$NON-NLS-1$
-	public static final String VALIDATION_PROPERTIES_PAGE_OVERRIDE_ENABLED_CANNOT_HONOUR_MANUAL = PREFIX + ".jvpp0033"; //$NON-NLS-1$
-	public static final String VALIDATION_PROPERTIES_PAGE_REBUILD_ENABLED = PREFIX + ".jvpp0040"; //$NON-NLS-1$
-	public static final String VALIDATION_PROPERTIES_PAGE_MAX_MESSAGES = PREFIX + ".jvpp0050"; //$NON-NLS-1$
-
-	public static final String VALIDATION_PREFERENCE_PAGE = PREFIX + ".jvgp0000"; //$NON-NLS-1$
-	public static final String VALIDATION_PREFERENCE_PAGE_OVERRIDE = PREFIX + ".jvgp0005"; //$NON-NLS-1$
-	public static final String VALIDATION_PREFERENCE_PAGE_REBUILD_ENABLED = PREFIX + ".jvgp0010"; //$NON-NLS-1$
-	//	public static final String VALIDATION_PREFERENCE_PAGE_REBUILD_DISABLED = PREFIX +
-	// ".jvgp0011"; //$NON-NLS-1$
-	public static final String VALIDATION_PREFERENCE_PAGE_AUTO_ENABLED = PREFIX + ".jvgp0020"; //$NON-NLS-1$
-	//	public static final String VALIDATION_PREFERENCE_PAGE_AUTO_DISABLED_AUTOBUILD = PREFIX +
-	// ".jvgp0021"; //$NON-NLS-1$
-	//	public static final String VALIDATION_PREFERENCE_PAGE_AUTO_DISABLED_NOINCVALSELECTED = PREFIX
-	// + ".jvgp0022"; //$NON-NLS-1$
-	//	public static final String VALIDATION_PREFERENCE_PAGE_AUTO_DISABLED_NOINCVALCONFIG = PREFIX +
-	// ".jvgp0023"; //$NON-NLS-1$
-	public static final String VALIDATION_PREFERENCE_PAGE_MAX_MESSAGES = PREFIX + ".jvgp0030"; //$NON-NLS-1$
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ProgressAndTextDialog.java b/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ProgressAndTextDialog.java
deleted file mode 100644
index 63af6e3..0000000
--- a/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ProgressAndTextDialog.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.ui;
-
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Cursor;
-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.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-
-/**
- * Display both progress status and cumulative status (text) to the user.
- */
-public class ProgressAndTextDialog extends ProgressMonitorDialog {
-	protected static final String NEWLINE = System.getProperty("line.separator"); //$NON-NLS-1$
-	protected Text text = null;
-	protected boolean cancelPressed = false; // Has the "Cancel" button been clicked?
-	protected boolean closePressed = false; // Has the "Close" button been clicked?
-	protected boolean operationDone = false; // Has the operation completed?
-	protected Cursor arrowCursor; // The cursor used in the cancel button.
-
-
-	public ProgressAndTextDialog(Shell parent) {
-		super(parent);
-		setShellStyle(SWT.BORDER | SWT.TITLE | SWT.RESIZE); // do not make this dialog modal
-		setBlockOnOpen(false); // do not force the user to close this dialog before using eclipse
-	}
-
-	public Control createDialogArea(Composite parent) {
-		super.createDialogArea(parent);
-
-		final int hHint = 100;
-		final int wHint = 250;
-
-		Composite composite = new Composite(parent, SWT.NONE);
-		Label textLabel = new Label(composite, SWT.LEFT | SWT.WRAP);
-		textLabel.setText(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_UI_STATUS));
-		GridData labelData = new GridData();
-		labelData.horizontalSpan = 2;
-		textLabel.setLayoutData(labelData);
-
-		composite.setLayout(new GridLayout()); // use the layout's default preferences
-		GridData data = new GridData(GridData.FILL_BOTH);
-		data.heightHint = hHint;
-		data.widthHint = wHint;
-		data.horizontalSpan = 2;
-		composite.setLayoutData(data);
-
-		text = new Text(composite, SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL | SWT.READ_ONLY | SWT.BORDER);
-		GridData d = new GridData(GridData.FILL_BOTH);
-		text.setLayoutData(d);
-
-		return composite;
-	}
-
-	public void addText(final String messageString) {
-		if (getShell() != null) {
-			getShell().getDisplay().asyncExec(new Runnable() {
-				public void run() {
-					text.append(messageString);
-					text.append(NEWLINE);
-				}
-			});
-		}
-	}
-
-	/**
-	 * Do not dismiss the dialog until the user presses the Close button.
-	 */
-	public boolean close() {
-		if (closePressed) {
-			// Cancel button converted to "Close" button, and user clicked the "Close" button
-			return super.close();
-		}
-
-		// Turn the "cancel" button into a "Close" button and keep the window open until
-		// the user clicks the "Close" button.
-		progressIndicator.setVisible(false);
-		if (arrowCursor == null)
-			arrowCursor = new Cursor(cancel.getDisplay(), SWT.CURSOR_ARROW);
-		getShell().setCursor(arrowCursor);
-		if (cancelPressed) {
-			messageLabel.setText(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_UI_CANCELLED));
-		} else {
-			messageLabel.setText(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_UI_COMPLETE));
-		}
-		cancel.setText(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_UI_CLOSE));
-		cancel.setEnabled(true);
-		return false;
-	}
-
-	protected void internalCancelPressed() {
-		// Has this method been called because "Cancel" has been clicked or
-		// because "Close" has been clicked?
-		if (operationDone) {
-			// "Close" was clicked.
-			closePressed = true;
-			close();
-		} else {
-			// "Cancel" was clicked.
-			cancelPressed = true;
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(Composite)
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		super.createButtonsForButtonBar(parent);
-
-		// Cannot override cancelPressed() because of the way that
-		// ProgressMonitorDialog is coded.
-		// The ProgressMonitorDialog parent, instead of overriding the
-		// cancelPressed() method, added an anonymous Listener to the
-		// cancel button. When the button's Listener is invoked, if
-		// close() has been called by cancelPressed(), then an
-		// exception is thrown (SWTException - "Widget is disposed').
-		// Work around this by adding an anonymous
-		// cancel listener, which will be called after the parent's
-		// cancel listener, and this class' listener will call close().
-		cancel.addListener(SWT.Selection, new Listener() {
-			public void handleEvent(Event e) {
-				internalCancelPressed();
-			}
-		});
-	}
-
-	/**
-	 * @see org.eclipse.jface.operation.IRunnableContext#run(boolean, boolean,
-	 *      IRunnableWithProgress)
-	 */
-	public void run(boolean fork, boolean cancelable, IRunnableWithProgress runnable) throws InvocationTargetException, InterruptedException {
-		try {
-			super.run(fork, cancelable, runnable);
-		} finally {
-			operationDone = true;
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ResourceConstants.java b/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ResourceConstants.java
deleted file mode 100644
index ac4b244..0000000
--- a/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ResourceConstants.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.ui;
-
-
-/**
- * This interface contains the constants used as keys into the ResourceBundle.
- */
-public interface ResourceConstants {
-	// Internal error has occurred.
-	public static final String VBF_EXC_INTERNAL = "VBF_EXC_INTERNAL"; //$NON-NLS-1$
-
-	// Internal error occurred while constructing or running the Properties or Preference page.
-	public static final String VBF_EXC_INTERNAL_PAGE = "VBF_EXC_INTERNAL_PAGE"; //$NON-NLS-1$
-
-	// Internal error has occurred.
-	public static final String VBF_EXC_INTERNAL_PROJECT = "VBF_EXC_INTERNAL_PROJECT"; //$NON-NLS-1$
-	public static final String VBF_EXC_INTERNAL_TITLE = "VBF_EXC_INTERNAL_TITLE"; //$NON-NLS-1$
-
-	// Should never happen, since plugin.xml specifies an IProject objectClass filter, but if the
-	// ValidationPropertiesPage is shown on a non-IProject resource, this message will be what's
-	// shown.
-	public static final String VBF_EXC_INVALID_REGISTER = "VBF_EXC_INVALID_REGISTER"; //$NON-NLS-1$
-
-	// On the Properties Page, this is the string which explains to the user what to do. The string
-	// is
-	// displayed in a label.
-	public static final String VBF_UI_LBL_DESC = "VBF_UI_LBL_DESC"; //$NON-NLS-1$
-
-	// On the Properties Page, this is the string which explains to the user what to do. The string
-	// is
-	// displayed in a label.
-	public static final String VBF_UI_LBL_NOVALIDATORS_DESC = "VBF_UI_LBL_NOVALIDATORS_DESC"; //$NON-NLS-1$
-
-	// Label on the checkbox button of the validator page
-	public static final String VBF_UI_LBL_AUTO_VALIDATE = "VBF_UI_LBL_AUTO_VALIDATE"; //$NON-NLS-1$
-
-	// If the user has selected "Validate this project" from the popupMenu, but has no validators
-	// enabled, tell them that nothing will run.
-	public static final String VBF_UI_NO_VALIDATORS_ENABLED = "VBF_UI_NO_VALIDATORS_ENABLED"; //$NON-NLS-1$
-
-	// On the Properties Page, this is the title of the group which encloses the CheckboxTableViewer
-	// (the list of configured validators).
-	public static final String VBF_UI_CHECKBOXGROUP_TITLE = "VBF_UI_CHECKBOXGROUP_TITLE"; //$NON-NLS-1$
-	public static final String VBF_UI_AUTO_ON_NONINC = "VBF_UI_AUTO_ON_NONINC"; //$NON-NLS-1$
-	public static final String VBF_UI_MSSGBOX_TITLE_NONINC = "VBF_UI_MSSGBOX_TITLE_NONINC"; //$NON-NLS-1$
-	public static final String VBF_UI_AUTO_NOTE = "VBF_UI_AUTO_NOTE"; //$NON-NLS-1$
-	public static final String VBF_UI_AUTO_NOTE_TEXT = "VBF_UI_AUTO_NOTE_TEXT"; //$NON-NLS-1$
-	public static final String VBF_UI_MENUITEM_TEXT = "VBF_UI_MENUITEM_TEXT"; //$NON-NLS-1$
-	public static final String VBF_UI_MENUITEM_TEXT_DEFAULT = "VBF_UI_MENUITEM_TEXT_DEFAULT"; //$NON-NLS-1$
-	public static final String VBF_UI_CLOSED_PROJECT = "VBF_UI_CLOSED_PROJECT"; //$NON-NLS-1$
-	public static final String VBF_UI_NO_VALIDATORS_INSTALLED = "VBF_UI_NO_VALIDATORS_INSTALLED"; //$NON-NLS-1$
-
-	public static final String VBF_UI_POPUP_RUNVALIDATION = "%VBF_UI_POPUP_RUNVALIDATION"; //$NON-NLS-1$
-
-	/* package */static final String PREF_BUTTON_SELECTALL = "PREF_BUTTON_SELECTALL"; //$NON-NLS-1$
-	/* package */static final String PREF_BUTTON_DESELECTALL = "PREF_BUTTON_DESELECTALL"; //$NON-NLS-1$
-	/* package */static final String PREF_VALLIST_TITLE = "PREF_VALLIST_TITLE"; //$NON-NLS-1$
-	/* package */static final String PREF_BUTTON_AUTO = "PREF_BUTTON_AUTO"; //$NON-NLS-1$
-	/* package */static final String PREF_BUTTON_OVERRIDE = "PREF_BUTTON_OVERRIDE"; //$NON-NLS-1$
-	/* package */static final String PREF_BUTTON_FULL = "PREF_BUTTON_FULL"; //$NON-NLS-1$
-	/* package */static final String PREF_LBL_MAXMSGS = "PREF_LBL_MAXMSGS"; //$NON-NLS-1$
-	/* package */static final String PROP_BUTTON_OVERRIDE = "PROP_BUTTON_OVERRIDE"; //$NON-NLS-1$
-	/* package */static final String PROP_BUTTON_FULL = "PROP_BUTTON_FULL"; //$NON-NLS-1$
-	/* package */static final String PROP_BUTTON_SELECTALL = "PROP_BUTTON_SELECTALL"; //$NON-NLS-1$
-	/* package */static final String PROP_BUTTON_DESELECTALL = "PROP_BUTTON_DESELECTALL"; //$NON-NLS-1$
-	/* package */static final String PROP_LBL_MAXMSSGS = "PROP_LBL_MAXMSSGS"; //$NON-NLS-1$
-	/* package */static final String PREF_ERROR_INT = "PREF_ERROR_INT"; //$NON-NLS-1$
-	/* package */static final String PROP_ERROR_INT = "PROP_ERROR_INT"; //$NON-NLS-1$
-
-	/* package */static final String VBF_UI_PRJNEEDINPUT = "VBF_UI_PRJNEEDINPUT"; //$NON-NLS-1$
-	/* package */static final String VBF_UI_RESNEEDINPUT = "VBF_UI_RESNEEDINPUT"; //$NON-NLS-1$
-	/* package */static final String VBF_UI_MAX_REPORTED = "VBF_UI_MAX_REPORTED"; //$NON-NLS-1$
-	/* package */static final String VBF_UI_PRJVALIDATED = "VBF_UI_PRJVALIDATED"; //$NON-NLS-1$
-	/* package */static final String VBF_UI_RESVALIDATED = "VBF_UI_RESVALIDATED"; //$NON-NLS-1$
-	/* package */static final String VBF_UI_CANCELLED = "VBF_UI_CANCELLED"; //$NON-NLS-1$
-	/* package */static final String VBF_UI_COMPLETE = "VBF_UI_COMPLETE"; //$NON-NLS-1$
-	/* package */static final String VBF_UI_CLOSE = "VBF_UI_CLOSE"; //$NON-NLS-1$
-	/* package */static final String VBF_UI_STATUS = "VBF_UI_STATUS"; //$NON-NLS-1$
-	/* package */static final String VBF_UI_RESCANCELLED = "VBF_UI_RESCANCELLED"; //$NON-NLS-1$
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ResourceHandler.java b/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ResourceHandler.java
deleted file mode 100644
index 531ff42..0000000
--- a/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ResourceHandler.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.ui;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-import java.util.logging.Level;
-
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPUIPlugin;
-import org.eclipse.wst.validation.internal.ui.plugin.ValidationUIPlugin;
-
-
-/**
- * This class retrieves the Strings from the .properties file appropriate for the machine's Locale.
- */
-public class ResourceHandler {
-	//TODO Make this class final once the public ResourceHandler has been deleted.
-	private static ResourceBundle _bundle = null;
-
-	protected ResourceHandler() {
-		//TODO Make this method private once the public ResourceHandler has been deleted.
-		super();
-	}
-
-	/**
-	 * Return the resource bundle which contains the messages, as identified by
-	 */
-	public static ResourceBundle getBundle() {
-		if (_bundle == null) {
-			try {
-				_bundle = ResourceBundle.getBundle(ValidationUIPlugin.getBundleName());
-			} catch (MissingResourceException exc) {
-				_bundle = null;
-				Logger logger = WTPUIPlugin.getLogger();
-				if (logger.isLoggingLevel(Level.FINE)) {
-					LogEntry entry = ValidationUIPlugin.getLogEntry();
-					entry.setSourceID("org.eclipse.wst.validation.internal.operations.ui.ResourceHandler.getBundle()"); //$NON-NLS-1$
-					entry.setText("Cannot find bundle " + ValidationUIPlugin.getBundleName()); //$NON-NLS-1$
-					entry.setTargetException(exc);
-					logger.write(Level.FINE, entry);
-				}
-			}
-		}
-		return _bundle;
-	}
-
-	public static String getExternalizedMessage(String key) {
-		try {
-			ResourceBundle bundle = getBundle();
-			if (bundle == null) {
-				Logger logger = WTPUIPlugin.getLogger();
-				if (logger.isLoggingLevel(Level.FINE)) {
-					LogEntry entry = ValidationUIPlugin.getLogEntry();
-					entry.setSourceID("org.eclipse.wst.validation.internal.operations.ui.ResourceHandler.getExternalizedMessage(String)"); //$NON-NLS-1$
-					entry.setText("Resource bundle is null"); //$NON-NLS-1$
-					logger.write(Level.FINE, entry);
-				}
-				return key;
-			}
-
-			return bundle.getString(key);
-		} catch (NullPointerException exc) {
-			Logger logger = WTPUIPlugin.getLogger();
-			if (logger.isLoggingLevel(Level.FINE)) {
-				LogEntry entry = ValidationUIPlugin.getLogEntry();
-				entry.setSourceID("org.eclipse.wst.validation.internal.operations.ui.ResourceHandler.getExternalizedMessage(String)"); //$NON-NLS-1$
-				entry.setText("Cannot find message id " + key); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.FINE, entry);
-			}
-		}
-		return key;
-	}
-
-	public static String getExternalizedMessage(String key, String[] parms) {
-		String res = ""; //$NON-NLS-1$
-		try {
-			res = java.text.MessageFormat.format(getExternalizedMessage(key), parms);
-		} catch (MissingResourceException exc) {
-			Logger logger = WTPUIPlugin.getLogger();
-			if (logger.isLoggingLevel(Level.FINE)) {
-				LogEntry entry = ValidationUIPlugin.getLogEntry();
-				entry.setSourceID("org.eclipse.wst.validation.internal.operations.ui.ResourceHandler.getExternalizedMessage(String, String[])"); //$NON-NLS-1$
-				entry.setText("Cannot find message id " + key); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.FINE, entry);
-			}
-		} catch (NullPointerException exc) {
-			Logger logger = WTPUIPlugin.getLogger();
-			if (logger.isLoggingLevel(Level.FINE)) {
-				LogEntry entry = ValidationUIPlugin.getLogEntry();
-				entry.setSourceID("org.eclipse.wst.validation.internal.operations.ui.ResourceHandler.getExternalizedMessage(String, String[])"); //$NON-NLS-1$
-				entry.setText("Cannot format message id " + key + " with " + parms.length + " parameters."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				entry.setTargetException(exc);
-				logger.write(Level.FINE, entry);
-			}
-		}
-		return res;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ValidateAction.java b/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ValidateAction.java
deleted file mode 100644
index d52b12d..0000000
--- a/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ValidateAction.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.ui;
-
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.actions.SelectionListenerAction;
-import org.eclipse.wst.validation.internal.ui.plugin.ValidationUIPlugin;
-
-
-public class ValidateAction extends SelectionListenerAction {
-	protected ValidationMenuAction delegate;
-
-	public ValidateAction() {
-		super(ValidationUIPlugin.getResourceString(ResourceConstants.VBF_UI_POPUP_RUNVALIDATION));
-		delegate = new ValidationMenuAction();
-	}
-
-	/**
-	 * Implementation of method defined on <code>IAction</code>.
-	 */
-	public void run() {
-		delegate.run(this);
-	}
-
-	/**
-	 * Updates this action in response to the given selection.
-	 * <p>
-	 * The <code>SelectionListenerAction</code> implementation of this method returns
-	 * <code>true</code>. Subclasses may extend to react to selection changes; however, if the
-	 * super method returns <code>false</code>, the overriding method must also return
-	 * <code>false</code>.
-	 * </p>
-	 * 
-	 * @param selection
-	 *            the new selection
-	 * @return <code>true</code> if the action should be enabled for this selection, and
-	 *         <code>false</code> otherwise
-	 */
-	protected boolean updateSelection(IStructuredSelection selection) {
-		if (!super.updateSelection(selection))
-			return false;
-
-		delegate.selectionChanged(this, selection);
-
-		return isEnabled(); // "Enabled" is set by the delegate.
-	}
-
-	/**
-	 * If a subclass of ValidateAction enables this menu action on a type that is not an IResource,
-	 * this method returns the IResource[] that represent that object. If null is returned, the
-	 * object will be ignored and the user will not be notified that the object was not validated.
-	 * This method will be called when updateSelection and run are called. (The result of this
-	 * method is used to determine which resources will be validated)
-	 */
-	protected IResource[] getResource(Object selected) {
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ValidationMenuAction.java b/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ValidationMenuAction.java
deleted file mode 100644
index 035a218..0000000
--- a/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ValidationMenuAction.java
+++ /dev/null
@@ -1,568 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.ui;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.logging.Level;
-
-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.IResourceVisitor;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPUIPlugin;
-import org.eclipse.wst.validation.internal.ConfigurationManager;
-import org.eclipse.wst.validation.internal.ProjectConfiguration;
-import org.eclipse.wst.validation.internal.ValidationRegistryReader;
-import org.eclipse.wst.validation.internal.ValidationSelectionHandlerRegistryReader;
-import org.eclipse.wst.validation.internal.operations.EnabledIncrementalValidatorsOperation;
-import org.eclipse.wst.validation.internal.operations.EnabledValidatorsOperation;
-import org.eclipse.wst.validation.internal.operations.ValidatorManager;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-import org.eclipse.wst.validation.internal.ui.plugin.ValidationUIPlugin;
-
-/**
- * This class implements the pop-up menu item "Run Validation" When the item is selected, this
- * action triggers a validation of the project, using all configured, enabled validators.
- */
-public class ValidationMenuAction implements IViewActionDelegate {
-	private ISelection _currentSelection = null;
-	protected static final String SEP = "/"; //$NON-NLS-1$
-	private Display _currentDisplay = null;
-	private IResourceVisitor _folderVisitor = null;
-	private Map _selectedResources = null;
-	//protected IWorkbenchContext workbenchContext;
-
-	public ValidationMenuAction() {
-		super();
-		_currentDisplay = Display.getCurrent(); // cache the display before
-		// this action is forked. After
-		// the action is forked,
-		// Display.getCurrent() returns
-		// null.
-		_selectedResources = new HashMap();
-	}
-
-	private Display getDisplay() {
-		return (_currentDisplay == null) ? Display.getCurrent() : _currentDisplay;
-	}
-
-	/**
-	 * Return the wizard's shell.
-	 */
-	Shell getShell() {
-		Display display = getDisplay();
-		Shell shell = (display == null) ? null : display.getActiveShell();
-		if (shell == null && display != null) {
-			Shell[] shells = display.getShells();
-			if (shells.length > 0)
-				shell = shells[0];
-		}
-		return shell;
-	}
-
-	private ISelection getCurrentSelection() {
-		return _currentSelection;
-	}
-
-	/**
-	 * Return a map of the selected elements. Each key of the map is an IProject, and the value is a
-	 * Set of the selected resources in that project. If a project is selected, and nothing else in
-	 * the project is selected, a full validation (null value) will be done on the project. If a
-	 * project is selected, and some files/folders in the project are also selected, only the
-	 * files/folders will be validated. If a folder is selected, all of its contents are also
-	 * validated.
-	 */
-	private Map loadSelected(ValidateAction action, boolean refresh) {
-		if (refresh) {
-			// selectionChanged(IAction, ISelection) has been called. Flush the
-			// existing cache of resources and
-			// add just the currently selected ones.
-			_selectedResources.clear();
-		}
-		ISelection selection = getCurrentSelection();
-		if ((selection == null) || selection.isEmpty() || !(selection instanceof IStructuredSelection)) {
-			return null;
-		}
-		Object[] elements = ((IStructuredSelection) selection).toArray();
-		for (int i = 0; i < elements.length; i++) {
-			Object element = elements[i];
-			if (element == null) {
-				continue;
-			}
-			addSelected(action, element);
-		}
-		return _selectedResources;
-	}
-
-	private void addSelected(ValidateAction action, Object selected) {
-		if (selected instanceof IProject) {
-			addSelected((IProject) selected);
-		} else if (selected instanceof IFile) {
-			addSelected((IFile) selected);
-		} else if (selected instanceof IFolder) {
-			addVisitor((IFolder) selected);
-		} else if (isValidType(getExtendedType(selected))) {
-			addSelected(action,getExtendedType(selected));
-		} else {
-			// Not a valid input type. Must be IProject, IJavaProject, or
-			// IResource.
-			// If this ValidationMenuAction is a delegate of ValidateAction, is
-			// the input type recognized by the ValidateAction?
-			boolean valid = false;
-			if (action != null) {
-				IResource[] resources = action.getResource(selected);
-				if (resources != null) {
-					valid = true;
-					for (int i = 0; i < resources.length; i++) {
-						addSelected(action, resources[i]);
-					}
-				}
-			}
-			if (!valid) {
-				// Stop processing. (This allows the "Run Validation" menu item
-				// to gray
-				// out once at least one non-validatable element is selected.)
-				_selectedResources.clear();
-			}
-		}
-	}
-	
-	private Object getExtendedType(Object selected) {
-		Object result = ValidationSelectionHandlerRegistryReader.getInstance().getExtendedType(selected);
-		return result == null ? selected : result;
-	}
-	
-	private boolean isValidType(Object object) {
-		return object instanceof IProject || object instanceof IFile || object instanceof IFolder;
-	}
-
-	private void addSelected(IProject selected) {
-		_selectedResources.put(selected, null); // whatever the values were
-		// before, the entire project
-		// needs to be revalidated now
-	}
-
-//	private void addSelected(IJavaProject selected) {
-//		_selectedResources.put(selected.getProject(), null); // whatever the
-//		// values were
-//		// before, the
-//		// entire project
-//		// needs to be
-//		// revalidated now
-//	}
-
-	void addSelected(IResource selected) {
-		IProject project = selected.getProject();
-		boolean added = _selectedResources.containsKey(project);
-		List changedRes = null;
-		if (added) {
-			// If the value is null, the entire project needs to be validated
-			// anyway.
-			changedRes = (List) _selectedResources.get(project);
-			if (changedRes == null) {
-				return;
-			}
-		} else {
-			changedRes = new ArrayList();
-		}
-		if (!changedRes.contains(selected)) {
-			changedRes.add(selected);
-			_selectedResources.put(project, changedRes);
-		}
-	}
-
-	private void addVisitor(IFolder selected) {
-		// add the folder and its children
-		try {
-			selected.accept(getFolderVisitor());
-		} catch (CoreException exc) {
-			Logger logger = WTPUIPlugin.getLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationUIPlugin.getLogEntry();
-				entry.setSourceIdentifier("ValidationMenuAction.addSelected(IFolder)"); //$NON-NLS-1$
-				entry.setMessageTypeIdentifier(ResourceConstants.VBF_EXC_INTERNAL);
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-			return;
-		}
-	}
-
-	private IResourceVisitor getFolderVisitor() {
-		if (_folderVisitor == null) {
-			_folderVisitor = new IResourceVisitor() {
-				public boolean visit(IResource res) {
-					if (res instanceof IFile) {
-						addSelected(res);
-					} else if (res instanceof IFolder) {
-						addSelected(res);
-					}
-					return true; // visit the resource's children
-				}
-			};
-		}
-		return _folderVisitor;
-	}
-
-	/**
-	 * The delegating action has been performed. Implement this method to do the actual work.
-	 * 
-	 * @param action
-	 *            action proxy that handles the presentation portion of the plugin action
-	 * @param window
-	 *            the desktop window passed by the action proxy
-	 */
-	public void run(IAction action) {
-		ValidateAction vaction = null;
-		if (action instanceof ValidateAction) {
-			vaction = (ValidateAction) action;
-		}
-		final Map projects = loadSelected(vaction, false);
-		if ((projects == null) || (projects.size() == 0)) {
-			return;
-		}
-		final ProgressAndTextDialog dialog = new ProgressAndTextDialog(getShell());
-		try {
-			IRunnableWithProgress runnable = ValidationUIPlugin.getRunnableWithProgress(new IWorkspaceRunnable() {
-				public void run(IProgressMonitor monitor) {
-					validate(monitor, projects, dialog);
-				}
-			});
-			// validate all EJBs in this project
-			dialog.run(true, true, runnable); // fork, cancelable.
-		} catch (InvocationTargetException exc) {
-			Logger logger = WTPUIPlugin.getLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationUIPlugin.getLogEntry();
-				entry.setSourceID("ValidationMenuAction.run(IAction)"); //$NON-NLS-1$
-				entry.setMessageTypeIdentifier(ResourceConstants.VBF_EXC_INTERNAL);
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc.getTargetException());
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-			String internalErrorMessage = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL);
-			dialog.addText(internalErrorMessage);
-		} catch (InterruptedException exc) {
-			// User cancelled validation
-		} catch (Throwable exc) {
-			Logger logger = WTPUIPlugin.getLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationUIPlugin.getLogEntry();
-				entry.setSourceID("ValidationMenuAction.run(IAction)"); //$NON-NLS-1$
-				entry.setMessageTypeIdentifier(ResourceConstants.VBF_EXC_INTERNAL);
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-			String internalErrorMessage = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL);
-			dialog.addText(internalErrorMessage);
-		} finally {
-			_selectedResources.clear();
-		}
-	}
-
-	void validate(final IProgressMonitor monitor, final Map projects, ProgressAndTextDialog dialog) {
-		boolean cancelled = false; // Was the operation cancelled?
-		Iterator iterator = projects.keySet().iterator();
-		while (iterator.hasNext()) {
-			IProject project = (IProject) iterator.next();
-			if (project == null) {
-				continue;
-			}
-			try {
-				if (cancelled) {
-					String message = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_UI_RESCANCELLED, new String[]{project.getName()});
-					dialog.addText(message);
-					continue;
-				}
-				if (!project.isOpen()) {
-					String message = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_UI_CLOSED_PROJECT, new String[]{project.getName()});
-					dialog.addText(message);
-					continue;
-				}
-				performValidation(monitor, projects, dialog, project);
-			} catch (OperationCanceledException exc) {
-				// When loading file deltas, if the operation has been
-				// cancelled, then
-				// resource.accept throws an OperationCanceledException.
-				cancelled = true;
-				String message = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_UI_RESCANCELLED, new String[]{project.getName()});
-				dialog.addText(message);
-			} catch (Throwable exc) {
-				logException(dialog, project, exc);
-			}
-		}
-	}
-
-	/**
-	 * @param dialog
-	 * @param project
-	 * @param exc
-	 */
-	private void logException(ProgressAndTextDialog dialog, IProject project, Throwable exc) {
-		Logger logger = WTPUIPlugin.getLogger();
-		if (logger.isLoggingLevel(Level.SEVERE)) {
-			LogEntry entry = ValidationUIPlugin.getLogEntry();
-			entry.setSourceID("ValidationMenuAction.validate"); //$NON-NLS-1$
-			entry.setMessageTypeIdentifier(ResourceConstants.VBF_EXC_INTERNAL);
-			entry.setTargetException(exc);
-			logger.write(Level.SEVERE, entry);
-		}
-		String internalErrorMessage = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_PROJECT, new String[]{project.getName()});
-		dialog.addText(internalErrorMessage);
-	}
-
-	/**
-	 * @param monitor
-	 * @param projects
-	 * @param dialog
-	 * @param project
-	 * @throws CoreException
-	 */
-	private void performValidation(final IProgressMonitor monitor, final Map projects, ProgressAndTextDialog dialog, IProject project) throws CoreException {
-		// Even if the "maximum number of messages" message is on
-		// the task list,
-		// run validation, because some messages may have been
-		// fixed
-		// and there may be space for more messages.
-		List changedResources = (List) projects.get(project);
-		IResource[] resources = null;
-		if (changedResources != null) {
-			resources = new IResource[changedResources.size()];
-			changedResources.toArray(resources);
-		}
-		try {
-			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-			if (prjp.numberOfEnabledValidators() > 0) {
-				checkProjectConfiguration(monitor, dialog, project, resources, prjp);
-			} else {
-				String message = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_UI_NO_VALIDATORS_ENABLED, new String[]{project.getName()});
-				dialog.addText(message);
-			}
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("ValidationMenuAction::run"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param monitor
-	 * @param dialog
-	 * @param project
-	 * @param resources
-	 * @param prjp
-	 * @throws InvocationTargetException
-	 * @throws CoreException
-	 */
-	private void checkProjectConfiguration(final IProgressMonitor monitor, ProgressAndTextDialog dialog, IProject project, IResource[] resources, ProjectConfiguration prjp) throws InvocationTargetException, CoreException {
-		boolean successful = true; // Did the operation
-		// complete
-		// successfully?
-		EnabledValidatorsOperation validOp = null;
-		if (resources == null) {
-			validOp = new EnabledValidatorsOperation(project,prjp.runAsync());
-		} else {
-			validOp = new EnabledIncrementalValidatorsOperation(resources, project, prjp.runAsync());
-		}
-		if (validOp.isNecessary(monitor)) {
-			ResourcesPlugin.getWorkspace().run(validOp, monitor);
-		} else {
-			if (resources == null) {
-				String message = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_UI_PRJNEEDINPUT, new String[]{project.getName()});
-				dialog.addText(message);
-			} else {
-				for (int i = 0; i < resources.length; i++) {
-					String message = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_UI_RESNEEDINPUT, new String[]{resources[i].getFullPath().toString()});
-					dialog.addText(message);
-				}
-			}
-		}
-		if (successful) {
-			performSucessful(dialog, project, resources);
-		} else {
-			String internalErrorMessage = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_PROJECT, new String[]{project.getName()});
-			dialog.addText(internalErrorMessage);
-		}
-	}
-
-	/*public IWorkbenchContext getWorkbenchContext() {
-		if(workbenchContext == null)
-			workbenchContext = new WorkbenchContext();
-		return workbenchContext;
-	}*/
-
-	/**
-	 * @param dialog
-	 * @param project
-	 * @param resources
-	 */
-	private void performSucessful(ProgressAndTextDialog dialog, IProject project, IResource[] resources) {
-		boolean limitExceeded = ValidatorManager.getManager().wasValidationTerminated(project);
-		if (limitExceeded) {
-			String message = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_UI_MAX_REPORTED, new String[]{project.getName()});
-			dialog.addText(message);
-		} else if (resources == null) {
-			String message = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_UI_PRJVALIDATED, new String[]{project.getName()});
-			dialog.addText(message);
-		} else {
-			for (int i = 0; i < resources.length; i++) {
-				String message = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_UI_RESVALIDATED, new String[]{resources[i].getFullPath().toString()});
-				dialog.addText(message);
-			}
-		}
-	}
-
-	/**
-	 * Selection in the desktop has changed. Plugin provider can use it to change the availability
-	 * of the action or to modify other presentation properties.
-	 * 
-	 * <p>
-	 * Action delegate cannot be notified about selection changes before it is loaded. For that
-	 * reason, control of action's enable state should also be performed through simple XML rules
-	 * defined for the extension point. These rules allow enable state control before the delegate
-	 * has been loaded.
-	 * </p>
-	 * 
-	 * @param action
-	 *            action proxy that handles presentation portion of the plugin action
-	 * @param selection
-	 *            current selection in the desktop
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		_currentSelection = selection;
-		int count = 0;
-		boolean fwkActivated = (ValidationPlugin.isActivated() && ValidationRegistryReader.isActivated());
-		if (fwkActivated) {
-			ValidateAction vaction = null;
-			if (action instanceof ValidateAction) {
-				vaction = (ValidateAction) action;
-			}
-			final Map projects = loadSelected(vaction, true);
-			if ((projects != null) && (projects.size() > 0)) {
-				Iterator iterator = projects.keySet().iterator();
-				while (iterator.hasNext()) {
-					// If at least one project can be validated, make "enabled"
-					// true and
-					// let the dialog tell the user which projects need to be
-					// opened,
-					// validators enabled, etc.
-					IProject project = (IProject) iterator.next();
-					if ((project != null) && (project.isOpen())) {
-						// If the validation plugin hasn't been activated yet,
-						// don't activate it just to
-						// find out if there are validators. Only ask if there
-						// are enabled validators if
-						// the plugin has already been activated.
-						try {
-							ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfigurationWithoutMigrate(project);
-							count += prjp.numberOfEnabledValidators();
-						} catch (InvocationTargetException exc) {
-							Logger logger = ValidationPlugin.getPlugin().getLogger();
-							if (logger.isLoggingLevel(Level.SEVERE)) {
-								LogEntry entry = ValidationPlugin.getLogEntry();
-								entry.setSourceIdentifier("ValidationMenuAction::selectionChanged"); //$NON-NLS-1$
-								entry.setTargetException(exc);
-								logger.write(Level.SEVERE, entry);
-								if (exc.getTargetException() != null) {
-									entry.setTargetException(exc);
-									logger.write(Level.SEVERE, entry);
-								}
-							}
-						}
-						if (count > 0)
-							break;
-					}
-				}
-			}
-		}
-		action.setEnabled((count > 0) || (!fwkActivated)); // Don't disable the
-		// action just
-		// because the
-		// framework hasn't
-		// been activated.
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.navigator.internal.views.navigator.INavigatorActionsExtension#init(org.eclipse.wst.common.navigator.internal.views.navigator.INavigatorExtensionSite)
-	 */
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IActionDelegate2#runWithEvent(org.eclipse.jface.action.IAction,
-	 *      org.eclipse.swt.widgets.Event)
-	 */
-	public void runWithEvent(IAction action, Event event) {
-		run(action);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IActionDelegate2#init(org.eclipse.jface.action.IAction)
-	 */
-	public void init(IAction action) {
-		//init
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IActionDelegate2#dispose()
-	 */
-	public void dispose() { 
-		//dispose
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	public void init(IViewPart view) { 
-		//init
-		
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ValidationPreferencePage.java b/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ValidationPreferencePage.java
deleted file mode 100644
index ff9caf3..0000000
--- a/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ValidationPreferencePage.java
+++ /dev/null
@@ -1,946 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.ui;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.logging.Level;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.ScrolledComposite;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.KeyListener;
-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.MessageBox;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPUIPlugin;
-import org.eclipse.wst.validation.internal.ConfigurationManager;
-import org.eclipse.wst.validation.internal.GlobalConfiguration;
-import org.eclipse.wst.validation.internal.ProjectConfiguration;
-import org.eclipse.wst.validation.internal.ValidationConfiguration;
-import org.eclipse.wst.validation.internal.ValidatorMetaData;
-import org.eclipse.wst.validation.internal.operations.ValidatorManager;
-import org.eclipse.wst.validation.internal.ui.plugin.ValidationUIPlugin;
-
-/**
- * This class and its inner classes are not intended to be subclassed outside of the validation
- * framework.
- */
-public class ValidationPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
-	private IValidationPage _pageImpl = null;
-
-	/**
-	 * Initially, this interface was created as an abstract class, and getControl() was implemented.
-	 * (getProject() could also have been implemented in the abstract class.) However, at runtime, a
-	 * NullPointerException was thrown; the inner class had lost its pointer to its enclosing class.
-	 * After some experimentation, I discovered that if I changed the parent to an interface, the
-	 * enclosing class could be found. (Merely moving the AValidationPage into its own file was
-	 * insufficient.)
-	 */
-	public interface IValidationPage {
-		public Composite createPage(Composite parent) throws InvocationTargetException;
-
-		public boolean performOk() throws InvocationTargetException;
-
-		public boolean performDefaults() throws InvocationTargetException;
-
-		public Composite getControl();
-
-		public void dispose();
-
-		public void loseFocus(); // Page is losing focus (event notification)
-
-		public void gainFocus(); // Page is gaining focus (event notification)
-	}
-
-	public class InvalidPage implements IValidationPage {
-		private Composite page = null;
-
-		private Composite composite = null;
-		private GridLayout layout = null;
-		private Label messageLabel = null;
-
-		public InvalidPage(Composite parent) {
-			page = createPage(parent);
-		}
-
-		/**
-		 * This page is added to the Properties guide if some internal problem occurred; for
-		 * example, the highlighted item in the workbench is not an IProject (according to this
-		 * page's plugin.xml, this page is only valid when an IProject is selected).
-		 */
-		public Composite createPage(Composite parent) {
-			// Don't create the default and apply buttons.
-			noDefaultAndApplyButton();
-
-			final ScrolledComposite sc1 = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
-			sc1.setLayoutData(new GridData(GridData.FILL_BOTH));
-			composite = new Composite(sc1, SWT.NONE);
-			sc1.setContent(composite);
-			layout = new GridLayout();
-			composite.setLayout(layout);
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, ContextIds.VALIDATION_PROPERTIES_PAGE);
-
-			messageLabel = new Label(composite, SWT.NONE);
-			messageLabel.setText(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INVALID_REGISTER));
-
-			composite.setSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
-
-			return composite;
-		}
-
-		public boolean performDefaults() {
-			return true;
-		}
-
-		/**
-		 * Since this page occurs under invalid circumstances, there is nothing to save.
-		 */
-		public boolean performOk() {
-			return true;
-		}
-
-		public Composite getControl() {
-			return page;
-		}
-
-		public void dispose() {
-			messageLabel.dispose();
-			//			layout.dispose();
-			composite.dispose();
-		}
-
-		public void loseFocus() {
-			// This page does not depend on the contents of any other page in the wizard, so do
-			// nothing.
-		}
-
-		public void gainFocus() {
-			// This page does not depend on the contents of any other page in the wizard, so do
-			// nothing.
-		}
-	}
-
-	private class NoValidatorsPage implements IValidationPage {
-		private Composite page = null;
-		private Composite composite = null;
-		private GridLayout layout = null;
-		private GridData data = null;
-		private Label messageLabel = null;
-
-		public NoValidatorsPage(Composite parent) {
-			page = createPage(parent);
-		}
-
-		/**
-		 * This page is created if an IProject is selected, but that project has no validators
-		 * configured (i.e., the page is valid, but an empty list.)
-		 */
-		public Composite createPage(Composite parent) {
-			// Don't create the default and apply buttons.
-			noDefaultAndApplyButton();
-
-			// top level group
-			final ScrolledComposite sc1 = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
-			sc1.setLayoutData(new GridData(GridData.FILL_BOTH));
-			composite = new Composite(sc1, SWT.NONE);
-			sc1.setContent(composite);
-			layout = new GridLayout();
-			composite.setLayout(layout);
-			data = new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL);
-			composite.setLayoutData(data);
-
-			messageLabel = new Label(composite, SWT.NONE);
-			messageLabel.setText(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_UI_NO_VALIDATORS_INSTALLED));
-
-			composite.setSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
-
-			return composite;
-		}
-
-
-		/**
-		 * Since there are no validators, there is nothing to save.
-		 */
-		public boolean performOk() {
-			return true;
-		}
-
-		public boolean performDefaults() {
-			return true;
-		}
-
-		public Composite getControl() {
-			return page;
-		}
-
-		public void dispose() {
-			messageLabel.dispose();
-			//			layout.dispose();
-			//			data.dispose();
-			composite.dispose();
-		}
-
-		public void loseFocus() {
-			// This page does not depend on the contents of any other page in the wizard, so do
-			// nothing.
-		}
-
-		public void gainFocus() {
-			// This page does not depend on the contents of any other page in the wizard, so do
-			// nothing.
-		}
-	}
-
-	private class ValidatorListPage implements IValidationPage {
-		private Composite page = null;
-
-		private Composite composite = null;
-		CheckboxTableViewer validatorList = null;
-		private Button selectAllButton = null;
-		private Button deselectAllButton = null;
-		private Label emptyRowPlaceholder = null;
-		Button valWhenBuildButton = null;
-		Button valWhenAutoBuildButton = null;
-		private Text maxValProblemsField = null;
-		private Label maxValProblemsFieldLabel = null;
-		Button overrideButton = null;
-		private Label listLabel = null;
-
-		GlobalConfiguration pagePreferences = null; // the values currently on the page, but not
-		// necessarily stored yet. Package visibility
-		// for the widget listeners (the compiler would
-		// have to create a synthetic accessor method in
-		// order to access this field)
-		private boolean _isAutoBuildEnabled; // initialized in the constructor
-		private ValidatorMetaData[] _oldVmd = null; // Cache the enabled validators so that, if
-		// there is no change to this list, the
-		// expensive task list update can be avoided
-		private boolean _allow = false; // Cache the value of the prefence "allow projects to
-
-		// override" so that, when OK is clicked, we can determine
-		// if "allow" has changed or not.
-
-		/**
-		 * This class is provided for the CheckboxTableViewer in the
-		 * ValidationPropertiesPage$ValidatorListPage class.
-		 */
-		public class ValidationContentProvider implements IStructuredContentProvider {
-			/**
-			 * Disposes of this content provider. This is called by the viewer when it is disposed.
-			 */
-			public void dispose() {
-				//dispose
-			}
-
-			/**
-			 * Returns the elements to display in the viewer when its input is set to the given
-			 * element. These elements can be presented as rows in a table, items in a list, etc.
-			 * The result is not modified by the viewer.
-			 * 
-			 * @param inputElement
-			 *            the input element
-			 * @return the array of elements to display in the viewer
-			 */
-			public java.lang.Object[] getElements(Object inputElement) {
-				if (inputElement instanceof ValidatorMetaData[]) {
-					// The Collection is the Collection which is returned by ValidatorManager's
-					// getConfiguredValidatorMetaData(IProject) call.
-					// This Collection is set to be the input of the CheckboxTableViewer in
-					// ValidationPropertiesPage$ValidatorListPage's createPage(Composite)
-					// method.
-					return (ValidatorMetaData[]) inputElement;
-				}
-				return new Object[0];
-			}
-
-			/**
-			 * Notifies this content provider that the given viewer's input has been switched to a
-			 * different element.
-			 * <p>
-			 * A typical use for this method is registering the content provider as a listener to
-			 * changes on the new input (using model-specific means), and deregistering the viewer
-			 * from the old input. In response to these change notifications, the content provider
-			 * propagates the changes to the viewer.
-			 * </p>
-			 * 
-			 * @param viewer
-			 *            the viewer
-			 * @param oldInput
-			 *            the old input element, or <code>null</code> if the viewer did not
-			 *            previously have an input
-			 * @param newInput
-			 *            the new input element, or <code>null</code> if the viewer does not have
-			 *            an input
-			 */
-			public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-				//do nothing
-			}
-
-
-
-		}
-
-		/**
-		 * This class is provided for ValidationPropertiesPage$ValidatorListPage's
-		 * checkboxTableViewer element.
-		 */
-		public class ValidationLabelProvider extends LabelProvider {
-			/**
-			 * Override the LabelProvider's text, by customizing the text for a ValidatorMetaData
-			 * element.
-			 */
-			public String getText(Object element) {
-				if (element == null) {
-					return ""; //$NON-NLS-1$
-				} else if (element instanceof ValidatorMetaData) {
-					return ((ValidatorMetaData) element).getValidatorDisplayName();
-				} else {
-					return super.getText(element);
-				}
-			}
-		}
-
-		/**
-		 * This class is used to sort the CheckboxTableViewer elements.
-		 */
-		public class ValidationViewerSorter extends ViewerSorter {
-			/**
-			 * Returns a negative, zero, or positive number depending on whether the first element
-			 * is less than, equal to, or greater than the second element.
-			 * <p>
-			 * The default implementation of this method is based on comparing the elements'
-			 * categories as computed by the <code>category</code> framework method. Elements
-			 * within the same category are further subjected to a case insensitive compare of their
-			 * label strings, either as computed by the content viewer's label provider, or their
-			 * <code>toString</code> values in other cases. Subclasses may override.
-			 * </p>
-			 * 
-			 * @param viewer
-			 *            the viewer
-			 * @param e1
-			 *            the first element
-			 * @param e2
-			 *            the second element
-			 * @return a negative number if the first element is less than the second element; the
-			 *         value <code>0</code> if the first element is equal to the second element;
-			 *         and a positive number if the first element is greater than the second element
-			 */
-			public int compare(Viewer viewer, Object e1, Object e2) {
-				// Can't instantiate ViewerSorter because it's abstract, so use this
-				// inner class to represent it.
-				return super.compare(viewer, e1, e2);
-			}
-		}
-
-		public ValidatorListPage(Composite parent) throws InvocationTargetException {
-			_isAutoBuildEnabled = ValidatorManager.getManager().isGlobalAutoBuildEnabled();
-			pagePreferences = new GlobalConfiguration(ConfigurationManager.getManager().getGlobalConfiguration()); // This
-			// represents
-			// the
-			// values
-			// on
-			// the
-			// page
-			// that
-			// haven't
-			// been
-			// persisted
-			// yet.
-			// Start
-			// with
-			// the
-			// last
-			// values
-			// that
-			// were
-			// persisted
-			// into
-			// the
-			// current
-			// page's
-			// starting
-			// values.
-			_oldVmd = pagePreferences.getEnabledValidators(); // Cache the enabled validators so
-			// that, if there is no change to this
-			// list, the expensive task list
-			// update can be avoided
-			_allow = pagePreferences.canProjectsOverride();
-
-			page = createPage(parent);
-		}
-
-		public Composite createPage(Composite parent) throws InvocationTargetException {
-			// top level group
-			final ScrolledComposite sc1 = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
-			sc1.setLayoutData(new GridData(GridData.FILL_BOTH));
-			composite = new Composite(sc1, SWT.NONE);
-			sc1.setContent(composite);
-			composite.setLayout(new GridLayout()); // use the layout's default preferences
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, ContextIds.VALIDATION_PREFERENCE_PAGE);
-
-			Composite validatorGroup = new Composite(composite, SWT.NONE);
-			GridLayout validatorGroupLayout = new GridLayout();
-			validatorGroupLayout.numColumns = 2;
-			validatorGroup.setLayout(validatorGroupLayout);
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(validatorGroup, ContextIds.VALIDATION_PREFERENCE_PAGE);
-
-			GridData overrideData = new GridData(GridData.FILL_HORIZONTAL);
-			overrideData.horizontalSpan = 2;
-			overrideButton = new Button(validatorGroup, SWT.CHECK);
-			overrideButton.setLayoutData(overrideData);
-			overrideButton.setText(ResourceHandler.getExternalizedMessage(ResourceConstants.PREF_BUTTON_OVERRIDE));
-			overrideButton.setEnabled(true);
-			overrideButton.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					pagePreferences.setCanProjectsOverride(overrideButton.getSelection());
-					try {
-						updateWidgets();
-					} catch (InvocationTargetException exc) {
-						displayAndLogError(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_TITLE), ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_PAGE), exc);
-					}
-				}
-			});
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(overrideButton, ContextIds.VALIDATION_PREFERENCE_PAGE_OVERRIDE);
-
-			emptyRowPlaceholder = new Label(validatorGroup, SWT.NONE);
-			emptyRowPlaceholder.setLayoutData(new GridData());
-
-			GridData valWhenBuildData = new GridData(GridData.FILL_HORIZONTAL);
-			valWhenBuildData.horizontalSpan = 2;
-			valWhenBuildButton = new Button(validatorGroup, SWT.CHECK);
-			valWhenBuildButton.setLayoutData(valWhenBuildData);
-			valWhenBuildButton.setText(ResourceHandler.getExternalizedMessage(ResourceConstants.PREF_BUTTON_FULL));
-			valWhenBuildButton.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					pagePreferences.setBuildValidate(valWhenBuildButton.getSelection());
-					valWhenBuildButton.setFocus();
-				}
-			});
-
-			GridData valWhenAutoBuildData = new GridData(GridData.FILL_HORIZONTAL);
-			valWhenAutoBuildData.horizontalSpan = 2;
-			valWhenAutoBuildButton = new Button(validatorGroup, SWT.CHECK);
-			valWhenAutoBuildButton.setLayoutData(valWhenAutoBuildData);
-			valWhenAutoBuildButton.setText(ResourceHandler.getExternalizedMessage(ResourceConstants.PREF_BUTTON_AUTO));
-			valWhenAutoBuildButton.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					pagePreferences.setAutoValidate(valWhenAutoBuildButton.getSelection());
-					valWhenAutoBuildButton.setFocus();
-				}
-			});
-
-			listLabel = new Label(validatorGroup, SWT.NONE);
-			GridData listLabelData = new GridData(GridData.FILL_HORIZONTAL);
-			listLabelData.horizontalSpan = 2;
-			listLabel.setLayoutData(listLabelData);
-			listLabel.setText(ResourceHandler.getExternalizedMessage(ResourceConstants.PREF_VALLIST_TITLE));
-
-			GridData validatorListData = new GridData(GridData.FILL_HORIZONTAL);
-			validatorListData.horizontalSpan = 2;
-			validatorList = CheckboxTableViewer.newCheckList(validatorGroup, SWT.BORDER);
-			validatorList.getTable().setLayoutData(validatorListData);
-			validatorList.setLabelProvider(new ValidationLabelProvider());
-			validatorList.setContentProvider(new ValidationContentProvider());
-			validatorList.setSorter(new ValidationViewerSorter());
-			validatorList.setInput(pagePreferences.getValidators());
-			validatorList.getTable().addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					pagePreferences.setEnabledValidators(ValidationConfiguration.convertToArray(validatorList.getCheckedElements()));
-					try {
-						updateWidgets();
-					} catch (InvocationTargetException exc) {
-						displayAndLogError(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_TITLE), ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_PAGE), exc);
-					}
-				}
-
-				public void widgetDefaultSelected(SelectionEvent e) {
-					try {
-						performDefaults();
-					} catch (InvocationTargetException exc) {
-						displayAndLogError(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_TITLE), ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_PAGE), exc);
-					}
-				}
-			});
-
-			selectAllButton = new Button(validatorGroup, SWT.PUSH);
-			selectAllButton.setLayoutData(new GridData());
-			selectAllButton.setText(ResourceHandler.getExternalizedMessage(ResourceConstants.PREF_BUTTON_SELECTALL));
-			selectAllButton.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					try {
-						performSelectAll();
-					} catch (InvocationTargetException exc) {
-						displayAndLogError(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_TITLE), ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_PAGE), exc);
-					}
-				}
-			});
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(selectAllButton, ContextIds.VALIDATION_PREFERENCE_PAGE);
-
-			deselectAllButton = new Button(validatorGroup, SWT.PUSH);
-			deselectAllButton.setLayoutData(new GridData());
-			deselectAllButton.setText(ResourceHandler.getExternalizedMessage(ResourceConstants.PREF_BUTTON_DESELECTALL));
-			deselectAllButton.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					try {
-						performDeselectAll();
-					} catch (InvocationTargetException exc) {
-						displayAndLogError(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_TITLE), ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_PAGE), exc);
-					}
-				}
-			});
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(deselectAllButton, ContextIds.VALIDATION_PREFERENCE_PAGE);
-
-			Composite buttonGroup = new Composite(composite, SWT.NONE);
-			GridLayout buttonGroupLayout = new GridLayout();
-			buttonGroupLayout.numColumns = 2;
-			buttonGroup.setLayout(buttonGroupLayout);
-			buttonGroup.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
-
-			maxValProblemsFieldLabel = new Label(buttonGroup, SWT.NONE);
-			maxValProblemsFieldLabel.setLayoutData(new GridData());
-			maxValProblemsFieldLabel.setText(ResourceHandler.getExternalizedMessage(ResourceConstants.PREF_LBL_MAXMSGS));
-
-			maxValProblemsField = new Text(buttonGroup, SWT.SINGLE | SWT.BORDER);
-			maxValProblemsField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-			maxValProblemsField.addKeyListener(new KeyListener() {
-				/**
-				 * Sent when a key is pressed on the system keyboard.
-				 * 
-				 * @param e
-				 *            an event containing information about the key press
-				 */
-				public void keyPressed(KeyEvent e) {
-					//do nothing
-				}
-
-				/**
-				 * Sent when a key is released on the system keyboard.
-				 * 
-				 * @param e
-				 *            an event containing information about the key release
-				 */
-				public void keyReleased(KeyEvent e) {
-					try {
-						pagePreferences.setMaximumNumberOfMessages(checkInteger());
-					} catch (InvocationTargetException exc) {
-						displayAndLogError(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_TITLE), ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_PAGE), exc);
-					}
-				}
-			});
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(maxValProblemsField, ContextIds.VALIDATION_PREFERENCE_PAGE_MAX_MESSAGES);
-
-			// Have to set the tab order or only the first checkbox in a Composite can
-			// be tab-ed to. (Seems to apply only to checkboxes. Have to use the arrow
-			// key to navigate the checkboxes.)
-			validatorGroup.setTabList(new Control[]{overrideButton, valWhenBuildButton, valWhenAutoBuildButton, validatorList.getTable(), selectAllButton, deselectAllButton});
-
-			updateWidgets();
-
-			composite.setSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
-
-			return composite;
-		}
-
-		protected int checkInteger() throws InvocationTargetException {
-			GlobalConfiguration gp = ConfigurationManager.getManager().getGlobalConfiguration();
-			String text = maxValProblemsField.getText();
-			if (text == null) {
-				setErrorMessage(ResourceHandler.getExternalizedMessage(ResourceConstants.PREF_ERROR_INT));
-				return gp.getMaximumNumberOfMessages();
-			}
-			try {
-				Integer tempInt = new Integer(text.trim());
-
-				// no exception? It's an int, then.
-				if (tempInt.intValue() <= 0) {
-					setErrorMessage(ResourceHandler.getExternalizedMessage(ResourceConstants.PREF_ERROR_INT));
-					return gp.getMaximumNumberOfMessages();
-				}
-				setErrorMessage(null);
-				return Integer.valueOf(maxValProblemsField.getText().trim()).intValue();
-			} catch (NumberFormatException exc) {
-				setErrorMessage(ResourceHandler.getExternalizedMessage(ResourceConstants.PREF_ERROR_INT));
-				return gp.getMaximumNumberOfMessages();
-			}
-		}
-
-		protected void updateWidgets() throws InvocationTargetException {
-			// Need to update even the widgets that do not change based on another
-			// widgets because of performDefaults(). If performDefaults() is selected,
-			// then the pagePreferences values are reset, and these widgets
-			// might also need to be updated.
-			overrideButton.setSelection(pagePreferences.canProjectsOverride());
-
-			maxValProblemsField.setText(String.valueOf(pagePreferences.getMaximumNumberOfMessages()));
-
-			updateTable();
-
-			boolean valEnabled = (pagePreferences.numberOfEnabledValidators() > 0);
-			valWhenBuildButton.setEnabled(valEnabled);
-			valWhenBuildButton.setSelection(pagePreferences.isBuildValidate() && valEnabled);
-
-			boolean incValEnabled = (pagePreferences.numberOfEnabledIncrementalValidators() > 0);
-			valWhenAutoBuildButton.setEnabled(_isAutoBuildEnabled && incValEnabled);
-			valWhenAutoBuildButton.setSelection(pagePreferences.isAutoValidate() && incValEnabled && _isAutoBuildEnabled);
-
-			updateHelp();
-		}
-
-		protected void updateTable() throws InvocationTargetException {
-			TableItem[] items = validatorList.getTable().getItems();
-			for (int i = 0; i < items.length; i++) {
-				TableItem item = items[i];
-				ValidatorMetaData vmd = (ValidatorMetaData) item.getData();
-
-				// Should the validator be enabled? Read the user's preferences from last time,
-				// if they exist, and set from that. If they don't exist, use the Validator class'
-				// default value.
-				validatorList.setChecked(vmd, pagePreferences.isEnabled(vmd));
-			}
-		}
-
-		public boolean performOk() throws InvocationTargetException {
-			storeValues();
-			updateTaskList();
-			return true;
-		}
-
-		public boolean performDefaults() throws InvocationTargetException {
-			pagePreferences.resetToDefault();
-			updateWidgets();
-			checkInteger(); // clear the "max must be a positive integer" message if it exists
-			getDefaultsButton().setFocus();
-			return true;
-		}
-
-		public boolean performSelectAll() throws InvocationTargetException {
-			validatorList.setAllChecked(true);
-			pagePreferences.setEnabledValidators(ValidationConfiguration.convertToArray(validatorList.getCheckedElements()));
-			updateWidgets();
-			selectAllButton.setFocus();
-			return true;
-		}
-
-		public boolean performDeselectAll() throws InvocationTargetException {
-			validatorList.setAllChecked(false);
-			pagePreferences.setEnabledValidators(ValidationConfiguration.convertToArray(validatorList.getCheckedElements()));
-			updateWidgets();
-			deselectAllButton.setFocus();
-			return true;
-		}
-
-		protected void updateHelp() {
-			// never disable this widget because users don't expect the preference page to alter
-			// based on workbench contents
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(valWhenBuildButton, ContextIds.VALIDATION_PREFERENCE_PAGE_REBUILD_ENABLED);
-
-			// never disable this widget because users don't expect the preference page to alter
-			// based on workbench contents
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(valWhenAutoBuildButton, ContextIds.VALIDATION_PREFERENCE_PAGE_AUTO_ENABLED);
-		}
-
-		/*
-		 * Store the current values of the controls into the preference store.
-		 */
-		private void storeValues() throws InvocationTargetException {
-			pagePreferences.setCanProjectsOverride(overrideButton.getSelection());
-
-			// If the manual build button is disabled because no validators are selected in the
-			// task list, don't overwrite the user's preference.
-			if (valWhenBuildButton.isEnabled()) {
-				pagePreferences.setBuildValidate(valWhenBuildButton.getSelection());
-			}
-
-			// If the auto build button is disabled because no validators are selected in the
-			// task list, or because auto-build is disabled, don't overwrite the user's preference.
-			if (valWhenAutoBuildButton.isEnabled()) {
-				pagePreferences.setAutoValidate(valWhenAutoBuildButton.getSelection());
-			}
-
-			pagePreferences.setMaximumNumberOfMessages(checkInteger());
-			pagePreferences.setEnabledValidators(ValidationConfiguration.convertToArray(validatorList.getCheckedElements()));
-
-			pagePreferences.passivate();
-			pagePreferences.store();
-			// If the projects aren't allowed to override, clear their settings.
-			if (!pagePreferences.canProjectsOverride()) {
-				IWorkspace workspace = ResourcesPlugin.getWorkspace();
-				IProject[] projects = workspace.getRoot().getProjects();
-				for (int i = 0; i < projects.length; i++) {
-					IProject project = projects[i];
-					try {
-						if (project.isOpen()) {
-							if (ConfigurationManager.getManager().isMigrated(project)) {
-								ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-								prjp.setDoesProjectOverride(false);
-								prjp.passivate();
-								prjp.store();
-							}
-						}
-					} catch (InvocationTargetException exc) {
-						displayAndLogError(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_TITLE), ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_PAGE), exc);
-					}
-				}
-			}
-
-		}
-
-		private void updateTaskList() {
-			IWorkspace workspace = ResourcesPlugin.getWorkspace();
-			IProject[] projects = workspace.getRoot().getProjects();
-			boolean allowChanged = (pagePreferences.canProjectsOverride() != _allow);
-			for (int i = 0; i < projects.length; i++) {
-				IProject project = projects[i];
-				try {
-					if (project.isOpen()) {
-						ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-						if (!prjp.doesProjectOverride() && (prjp.hasEnabledValidatorsChanged(_oldVmd, allowChanged) || ValidatorManager.getManager().isMessageLimitExceeded(project))) {
-							// If the project used to override the preferences, and the preferences
-							// make that impossible now, then update the task list.
-							//
-							// If the preferences allow projects to override, and they don't, and if
-							// the validators have changed, then update the task list.
-							ValidatorManager.getManager().updateTaskList(project); // Do not remove
-							// the exceeded
-							// message; only
-							// ValidationOperation
-							// should do that
-							// because it's
-							// about to run
-							// validation. If
-							// the limit is
-							// increased,
-							// messages may
-							// still be
-							// missing, so
-							// don't remove
-							// the "messages
-							// may be
-							// missing"
-							// message.
-						}
-					}
-				} catch (InvocationTargetException exc) {
-					displayAndLogError(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_TITLE), ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_PAGE), exc);
-				}
-			}
-		}
-
-		public Composite getControl() {
-			return page;
-		}
-
-		public void dispose() {
-			listLabel.dispose();
-			overrideButton.dispose();
-			maxValProblemsField.dispose();
-			maxValProblemsFieldLabel.dispose();
-			valWhenAutoBuildButton.dispose();
-			valWhenBuildButton.dispose();
-			emptyRowPlaceholder.dispose();
-			deselectAllButton.dispose();
-			selectAllButton.dispose();
-			validatorList.getTable().dispose();
-			//			validatorList.dispose();
-			//			layout.dispose();
-			//			data.dispose();
-			composite.dispose();
-		}
-
-		public void loseFocus() {
-			// This page does not need to cache anything before it loses focus.
-		}
-
-		public void gainFocus() {
-			// This page depends on the Workbench Preference page, so update the value of the
-			// isAutoBuild (in case the workbench page's value has changed), and then update
-			// this page's widgets.
-			try {
-				_isAutoBuildEnabled = ValidatorManager.getManager().isGlobalAutoBuildEnabled();
-				updateWidgets();
-			} catch (InvocationTargetException exc) {
-				displayAndLogError(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_TITLE), ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_PAGE), exc);
-			}
-		}
-	}
-
-	/*
-	 * @see PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		try {
-			GlobalConfiguration gp = ConfigurationManager.getManager().getGlobalConfiguration();
-			if (gp.numberOfValidators() == 0) {
-				_pageImpl = new NoValidatorsPage(parent);
-			} else {
-				try {
-					_pageImpl = new ValidatorListPage(parent);
-				} catch (InvocationTargetException exc) {
-					_pageImpl = new InvalidPage(parent);
-					displayAndLogError(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_TITLE), ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_PAGE), exc);
-				} catch (Throwable exc) {
-					_pageImpl = new InvalidPage(parent);
-					displayAndLogError(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_TITLE), ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_PAGE), exc);
-				}
-			}
-		} catch (InvocationTargetException exc) {
-			_pageImpl = new InvalidPage(parent);
-			displayAndLogError(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_TITLE), ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_PAGE), exc);
-		} catch (Throwable exc) {
-			_pageImpl = new InvalidPage(parent);
-			displayAndLogError(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_TITLE), ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_PAGE), exc);
-		}
-
-		return _pageImpl.getControl();
-	}
-
-	/*
-	 * @see IWorkbenchPreferencePage#init(IWorkbench)
-	 */
-	public void init(IWorkbench workbench) {
-		//init
-	}
-
-	protected void noDefaultAndApplyButton() {
-		super.noDefaultAndApplyButton();
-	}
-
-	/**
-	 * Performs special processing when this page's Defaults button has been pressed.
-	 * <p>
-	 * This is a framework hook method for sublcasses to do special things when the Defaults button
-	 * has been pressed. Subclasses may override, but should call <code>super.performDefaults</code>.
-	 * </p>
-	 */
-	protected void performDefaults() {
-		super.performDefaults();
-
-		try {
-			_pageImpl.performDefaults();
-		} catch (InvocationTargetException exc) {
-			displayAndLogError(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_TITLE), ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_PAGE), exc);
-		} catch (Throwable exc) {
-			displayAndLogError(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_TITLE), ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_PAGE), exc);
-		}
-	}
-
-	/**
-	 * When the user presses the "OK" or "Apply" button on the Properties Guide/Properties Page,
-	 * respectively, some processing is performed by this PropertyPage. If the page is found, and
-	 * completes successfully, true is returned. Otherwise, false is returned, and the guide doesn't
-	 * finish.
-	 */
-	public boolean performOk() {
-		try {
-			return _pageImpl.performOk();
-		} catch (InvocationTargetException exc) {
-			displayAndLogError(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_TITLE), ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_PAGE), exc);
-			return false;
-		} catch (Throwable exc) {
-			displayAndLogError(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_TITLE), ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_PAGE), exc);
-			return false;
-		}
-	}
-
-	/**
-	 * Since the pages are inner classes of a child PreferencePage, not a PreferencePage itself,
-	 * DialogPage's automatic disposal of its children's widgets cannot be used. Instead, dispose of
-	 * each inner class' widgets explicitly.
-	 */
-	public void dispose() {
-		super.dispose();
-		try {
-			if (_pageImpl != null) {
-				_pageImpl.dispose();
-			}
-		} catch (Throwable exc) {
-			displayAndLogError(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_TITLE), ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_PAGE), exc);
-		}
-	}
-
-	private void logError(Throwable exc) {
-		Logger logger = WTPUIPlugin.getLogger();
-		if (logger.isLoggingLevel(Level.SEVERE)) {
-			LogEntry entry = ValidationUIPlugin.getLogEntry();
-			entry.setSourceIdentifier("ValidationPreferencePage.displayAndLogError"); //$NON-NLS-1$
-			entry.setMessageTypeIdentifier(ResourceConstants.VBF_EXC_INTERNAL_PAGE);
-			entry.setTargetException(exc);
-			logger.write(Level.SEVERE, entry);
-
-			if (exc instanceof InvocationTargetException) {
-				if (((InvocationTargetException) exc).getTargetException() != null) {
-					entry.setTargetException(((InvocationTargetException) exc).getTargetException());
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-		}
-	}
-
-	/**
-	 * package visibility because if this method is private, then the compiler needs to create a
-	 * synthetic accessor method for the internal classes, and that can have performance
-	 * implications.
-	 */
-	void displayAndLogError(String title, String message, Throwable exc) {
-		logError(exc);
-		displayMessage(title, message, org.eclipse.swt.SWT.ICON_ERROR);
-	}
-
-	private void displayMessage(String title, String message, int iIconType) {
-		MessageBox messageBox = new MessageBox(getShell(), org.eclipse.swt.SWT.OK | iIconType | org.eclipse.swt.SWT.APPLICATION_MODAL);
-		messageBox.setMessage(message);
-		messageBox.setText(title);
-		messageBox.open();
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#setVisible(boolean)
-	 */
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-		if (_pageImpl == null)
-			return;
-		if (visible) {
-			_pageImpl.gainFocus();
-		} else {
-			_pageImpl.loseFocus();
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.PreferencePage#getDefaultsButton()
-	 */
-	protected Button getDefaultsButton() {
-		return super.getDefaultsButton();
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ValidationPropertiesPage.java b/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ValidationPropertiesPage.java
deleted file mode 100644
index 36ff675..0000000
--- a/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ValidationPropertiesPage.java
+++ /dev/null
@@ -1,1033 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.ui;
-
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.logging.Level;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.ScrolledComposite;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.KeyListener;
-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.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.MessageBox;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.PropertyPage;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPUIPlugin;
-import org.eclipse.wst.validation.internal.ConfigurationManager;
-import org.eclipse.wst.validation.internal.GlobalConfiguration;
-import org.eclipse.wst.validation.internal.ProjectConfiguration;
-import org.eclipse.wst.validation.internal.ValidationConfiguration;
-import org.eclipse.wst.validation.internal.ValidatorMetaData;
-import org.eclipse.wst.validation.internal.operations.ValidatorManager;
-import org.eclipse.wst.validation.internal.ui.plugin.ValidationUIPlugin;
-
-/**
- * This class and its inner classes are not intended to be subclassed outside of the validation
- * framework.
- * 
- * This page implements the PropertyPage for validators; viewed when the user right-clicks on the
- * IProject, selects "Properties", and then "Validation."
- * 
- * There exist three possible page layouts: if there is an eclipse internal error, and the page is
- * brought up on a non-IProject type; if there are no validators configured on that type of
- * IProject, and a page which lists all validators configured on that type of IProject. These three
- * pages are implemented as inner classes, so that it's clear which method is needed for which
- * input. When all of the methods, and behaviour, were implemented in this one class, much more
- * error-checking had to be done, to ensure that the method wasn't being called incorrectly by one
- * of the pages.
- */
-public class ValidationPropertiesPage extends PropertyPage {
-	static final String NEWLINE = System.getProperty("line.separator"); //$NON-NLS-1$
-	static final String TAB = "\t"; //$NON-NLS-1$
-	static final String NEWLINE_AND_TAB = NEWLINE + TAB;
-	private IValidationPage _pageImpl = null;
-
-	/**
-	 * Initially, this interface was created as an abstract class, and getControl() was implemented.
-	 * (getProject() could also have been implemented in the abstract class.) However, at runtime, a
-	 * NullPointerException was thrown; the inner class had lost its pointer to its enclosing class.
-	 * After some experimentation, I discovered that if I changed the parent to an interface, the
-	 * enclosing class could be found. (Merely moving the AValidationPage into its own file was
-	 * insufficient.)
-	 */
-	public interface IValidationPage {
-		public abstract Composite createPage(Composite parent) throws InvocationTargetException;
-
-		public abstract boolean performOk() throws InvocationTargetException;
-
-		public boolean performDefaults() throws InvocationTargetException;
-
-		public Composite getControl();
-
-		public abstract void dispose();
-	}
-
-	public class InvalidPage implements IValidationPage {
-		private Composite page = null;
-
-		private Composite composite = null;
-		private GridLayout layout = null;
-		private Label messageLabel = null;
-
-		public InvalidPage(Composite parent) {
-			page = createPage(parent);
-		}
-
-		/**
-		 * This page is added to the Properties guide if some internal problem occurred; for
-		 * example, the highlighted item in the workbench is not an IProject (according to this
-		 * page's plugin.xml, this page is only valid when an IProject is selected).
-		 */
-		public Composite createPage(Composite parent) {
-			// Don't create the default and apply buttons.
-			noDefaultAndApplyButton();
-
-			final ScrolledComposite sc1 = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
-			sc1.setLayoutData(new GridData(GridData.FILL_BOTH));
-			composite = new Composite(sc1, SWT.NONE);
-			sc1.setContent(composite);
-			layout = new GridLayout();
-			composite.setLayout(layout);
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, ContextIds.VALIDATION_PROPERTIES_PAGE);
-
-			messageLabel = new Label(composite, SWT.NONE);
-			messageLabel.setText(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INVALID_REGISTER));
-
-			composite.setSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
-
-			return composite;
-		}
-
-		public boolean performDefaults() {
-			return true;
-		}
-
-		/**
-		 * Since this page occurs under invalid circumstances, there is nothing to save.
-		 */
-		public boolean performOk() {
-			return true;
-		}
-
-		public Composite getControl() {
-			return page;
-		}
-
-		public void dispose() {
-			messageLabel.dispose();
-			//			layout.dispose();
-			composite.dispose();
-		}
-	}
-
-	public class NoValidatorsPage implements IValidationPage {
-		private Composite page = null;
-
-		private Composite composite = null;
-		private GridLayout layout = null;
-		private GridData data = null;
-		private Label messageLabel = null;
-
-		public NoValidatorsPage(Composite parent) {
-			page = createPage(parent);
-		}
-
-		/**
-		 * This page is created if an IProject is selected, but that project has no validators
-		 * configured (i.e., the page is valid, but an empty list.)
-		 */
-		public Composite createPage(Composite parent) {
-			// Don't create the default and apply buttons.
-			noDefaultAndApplyButton();
-
-			// top level group
-			final ScrolledComposite sc1 = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
-			sc1.setLayoutData(new GridData(GridData.FILL_BOTH));
-			composite = new Composite(sc1, SWT.NONE);
-			sc1.setContent(composite);
-			layout = new GridLayout();
-			composite.setLayout(layout);
-			data = new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL);
-			composite.setLayoutData(data);
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, ContextIds.VALIDATION_PROPERTIES_PAGE);
-
-			messageLabel = new Label(composite, SWT.NONE);
-			String[] msgParm = {getProject().getName()};
-			messageLabel.setText(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_UI_LBL_NOVALIDATORS_DESC, msgParm));
-			composite.setSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
-			return composite;
-		}
-
-		public boolean performDefaults() {
-			return true;
-		}
-
-		/**
-		 * Since there are no validators, there is nothing to save.
-		 */
-		public boolean performOk() {
-			return true;
-		}
-
-		public Composite getControl() {
-			return page;
-		}
-
-		public void dispose() {
-			messageLabel.dispose();
-			//			layout.dispose();
-			//			data.dispose();
-			composite.dispose();
-		}
-	}
-
-	public class ValidatorListPage implements IValidationPage {
-		Composite page = null;
-		GridLayout layout = null;
-		GridData data = null;
-		Label messageLabel = null;
-		CheckboxTableViewer validatorList = null;
-		Button overrideGlobalButton = null;
-		Button autoButton = null;
-		Button valWhenBuildButton = null;
-		Button selectAllButton = null;
-		Button deselectAllButton = null;
-		Label emptyRowPlaceholder = null;
-		Text maxValProblemsField = null;
-		Label maxValProblemsFieldLabel = null;
-
-		ProjectConfiguration pagePreferences = null;
-
-		// default values for the widgets, initialized in the constructor
-		private boolean isAutoBuildEnabled = false;
-		private boolean isBuilderConfigured = false;
-		private boolean canOverride = false;
-
-		private ValidatorMetaData[] oldVmd = null; // Cache the enabled validators so that, if there
-
-		// is no change to this list, the expensive task
-		// list update can be avoided
-
-		/**
-		 * This class is provided for the CheckboxTableViewer in the
-		 * ValidationPropertiesPage$ValidatorListPage class.
-		 */
-		public class ValidationContentProvider implements IStructuredContentProvider {
-			/**
-			 * Disposes of this content provider. This is called by the viewer when it is disposed.
-			 */
-			public void dispose() {
-				//dispose
-			}
-
-			/**
-			 * Returns the elements to display in the viewer when its input is set to the given
-			 * element. These elements can be presented as rows in a table, items in a list, etc.
-			 * The result is not modified by the viewer.
-			 * 
-			 * @param inputElement
-			 *            the input element
-			 * @return the array of elements to display in the viewer
-			 */
-			public java.lang.Object[] getElements(Object inputElement) {
-				if (inputElement instanceof ValidatorMetaData[]) {
-					// The ValidatorMetaData[] is the array which is returned by ValidatorManager's
-					// getConfiguredValidatorMetaData(IProject) call.
-					// This array is set to be the input of the CheckboxTableViewer in
-					// ValidationPropertiesPage$ValidatorListPage's createPage(Composite)
-					// method.
-					return (ValidatorMetaData[]) inputElement;
-				}
-				return new Object[0];
-			}
-
-			/**
-			 * Notifies this content provider that the given viewer's input has been switched to a
-			 * different element.
-			 * <p>
-			 * A typical use for this method is registering the content provider as a listener to
-			 * changes on the new input (using model-specific means), and deregistering the viewer
-			 * from the old input. In response to these change notifications, the content provider
-			 * propagates the changes to the viewer.
-			 * </p>
-			 * 
-			 * @param viewer
-			 *            the viewer
-			 * @param oldInput
-			 *            the old input element, or <code>null</code> if the viewer did not
-			 *            previously have an input
-			 * @param newInput
-			 *            the new input element, or <code>null</code> if the viewer does not have
-			 *            an input
-			 */
-			public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-				//do nothing
-			}
-
-
-
-		}
-
-		/**
-		 * This class is provided for ValidationPropertiesPage$ValidatorListPage's
-		 * checkboxTableViewer element.
-		 */
-		public class ValidationLabelProvider extends LabelProvider {
-			/**
-			 * Override the LabelProvider's text, by customizing the text for a ValidatorMetaData
-			 * element.
-			 */
-			public String getText(Object element) {
-				if (element == null) {
-					return ""; //$NON-NLS-1$
-				} else if (element instanceof ValidatorMetaData) {
-					return ((ValidatorMetaData) element).getValidatorDisplayName();
-				} else {
-					return super.getText(element);
-				}
-			}
-		}
-
-		/**
-		 * This class is used to sort the CheckboxTableViewer elements.
-		 */
-		public class ValidationViewerSorter extends ViewerSorter {
-			/**
-			 * Returns a negative, zero, or positive number depending on whether the first element
-			 * is less than, equal to, or greater than the second element.
-			 * <p>
-			 * The default implementation of this method is based on comparing the elements'
-			 * categories as computed by the <code>category</code> framework method. Elements
-			 * within the same category are further subjected to a case insensitive compare of their
-			 * label strings, either as computed by the content viewer's label provider, or their
-			 * <code>toString</code> values in other cases. Subclasses may override.
-			 * </p>
-			 * 
-			 * @param viewer
-			 *            the viewer
-			 * @param e1
-			 *            the first element
-			 * @param e2
-			 *            the second element
-			 * @return a negative number if the first element is less than the second element; the
-			 *         value <code>0</code> if the first element is equal to the second element;
-			 *         and a positive number if the first element is greater than the second element
-			 */
-			public int compare(Viewer viewer, Object e1, Object e2) {
-				// Can't instantiate ViewerSorter because it's abstract, so use this
-				// inner class to represent it.
-				return super.compare(viewer, e1, e2);
-			}
-		}
-
-		public ValidatorListPage(Composite parent) throws InvocationTargetException {
-			ConfigurationManager prefMgr = ConfigurationManager.getManager();
-			ValidatorManager vMgr = ValidatorManager.getManager();
-
-			pagePreferences = new ProjectConfiguration(prefMgr.getProjectConfiguration(getProject())); // This
-			// represents
-			// the
-			// values
-			// on
-			// the
-			// page
-			// that
-			// haven't
-			// been
-			// persisted
-			// yet.
-			// Start
-			// with
-			// the
-			// last
-			// values
-			// that
-			// were
-			// persisted
-			// into
-			// the
-			// current
-			// page's
-			// starting
-			// values.
-
-			// store the default values for the widgets
-			canOverride = prefMgr.getGlobalConfiguration().canProjectsOverride();
-			isAutoBuildEnabled = vMgr.isGlobalAutoBuildEnabled();
-			isBuilderConfigured = ValidatorManager.doesProjectSupportBuildValidation(getProject());
-			oldVmd = pagePreferences.getEnabledValidators(); // Cache the enabled validators so
-			// that, if there is no change to this
-			// list, the expensive task list update
-			// can be avoided
-
-			createPage(parent);
-		}
-
-		/**
-		 * This page is created if the current project has at least one validator configured on it.
-		 */
-		public Composite createPage(Composite parent) throws InvocationTargetException {
-			// top level group
-			final ScrolledComposite sc1 = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
-			sc1.setLayoutData(new GridData(GridData.FILL_BOTH));
-			page = new Composite(sc1, SWT.NONE);
-			sc1.setContent(page);
-			page.setLayout(new GridLayout()); // use the layout's default preferences
-
-			Composite validatorGroup = new Composite(page, SWT.NONE);
-			GridLayout validatorGroupLayout = new GridLayout();
-			validatorGroupLayout.numColumns = 2;
-			validatorGroup.setLayout(validatorGroupLayout);
-
-			GridData overrideData = new GridData(GridData.FILL_HORIZONTAL);
-			overrideData.horizontalSpan = 2;
-			overrideGlobalButton = new Button(validatorGroup, SWT.CHECK);
-			overrideGlobalButton.setLayoutData(overrideData);
-			overrideGlobalButton.setText(ResourceHandler.getExternalizedMessage(ResourceConstants.PROP_BUTTON_OVERRIDE, new String[]{getProject().getName()}));
-			overrideGlobalButton.setFocus(); // must focus on something for F1 to have a topic to
-			// launch
-			overrideGlobalButton.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					pagePreferences.setDoesProjectOverride(overrideGlobalButton.getSelection());
-					try {
-						updateWidgets();
-					} catch (InvocationTargetException exc) {
-						displayAndLogError(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_TITLE), ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_PAGE), exc);
-					}
-				}
-			});
-
-
-			emptyRowPlaceholder = new Label(validatorGroup, SWT.NONE);
-			emptyRowPlaceholder.setLayoutData(new GridData());
-
-			GridData valWhenBuildData = new GridData(GridData.FILL_HORIZONTAL);
-			valWhenBuildData.horizontalSpan = 2;
-			valWhenBuildButton = new Button(validatorGroup, SWT.CHECK);
-			valWhenBuildButton.setLayoutData(valWhenBuildData);
-			valWhenBuildButton.setText(ResourceHandler.getExternalizedMessage(ResourceConstants.PROP_BUTTON_FULL, new String[]{getProject().getName()}));
-			valWhenBuildButton.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					pagePreferences.setBuildValidate(valWhenBuildButton.getSelection());
-					valWhenBuildButton.setFocus();
-				}
-			});
-
-			GridData valWhenAutoBuildData = new GridData(GridData.FILL_HORIZONTAL);
-			valWhenAutoBuildData.horizontalSpan = 2;
-			autoButton = new Button(validatorGroup, SWT.CHECK);
-			autoButton.setLayoutData(valWhenAutoBuildData);
-			autoButton.setText(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_UI_LBL_AUTO_VALIDATE, new String[]{getProject().getName()}));
-			autoButton.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					pagePreferences.setAutoValidate(autoButton.getSelection());
-					autoButton.setFocus();
-				}
-			});
-
-			GridData listLabelData = new GridData(GridData.FILL_HORIZONTAL);
-			listLabelData.horizontalSpan = 2;
-			messageLabel = new Label(validatorGroup, SWT.NONE);
-			messageLabel.setText(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_UI_LBL_DESC, new String[]{getProject().getName()}));
-			messageLabel.setLayoutData(listLabelData);
-
-			GridData validatorListData = new GridData(GridData.FILL_HORIZONTAL);
-			validatorListData.horizontalSpan = 2;
-			validatorList = CheckboxTableViewer.newCheckList(validatorGroup, SWT.BORDER);
-			validatorList.getTable().setLayoutData(validatorListData);
-			validatorList.setLabelProvider(new ValidationLabelProvider());
-			validatorList.setContentProvider(new ValidationContentProvider());
-			validatorList.setSorter(new ValidationViewerSorter());
-			validatorList.getTable().addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					pagePreferences.setEnabledValidators(ValidationConfiguration.convertToArray(validatorList.getCheckedElements()));
-					try {
-						updateWidgets();
-					} catch (InvocationTargetException exc) {
-						displayAndLogError(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_TITLE), ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_PAGE), exc);
-					}
-				}
-			});
-			validatorList.setInput(pagePreferences.getValidators());
-
-			selectAllButton = new Button(validatorGroup, SWT.PUSH);
-			GridData selectData = new GridData();
-			selectAllButton.setLayoutData(selectData);
-			selectAllButton.setText(ResourceHandler.getExternalizedMessage(ResourceConstants.PROP_BUTTON_SELECTALL));
-			selectAllButton.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					try {
-						performSelectAll();
-					} catch (InvocationTargetException exc) {
-						displayAndLogError(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_TITLE), ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_PAGE), exc);
-					}
-				}
-			});
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(selectAllButton, ContextIds.VALIDATION_PROPERTIES_PAGE);
-
-
-			GridData deselectData = new GridData();
-			deselectAllButton = new Button(validatorGroup, SWT.PUSH);
-			deselectAllButton.setLayoutData(deselectData);
-			deselectAllButton.setText(ResourceHandler.getExternalizedMessage(ResourceConstants.PROP_BUTTON_DESELECTALL));
-			deselectAllButton.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					try {
-						performDeselectAll();
-					} catch (InvocationTargetException exc) {
-						displayAndLogError(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_TITLE), ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_PAGE), exc);
-					}
-				}
-			});
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(deselectAllButton, ContextIds.VALIDATION_PROPERTIES_PAGE);
-
-			Composite maxGroup = new Composite(page, SWT.NONE);
-			GridLayout maxGroupLayout = new GridLayout();
-			maxGroupLayout.numColumns = 2;
-			maxGroup.setLayout(maxGroupLayout);
-			GridData maxGroupData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-			maxGroup.setLayoutData(maxGroupData);
-
-			GridData maxLabel = new GridData();
-			maxValProblemsFieldLabel = new Label(maxGroup, SWT.NONE);
-			maxValProblemsFieldLabel.setLayoutData(maxLabel);
-			maxValProblemsFieldLabel.setText(ResourceHandler.getExternalizedMessage(ResourceConstants.PROP_LBL_MAXMSSGS, new String[]{getProject().getName()}));
-
-			maxValProblemsField = new Text(maxGroup, SWT.SINGLE | SWT.BORDER);
-			GridData maxValProblemsData = new GridData(GridData.FILL_HORIZONTAL);
-			maxValProblemsField.setLayoutData(maxValProblemsData);
-			maxValProblemsField.addKeyListener(new KeyListener() {
-				/**
-				 * Sent when a key is pressed on the system keyboard.
-				 * 
-				 * @param e
-				 *            an event containing information about the key press
-				 */
-				public void keyPressed(KeyEvent e) {
-					//do nothing
-				}
-
-				/**
-				 * Sent when a key is released on the system keyboard.
-				 * 
-				 * @param e
-				 *            an event containing information about the key release
-				 */
-				public void keyReleased(KeyEvent e) {
-					try {
-						pagePreferences.setMaximumNumberOfMessages(checkInteger());
-					} catch (InvocationTargetException exc) {
-						displayAndLogError(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_TITLE), ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_PAGE), exc);
-					}
-				}
-			});
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(maxValProblemsField, ContextIds.VALIDATION_PROPERTIES_PAGE_MAX_MESSAGES);
-
-			// Have to set the tab order or only the first checkbox in a Composite can
-			// be tab-ed to. (Seems to apply only to checkboxes. Have to use the arrow
-			// key to navigate the checkboxes.)
-			validatorGroup.setTabList(new Control[]{overrideGlobalButton, valWhenBuildButton, autoButton, validatorList.getTable(), selectAllButton, deselectAllButton});
-
-			updateWidgets();
-
-			page.setSize(page.computeSize(SWT.DEFAULT, SWT.DEFAULT));
-
-			return page;
-		}
-
-		protected void updateTable() throws InvocationTargetException {
-			TableItem[] items = validatorList.getTable().getItems();
-			for (int i = 0; i < items.length; i++) {
-				TableItem item = items[i];
-				ValidatorMetaData vmd = (ValidatorMetaData) item.getData();
-
-				// Should the validator be enabled? Read the user's preferences from last time,
-				// if they exist, and set from that. If they don't exist, use the Validator class'
-				// default value.
-				validatorList.setChecked(vmd, pagePreferences.isEnabled(vmd));
-			}
-		}
-
-		public boolean performDefaults() throws InvocationTargetException {
-			pagePreferences.resetToDefault();
-			updateWidgets();
-			checkInteger(); // clear the "max must be a positive integer" message if it exists
-			getDefaultsButton().setFocus();
-			return true;
-		}
-
-		public boolean performSelectAll() throws InvocationTargetException {
-			validatorList.setAllChecked(true);
-			pagePreferences.setEnabledValidators(ValidationConfiguration.convertToArray(validatorList.getCheckedElements()));
-			updateWidgets();
-			selectAllButton.setFocus();
-			return true;
-		}
-
-		public boolean performDeselectAll() throws InvocationTargetException {
-			validatorList.setAllChecked(false);
-			pagePreferences.setEnabledValidators(ValidationConfiguration.convertToArray(validatorList.getCheckedElements()));
-			updateWidgets();
-			deselectAllButton.setFocus();
-			return true;
-		}
-
-		protected int checkInteger() throws InvocationTargetException {
-			ProjectConfiguration pc = ConfigurationManager.getManager().getProjectConfiguration(getProject());
-			String text = maxValProblemsField.getText();
-			if (text == null) {
-				setErrorMessage(ResourceHandler.getExternalizedMessage(ResourceConstants.PROP_ERROR_INT));
-				return pc.getMaximumNumberOfMessages();
-			}
-			try {
-				Integer tempInt = new Integer(text.trim());
-
-				// no exception? It's an int, then.
-				if (tempInt.intValue() <= 0) {
-					setErrorMessage(ResourceHandler.getExternalizedMessage(ResourceConstants.PROP_ERROR_INT));
-					return pc.getMaximumNumberOfMessages();
-				}
-				setErrorMessage(null);
-				return Integer.valueOf(maxValProblemsField.getText().trim()).intValue();
-			} catch (NumberFormatException exc) {
-				setErrorMessage(ResourceHandler.getExternalizedMessage(ResourceConstants.PROP_ERROR_INT));
-				return pc.getMaximumNumberOfMessages();
-			}
-
-		}
-
-		void updateWidgets() throws InvocationTargetException {
-			// Since the setting of the "override" button enables/disables the other widgets on the
-			// page,
-			// update the enabled state of the other widgets from the "override" button.
-			boolean overridePreferences = canOverride && pagePreferences.doesProjectOverride();
-
-			overrideGlobalButton.setEnabled(canOverride);
-			overrideGlobalButton.setSelection(overridePreferences);
-
-			validatorList.getTable().setEnabled(overridePreferences);
-			validatorList.setAllGrayed(!overridePreferences);
-
-			selectAllButton.setEnabled(overridePreferences); // since help messsage isn't
-			// context-sensitive, it's set in the
-			// createPage method
-			deselectAllButton.setEnabled(overridePreferences);
-
-			maxValProblemsField.setEnabled(overridePreferences);
-			maxValProblemsField.setText(String.valueOf(pagePreferences.getMaximumNumberOfMessages()));
-
-			updateTable();
-
-			// Never check if builder is configured because if it isn't, the user needs to be able
-			// to add the builder via the instructions on the F1 infopops.
-			// In the case when the builder isn't configured, show the checkbox as enabled but
-			// cleared
-			// The only time that these two checkboxes are disabled is when no validators are
-			// enabled in the list.
-			boolean valEnabled = (pagePreferences.numberOfEnabledValidators() > 0);
-			valWhenBuildButton.setEnabled(overridePreferences && valEnabled);
-			valWhenBuildButton.setSelection(pagePreferences.isBuildValidate() && valEnabled && isBuilderConfigured);
-
-			boolean incValEnabled = (pagePreferences.numberOfEnabledIncrementalValidators() > 0);
-			autoButton.setEnabled(overridePreferences && isAutoBuildEnabled && incValEnabled);
-			autoButton.setSelection(pagePreferences.isAutoValidate() && incValEnabled && isAutoBuildEnabled && isBuilderConfigured);
-
-			updateHelp();
-		}
-
-		protected void updateHelp() throws InvocationTargetException {
-			// Whenever a widget is disabled, it cannot get focus.
-			// Since it can't have focus, its context-sensitive F1 help can't come up.
-			// From experimentation, I know that the composite parent of the widget
-			// can't have focus either. So, fudge the focus by making the table the widget
-			// surrogate so that the F1 help can be shown, with its instructions on how to
-			// enable the disabled widget. The table never has F1 help associated with it other
-			// than the page F1, so this fudge doesn't remove any context-sensitive help
-			// from the table widget.
-
-			if (autoButton.getEnabled()) {
-				// set the table's help back to what it was
-				PlatformUI.getWorkbench().getHelpSystem().setHelp(validatorList.getTable(), ContextIds.VALIDATION_PROPERTIES_PAGE);
-				PlatformUI.getWorkbench().getHelpSystem().setHelp(autoButton, ContextIds.VALIDATION_PROPERTIES_PAGE_AUTO_ENABLED);
-			} else {
-				// The order of the following if statement is important!
-				// If the user cannot enable automatic validation on the project, then the user
-				// should not be told, for example, to turn auto-build on. Let the user know that
-				// no matter what they do they cannot run auto-validate on the project. IF the
-				// project
-				// supports auto-validate, THEN check for the items which the user can change.
-				validatorList.getTable().setFocus();
-				if (pagePreferences.numberOfIncrementalValidators() == 0) {
-					PlatformUI.getWorkbench().getHelpSystem().setHelp(validatorList.getTable(), ContextIds.VALIDATION_PROPERTIES_PAGE_DISABLED_AUTO_NOINCVALCONFIG);
-				} else if (!ValidatorManager.getManager().isGlobalAutoBuildEnabled()) {
-					PlatformUI.getWorkbench().getHelpSystem().setHelp(validatorList.getTable(), ContextIds.VALIDATION_PROPERTIES_PAGE_DISABLED_AUTO_AUTOBUILD);
-				} else {
-					// Incremental validators configured but not selected
-					PlatformUI.getWorkbench().getHelpSystem().setHelp(validatorList.getTable(), ContextIds.VALIDATION_PROPERTIES_PAGE_DISABLED_AUTO_NOINCVALSELECTED);
-				}
-			}
-
-			// if autoButton AND build button are disabled, show the build button's "to enable" text
-			if (valWhenBuildButton.getEnabled()) {
-				// Do NOT set the table's help back to what it was.
-				// Only if auto-validate is enabled should the page go back.
-				PlatformUI.getWorkbench().getHelpSystem().setHelp(valWhenBuildButton, ContextIds.VALIDATION_PROPERTIES_PAGE_REBUILD_ENABLED);
-			} else {
-				//				page.getParent().setFocus();
-				validatorList.getTable().setFocus();
-				PlatformUI.getWorkbench().getHelpSystem().setHelp(validatorList.getTable(), ContextIds.VALIDATION_PROPERTIES_PAGE_DISABLED_BUILD_NOVALSELECTED);
-			}
-
-			// if the override button is disabled, show its "to enable" text.
-			if (overrideGlobalButton.getEnabled()) {
-				// Do NOT set the table's help back to what it was.
-				// Only if auto-validate is enabled should the page go back.
-				boolean doesProjectSupportBuildValidation = ValidatorManager.doesProjectSupportBuildValidation(getProject());
-				GlobalConfiguration gp = ConfigurationManager.getManager().getGlobalConfiguration();
-				boolean isPrefAuto = gp.isAutoValidate();
-				boolean isPrefManual = gp.isBuildValidate();
-				if (doesProjectSupportBuildValidation) {
-					// Project supports build validation, so it doesn't matter what the preferences
-					// are
-					PlatformUI.getWorkbench().getHelpSystem().setHelp(overrideGlobalButton, ContextIds.VALIDATION_PROPERTIES_PAGE_OVERRIDE_ENABLED);
-				} else if (!doesProjectSupportBuildValidation && (isPrefAuto && isPrefManual)) {
-					// Project doesn't support build validation, and the user prefers both auto and
-					// manual build validation
-					PlatformUI.getWorkbench().getHelpSystem().setHelp(overrideGlobalButton, ContextIds.VALIDATION_PROPERTIES_PAGE_OVERRIDE_ENABLED_CANNOT_HONOUR_BOTH);
-				} else if (!doesProjectSupportBuildValidation && isPrefAuto) {
-					// Project doesn't support build validation, and the user prefers auto build
-					// validation
-					PlatformUI.getWorkbench().getHelpSystem().setHelp(overrideGlobalButton, ContextIds.VALIDATION_PROPERTIES_PAGE_OVERRIDE_ENABLED_CANNOT_HONOUR_AUTO);
-				} else if (!doesProjectSupportBuildValidation && isPrefManual) {
-					// Project doesn't support build validation, and the user prefers manual build
-					// validation
-					PlatformUI.getWorkbench().getHelpSystem().setHelp(overrideGlobalButton, ContextIds.VALIDATION_PROPERTIES_PAGE_OVERRIDE_ENABLED_CANNOT_HONOUR_MANUAL);
-				} else if (!doesProjectSupportBuildValidation && !isPrefAuto && !isPrefManual) {
-					// Project doesn't support build validation, but that doesn't matter because the
-					// user prefers no build validation.
-					PlatformUI.getWorkbench().getHelpSystem().setHelp(overrideGlobalButton, ContextIds.VALIDATION_PROPERTIES_PAGE_OVERRIDE_ENABLED);
-				}
-			} else {
-				validatorList.getTable().setFocus();
-				// Preference page doesn't allow projects to override
-				PlatformUI.getWorkbench().getHelpSystem().setHelp(validatorList.getTable(), ContextIds.VALIDATION_PROPERTIES_PAGE_DISABLED_OVERRIDE);
-			}
-		}
-
-		/*
-		 * Store the current values of the controls into the preference store.
-		 */
-		private void storeValues() throws InvocationTargetException {
-			pagePreferences.setDoesProjectOverride(overrideGlobalButton.getSelection());
-
-			if (pagePreferences.doesProjectOverride()) {
-				// project override = user's preference + does the global preference allow the
-				// project to override
-
-				// If the manual build button is disabled because no validators are selected in the
-				// task list, don't overwrite the user's preference.
-				if (valWhenBuildButton.isEnabled()) {
-					pagePreferences.setBuildValidate(valWhenBuildButton.getSelection());
-				}
-
-				// If the auto build button is disabled because no validators are selected in the
-				// task list, or because auto-build is disabled, don't overwrite the user's
-				// preference.
-				if (autoButton.isEnabled()) {
-					pagePreferences.setAutoValidate(autoButton.getSelection());
-				}
-
-				pagePreferences.setMaximumNumberOfMessages(checkInteger());
-				pagePreferences.setEnabledValidators(ValidationConfiguration.convertToArray(validatorList.getCheckedElements()));
-			} else {
-				pagePreferences.resetToDefault(); // If the project can't or doesn't override,
-				// update its values to match the global
-				// preference values.
-			}
-
-			pagePreferences.passivate();
-		}
-
-		/**
-		 * Reads the list of validators, enables the validators which are selected, disables the
-		 * validators which are not selected, and if the auto-validate checkbox is chosen, performs
-		 * a full validation.
-		 */
-		public boolean performOk() throws InvocationTargetException {
-			// addBuilder MUST be called before storeValues
-			// addBuilder adds a builder to the project, and that changes the project description.
-			// Changing a project's description triggers the validation framework's "natureChange"
-			// migration, and a nature change requires that the list of validators be recalculated.
-			// If the builder is added after the values are stored, the stored values are
-			// overwritten.
-			addBuilder();
-
-			// If this method is being called because an APPLY was hit instead of an OK,
-			// recalculate the "can build be enabled" status because the builder may have
-			// been added in the addBuilder() call above.
-			// Also recalculate the values that depend on the isBuilderConfigured value.
-			isBuilderConfigured = ValidatorManager.doesProjectSupportBuildValidation(getProject());
-
-			// Persist the values.
-			storeValues();
-
-			if (autoButton.getSelection()) {
-				int enabledIncrementalValidators = pagePreferences.numberOfEnabledIncrementalValidators();
-				int enabledValidators = pagePreferences.numberOfEnabledValidators();
-				if (enabledValidators != enabledIncrementalValidators) {
-					// Then some of the enabled validators are not incremental
-					int iIconType = org.eclipse.swt.SWT.ICON_INFORMATION;
-					Display display = Display.getCurrent();
-					Shell shell = (display == null) ? null : display.getActiveShell();
-					MessageBox messageBox = new MessageBox(shell, org.eclipse.swt.SWT.OK | iIconType);
-					messageBox.setText(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_UI_MSSGBOX_TITLE_NONINC));
-
-					ValidatorMetaData[] vmds = pagePreferences.getEnabledValidators();
-					StringBuffer buffer = new StringBuffer(NEWLINE_AND_TAB);
-					for (int i = 0; i < vmds.length; i++) {
-						ValidatorMetaData vmd = vmds[i];
-
-						if (!vmd.isIncremental()) {
-							buffer.append(vmd.getValidatorDisplayName());
-							buffer.append(NEWLINE_AND_TAB);
-						}
-					}
-					messageBox.setMessage(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_UI_AUTO_ON_NONINC, new String[]{buffer.toString()}));
-					messageBox.open();
-				}
-			}
-
-			if (pagePreferences.hasEnabledValidatorsChanged(oldVmd, false) || ValidatorManager.getManager().isMessageLimitExceeded(getProject())) { // false
-				// means
-				// that
-				// the
-				// preference
-				// "allow"
-				// value
-				// hasn't
-				// changed
-				ValidatorManager.getManager().updateTaskList(getProject()); // Do not remove the
-				// exceeded message;
-				// only
-				// ValidationOperation
-				// should do that
-				// because it's about to
-				// run validation. If
-				// the limit is
-				// increased, messages
-				// may still be missing,
-				// so don't remove the
-				// "messages may be
-				// missing" message.
-			}
-
-			return true;
-		}
-
-		/**
-		 * If the current project doesn't have the validation builder configured on it, add the
-		 * builder. Otherwise return without doing anything.
-		 */
-		private void addBuilder() {
-			if (overrideGlobalButton.getSelection()) { // do not add the builder unless the user
-				// overrides the preferences
-				if (autoButton.getSelection() || valWhenBuildButton.getSelection()) {
-					ValidatorManager.addProjectBuildValidationSupport(getProject());
-				}
-			}
-		}
-
-		public Composite getControl() {
-			return page;
-		}
-
-		public void dispose() {
-			maxValProblemsField.dispose();
-			maxValProblemsFieldLabel.dispose();
-			selectAllButton.dispose();
-			deselectAllButton.dispose();
-			autoButton.dispose();
-			valWhenBuildButton.dispose();
-			validatorList.getTable().dispose();
-			messageLabel.dispose();
-			//			layout.dispose();
-			//			data.dispose();
-			emptyRowPlaceholder.dispose();
-			overrideGlobalButton.dispose();
-			page.dispose();
-		}
-	}
-
-	/**
-	 * ValidationPreferencePage constructor comment.
-	 */
-	public ValidationPropertiesPage() {
-		// Some of the initialization is done in the "initialize" method, which is
-		// called by the "getPageType" method, because the current project must
-		// be known in order to initialize those fields.
-	}
-
-	/**
-	 * Given a parent (the Properties guide), create the Validators page to be added to it.
-	 */
-	protected Control createContents(Composite parent) {
-		IProject project = getProject();
-
-		if ((project == null) || !project.isOpen()) {
-			_pageImpl = new InvalidPage(parent);
-		} else {
-			try {
-				if (ConfigurationManager.getManager().getProjectConfiguration(project).numberOfValidators() == 0) {
-					_pageImpl = new NoValidatorsPage(parent);
-				} else {
-					_pageImpl = new ValidatorListPage(parent);
-				}
-			} catch (InvocationTargetException exc) {
-				_pageImpl = new InvalidPage(parent);
-				displayAndLogError(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_TITLE), ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_PAGE), exc);
-			} catch (Throwable exc) {
-				_pageImpl = new InvalidPage(parent);
-				displayAndLogError(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_TITLE), ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_PAGE), exc);
-			}
-		}
-
-		return _pageImpl.getControl();
-	}
-
-	/**
-	 * Since the pages are inner classes of a child PreferencePage, not a PreferencePage itself,
-	 * DialogPage's automatic disposal of its children's widgets cannot be used. Instead, dispose of
-	 * each inner class' widgets explicitly.
-	 */
-	public void dispose() {
-		super.dispose();
-		try {
-			_pageImpl.dispose();
-		} catch (Throwable exc) {
-			logError(exc);
-		}
-	}
-
-	/**
-	 * Returns the highlighted item in the workbench.
-	 */
-	public IProject getProject() {
-		Object element = getElement();
-
-		if (element == null) {
-			return null;
-		}
-
-		if (element instanceof IProject) {
-			return (IProject) element;
-		}
-
-		return null;
-	}
-
-	protected void noDefaultAndApplyButton() {
-		super.noDefaultAndApplyButton();
-	}
-
-	/**
-	 * Performs special processing when this page's Defaults button has been pressed.
-	 * <p>
-	 * This is a framework hook method for sublcasses to do special things when the Defaults button
-	 * has been pressed. Subclasses may override, but should call <code>super.performDefaults</code>.
-	 * </p>
-	 */
-	protected void performDefaults() {
-		super.performDefaults();
-		try {
-			_pageImpl.performDefaults();
-		} catch (InvocationTargetException exc) {
-			displayAndLogError(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_TITLE), ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_PAGE), exc);
-		} catch (Throwable exc) {
-			displayAndLogError(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_TITLE), ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_PAGE), exc);
-		}
-	}
-
-	/**
-	 * When the user presses the "OK" or "Apply" button on the Properties Guide/Properties Page,
-	 * respectively, some processing is performed by this PropertyPage. If the page is found, and
-	 * completes successfully, true is returned. Otherwise, false is returned, and the guide doesn't
-	 * finish.
-	 */
-	public boolean performOk() {
-		try {
-			return _pageImpl.performOk();
-		} catch (InvocationTargetException exc) {
-			displayAndLogError(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_TITLE), ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_PAGE), exc);
-			return false;
-		} catch (Throwable exc) {
-			displayAndLogError(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_TITLE), ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INTERNAL_PAGE), exc);
-			return false;
-		}
-	}
-
-	void logError(Throwable exc) {
-		Logger logger = WTPUIPlugin.getLogger();
-		if (logger.isLoggingLevel(Level.SEVERE)) {
-			LogEntry entry = ValidationUIPlugin.getLogEntry();
-			entry.setSourceIdentifier("ValidationPropertiesPage.displayAndLogError"); //$NON-NLS-1$
-			entry.setMessageTypeIdentifier(ResourceConstants.VBF_EXC_INTERNAL_PAGE);
-			entry.setTargetException(exc);
-			logger.write(Level.SEVERE, entry);
-
-			if (exc instanceof InvocationTargetException) {
-				if (((InvocationTargetException) exc).getTargetException() != null) {
-					entry.setTargetException(((InvocationTargetException) exc).getTargetException());
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-		}
-	}
-
-	void displayAndLogError(String title, String message, Throwable exc) {
-		logError(exc);
-		displayMessage(title, message, org.eclipse.swt.SWT.ICON_ERROR);
-	}
-
-	private void displayMessage(String title, String message, int iIconType) {
-		MessageBox messageBox = new MessageBox(getShell(), org.eclipse.swt.SWT.OK | iIconType | org.eclipse.swt.SWT.APPLICATION_MODAL);
-		messageBox.setMessage(message);
-		messageBox.setText(title);
-		messageBox.open();
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.PreferencePage#getDefaultsButton()
-	 */
-	protected Button getDefaultsButton() {
-		return super.getDefaultsButton();
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ValidationUIConstants.java b/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ValidationUIConstants.java
deleted file mode 100644
index b06484b..0000000
--- a/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ValidationUIConstants.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.ui;
-
-
-/**
- * @deprecated For use by the validation framework only.
- */
-public interface ValidationUIConstants extends org.eclipse.wst.validation.internal.ui.ResourceConstants {
-	//Default
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/plugin/RunnableWithProgressWrapper.java b/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/plugin/RunnableWithProgressWrapper.java
deleted file mode 100644
index cf32408..0000000
--- a/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/plugin/RunnableWithProgressWrapper.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.ui.plugin;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.wst.common.frameworks.internal.operations.IHeadlessRunnableWithProgress;
-import org.eclipse.wst.validation.internal.operations.ValidationOperation;
-
-
-/**
- * This is a wrapper for an IWorkspaceRunnable to the IRunnableWithProgress. This class needs to be
- * used when running the operation from a IRunnableContext.
- * 
- * @see IRunnableContext
- * @see ValidationUIPlugin#getRunnableWithProgress Creation date: (5/8/2001 1:28:45 PM)
- * @author: Administrator
- */
-public class RunnableWithProgressWrapper implements IRunnableWithProgress {
-	private IHeadlessRunnableWithProgress headlessRunnable = null;
-	private IWorkspaceRunnable workspaceRunnable = null;
-	private ValidationOperation validationOperation = null;
-
-	/**
-	 * @deprecated Will be removed in Milestone 3. Use
-	 *             RunnableWithProgressWrapper(IWorkspaceRunnable)
-	 */
-	public RunnableWithProgressWrapper(IHeadlessRunnableWithProgress aHeadlessRunnableWithProgress) {
-		setHeadlessRunnable(aHeadlessRunnableWithProgress);
-	}
-
-	public RunnableWithProgressWrapper(IWorkspaceRunnable aHeadlessRunnableWithProgress) {
-		setWorkspaceRunnable(aHeadlessRunnableWithProgress);
-	}
-
-	public RunnableWithProgressWrapper(ValidationOperation op) {
-		setValidationOperation(op);
-	}
-
-	/**
-	 * @deprecated Will be removed in Milestone 3. Use getWorkspaceRunnable()
-	 */
-	protected IHeadlessRunnableWithProgress getHeadlessRunnable() {
-		return headlessRunnable;
-	}
-
-	protected IWorkspaceRunnable getWorkspaceRunnable() {
-		return workspaceRunnable;
-	}
-
-	/**
-	 * @see IRunnableWithProgress
-	 */
-	public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-		try {
-			if (getHeadlessRunnable() != null) {
-				getHeadlessRunnable().run(monitor);
-			} else {
-				IWorkspaceRunnable runnable = (getWorkspaceRunnable() == null) ? validationOperation : getWorkspaceRunnable();
-				if (runnable == null) {
-					return;
-				}
-				ResourcesPlugin.getWorkspace().run(runnable, monitor);
-			}
-		} catch (CoreException exc) {
-			throw new InvocationTargetException(exc);
-		}
-	}
-
-	/**
-	 * @deprecated Will be removed in Milestone 3. Use setWorkspaceRunnable(IWorkspaceRunnable)
-	 */
-	protected void setHeadlessRunnable(IHeadlessRunnableWithProgress newHeadlessRunnable) {
-		headlessRunnable = newHeadlessRunnable;
-	}
-
-	protected void setWorkspaceRunnable(IWorkspaceRunnable newWorkspaceRunnable) {
-		workspaceRunnable = newWorkspaceRunnable;
-	}
-
-	protected void setValidationOperation(ValidationOperation op) {
-		validationOperation = op;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/plugin/ValidationUIPlugin.java b/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/plugin/ValidationUIPlugin.java
deleted file mode 100644
index f4121fe..0000000
--- a/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/plugin/ValidationUIPlugin.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.ui.plugin;
-
-import java.util.logging.Level;
-
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPUIPlugin;
-import org.eclipse.wst.validation.internal.operations.ValidationOperation;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-import org.osgi.framework.BundleContext;
-
-
-
-public class ValidationUIPlugin extends WTPUIPlugin {
-	private static ValidationUIPlugin _plugin = null;
-
-	public final static String VALIDATION_PROP_FILE_NAME = "validate_ui"; //$NON-NLS-1$
-	public static final String VALIDATION_PLUGIN_ID = "org.eclipse.wst.validation.ui"; //$NON-NLS-1$
-
-	public ValidationUIPlugin() {
-		super();
-		if (_plugin == null) {
-			_plugin = this;
-		}
-	}
-
-	public static String getBundleName() {
-		return VALIDATION_PROP_FILE_NAME;
-	}
-
-	public static LogEntry getLogEntry() {
-		return ValidationPlugin.getLogEntry();
-	}
-
-
-	public static ValidationUIPlugin getPlugin() {
-		return _plugin;
-	}
-
-	/**
-	 * Returns the translated String found with the given key.
-	 * 
-	 * @param key
-	 *            java.lang.String
-	 * @return java.lang.String
-	 */
-	public static String getResourceString(String key) {
-		try {
-			return Platform.getResourceString(Platform.getBundle(VALIDATION_PLUGIN_ID), key);
-		} catch (Exception e) {
-			e.printStackTrace();
-			Logger logger = WTPUIPlugin.getLogger();
-			if (logger.isLoggingLevel(Level.FINE)) {
-				LogEntry entry = getLogEntry();
-				entry.setSourceID("ValidationUIPlugin.getResourceString(String)"); //$NON-NLS-1$
-				entry.setText("Missing resource for key" + key); //$NON-NLS-1$
-				logger.write(Level.FINE, entry);
-			}
-
-			return key;
-		}
-	}
-
-	/**
-	 * This method should be called whenever you need to run one of our headless operations in the
-	 * UI.
-	 */
-	public static IRunnableWithProgress getRunnableWithProgress(IWorkspaceRunnable aWorkspaceRunnable) {
-		return new RunnableWithProgressWrapper(aWorkspaceRunnable);
-	}
-
-//	public static IRunnableWithProgress getRunnableWithProgress(IHeadlessRunnableWithProgress aHeadlessRunnableWithProgress) {
-//		return new RunnableWithProgressWrapper(aHeadlessRunnableWithProgress);
-//	}
-
-	// Need a third, ValidationOperation version of this method, because ValidationOperation
-	// is both an IWorkspaceRunnable and an IHeadlessRunnableWithProgress. This method will
-	// exist only while IHeadlessRunnableWithProgress exists.
-	public static IRunnableWithProgress getRunnableWithProgress(ValidationOperation op) {
-		return new RunnableWithProgressWrapper(op);
-	}
-
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		//	org.eclipse.wst.validation.internal.operations.ValidatorManager.setResourceUtilClass(org.eclipse.wst.validation.internal.operations.ui.UIResourceUtil.class);
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/.classpath b/plugins/org.eclipse.wst.validation/.classpath
deleted file mode 100644
index f8323da..0000000
--- a/plugins/org.eclipse.wst.validation/.classpath
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="validate"/>
-	<classpathentry kind="src" path="validate_core"/>
-	<classpathentry kind="src" path="property_files"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/plugins/org.eclipse.wst.validation/.cvsignore b/plugins/org.eclipse.wst.validation/.cvsignore
deleted file mode 100644
index 874e992..0000000
--- a/plugins/org.eclipse.wst.validation/.cvsignore
+++ /dev/null
@@ -1,10 +0,0 @@
-bin
-temp.folder
-validate.jar
-build.xml
-common.jar
-validatesrc.zip
-commonsrc.zip
-src.zip
-org.eclipse.wst.validation_1.0.0.zip
-@dot
diff --git a/plugins/org.eclipse.wst.validation/.options b/plugins/org.eclipse.wst.validation/.options
deleted file mode 100644
index 26565de..0000000
--- a/plugins/org.eclipse.wst.validation/.options
+++ /dev/null
@@ -1,2 +0,0 @@
-com.ibm.etools.validation/debug=true
-com.ibm.etools.validation/tracefilter=
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/.project b/plugins/org.eclipse.wst.validation/.project
deleted file mode 100644
index 846dae7..0000000
--- a/plugins/org.eclipse.wst.validation/.project
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.validation</name>
-	<comment></comment>
-	<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.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/plugins/org.eclipse.wst.validation/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.validation/META-INF/MANIFEST.MF
deleted file mode 100644
index 112bf4f..0000000
--- a/plugins/org.eclipse.wst.validation/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,20 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Validation Framework
-Bundle-SymbolicName: org.eclipse.wst.validation; singleton:=true
-Bundle-Version: 1.0.1.qualifier
-Bundle-Activator: org.eclipse.wst.validation.internal.plugin.ValidationPlugin
-Bundle-Vendor: Eclipse.org
-Bundle-Localization: plugin
-Export-Package: .,
- org.eclipse.wst.validation.internal,
- org.eclipse.wst.validation.internal.core,
- org.eclipse.wst.validation.internal.operations,
- org.eclipse.wst.validation.internal.plugin,
- org.eclipse.wst.validation.internal.provisional,
- org.eclipse.wst.validation.internal.provisional.core
-Require-Bundle: org.eclipse.core.resources,
- org.eclipse.wst.common.frameworks,
- org.eclipse.jem.util,
- org.eclipse.core.runtime
-Eclipse-AutoStart: true
diff --git a/plugins/org.eclipse.wst.validation/about.html b/plugins/org.eclipse.wst.validation/about.html
deleted file mode 100644
index 6f6b96c..0000000
--- a/plugins/org.eclipse.wst.validation/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>February 24, 2005</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/plugins/org.eclipse.wst.validation/build.properties b/plugins/org.eclipse.wst.validation/build.properties
deleted file mode 100644
index 8a3225d..0000000
--- a/plugins/org.eclipse.wst.validation/build.properties
+++ /dev/null
@@ -1,22 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2004 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-# IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes = plugin.xml,\
-               plugin.properties,\
-               META-INF/,\
-               about.html,\
-               .
-jars.compile.order = .
-src.includes = component.xml,\
-               xsds/
-output.. = bin/
-source.. = validate_core/,\
-           property_files/,\
-           validate/
diff --git a/plugins/org.eclipse.wst.validation/component.xml b/plugins/org.eclipse.wst.validation/component.xml
deleted file mode 100644
index 21011d7..0000000
--- a/plugins/org.eclipse.wst.validation/component.xml
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><component  xmlns="http://eclipse.org/wtp/releng/tools/component-model" name="org.eclipse.wst.validation"><component-depends unrestricted="true"></component-depends><plugin id="org.eclipse.wst.validation" fragment="false"/><plugin id="org.eclipse.wst.validation.ui" fragment="false"/><package name="org.eclipse.wst.validation.core"></package><package name="org.eclipse.wst.validation.plugin"></package></component>
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/plugin.properties b/plugins/org.eclipse.wst.validation/plugin.properties
deleted file mode 100644
index 7ca7dd6..0000000
--- a/plugins/org.eclipse.wst.validation/plugin.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2004 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-# IBM Corporation - initial API and implementation
-###############################################################################
-#
-# Version 1.3
-#
-VALIDATION_BUILDER_NAME=Validation
-VALIDATION_PROBLEMMARKER_NAME=Validation Message
-VALIDATION_PROJECTMARKER_NAME=Enabled Validators
-VALIDATION_PREFERENCEMARKER_NAME=Validation Preferences
-Validator=Validator
-ReferencialFileValidator=ReferencialFileValidator
-validationSelectionHandler=validationSelectionHandler
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/plugin.xml b/plugins/org.eclipse.wst.validation/plugin.xml
deleted file mode 100644
index c861ce1..0000000
--- a/plugins/org.eclipse.wst.validation/plugin.xml
+++ /dev/null
@@ -1,113 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-    
-<!-- Validation extension points -->
-   <extension-point id="validator" name="%Validator" schema="xsds/validatorExtSchema.exsd"/>
-   <extension-point id="referencialFileValidator" name="%ReferencialFileValidator" schema="xsds/referencialFileExtSchema.exsd"/>
-   <extension-point id="validationSelectionHandler" name="%validationSelectionHandler" schema="xsds/validationSelectionHandler.exsd"/>
-   <extension-point id="validationHelper" name="validationHelper" schema="xsds/validationHelper.exsd"/>   
-   
-<!--============================-->
-<!-- Validation Contributions   -->
-<!--============================-->
-   <extension
-         id="validationbuilder"
-         name="%VALIDATION_BUILDER_NAME"
-         point="org.eclipse.core.resources.builders">
-      <builder>
-         <run
-               class="org.eclipse.wst.validation.internal.operations.ValidationBuilder">
-         </run>
-      </builder>
-   </extension>
-<!-- Problem markers must be a subtype of problemmarker to be displayed in the task view -->
-   <extension
-         id="problemmarker"
-         name="%VALIDATION_PROBLEMMARKER_NAME"
-         point="org.eclipse.core.resources.markers">
-      <super
-            type="org.eclipse.core.resources.problemmarker">
-      </super>
-      <persistent
-            value="true">
-      </persistent>
-      <attribute
-            name="owner">
-      </attribute>
-      <attribute
-            name="validationSeverity">
-      </attribute>
-      <attribute
-            name="targetObject">
-      </attribute>
-      <attribute
-            name="groupName">
-      </attribute>
-      <attribute
-            name="messageId">
-      </attribute>
-   </extension>
-<!-- Don't want to display this marker in the task view -->
-   <extension
-         id="projectmarker"
-         name="%VALIDATION_PROJECTMARKER_NAME"
-         point="org.eclipse.core.resources.markers">
-      <super
-            type="org.eclipse.core.resources.textmarker">
-      </super>
-      <persistent
-            value="true">
-      </persistent>
-      <attribute
-            name="enabledValidatorList">
-      </attribute>
-      <attribute
-            name="autoValidate">
-      </attribute>
-      <attribute
-            name="runWhenBuild">
-      </attribute>
-      <attribute
-            name="maxNumMessages">
-      </attribute>
-      <attribute
-            name="overrideGlobalPreferences">
-      </attribute>
-      <attribute
-            name="version">
-      </attribute>
-   </extension>
-<!-- Don't want to display this marker in the task view -->
-   <extension
-         id="preferencemarker"
-         name="%VALIDATION_PREFERENCEMARKER_NAME"
-         point="org.eclipse.core.resources.markers">
-      <super
-            type="org.eclipse.core.resources.textmarker">
-      </super>
-      <persistent
-            value="true">
-      </persistent>
-      <attribute
-            name="enabledValidatorList">
-      </attribute>
-      <attribute
-            name="autoValidate">
-      </attribute>
-      <attribute
-            name="runWhenBuild">
-      </attribute>
-      <attribute
-            name="maxNumMessages">
-      </attribute>
-      <attribute
-            name="projectsCanOverride">
-      </attribute>
-      <attribute
-            name="version">
-      </attribute>
-   </extension>
-
-</plugin>
diff --git a/plugins/org.eclipse.wst.validation/prepareforpii.xml b/plugins/org.eclipse.wst.validation/prepareforpii.xml
deleted file mode 100644
index 1aad5fe..0000000
--- a/plugins/org.eclipse.wst.validation/prepareforpii.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<project name="PrepareForPII" default="main" basedir=".">
-		
-	<!-- Setup temp variables -->
-	<target name="init">
-		<property name="nlsDir" value="d:/NLS/Corona/0526"/>
-		<property name="plugin" value="com.ibm.etools.validation"/>
-		<property name="plugindir" value="d:/workspaceCorona/${plugin}"/>
-		<property name="outputDir" value="${nlsDir}/${plugin}"/>
-		
-	
-	</target>
-
-	<!-- Create the destination dir -->
-	<target name="nlsDir" depends="init">
-		<mkdir dir="${nlsDir}"/>
-	</target>
-	
-	<!-- Create the destination dir -->
-	<target name="plugindir" depends="nlsDir">
-		<delete dir="${outputDir}"/>
-		<mkdir dir="${outputDir}"/>
-	</target>
-
-	<!-- Move the files to the correct locations in the workspace. -->
-	<target name="main" depends="plugindir">
-	
-		<messageIdGen folderPath = "${plugindir}" componentId = "E" />
-		
-		<copy todir = "${outputDir}/property_files" >
-			 <fileset dir="${plugindir}/property_files">
-           	  <include name="**/*.properties"/>
-  			 </fileset>
-  		</copy>
-  		
-  		<copy file="${plugindir}/plugin.properties" todir="${outputDir}"/>
-  		
-	</target>
-</project>
diff --git a/plugins/org.eclipse.wst.validation/property_files/validate_base.properties b/plugins/org.eclipse.wst.validation/property_files/validate_base.properties
deleted file mode 100644
index a97ae38..0000000
--- a/plugins/org.eclipse.wst.validation/property_files/validate_base.properties
+++ /dev/null
@@ -1,139 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2004 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-# IBM Corporation - initial API and implementation
-###############################################################################
-# To avoid name collisions, each extension point should preface their property names with an identifier.
-#
-#     *************************************************************************
-#     * Code oriented instructions:
-#     *
-#     * In the string, you may see the following special sequences:
-#     * a) {n}  where n is a number. These are replaceable parameters.
-#     * b) ''  In .properties files, in order to see one apostrophe (') in the final
-#     *    string, sometimes two apostrophes must be entered in the string. In the translated
-#     *    string, if there is at least one {n} in the string, then to show one apostrophe
-#     *    to the user, put two apostrophes in the string. If there are no {n} in the string,
-#     *    then put one apostrophe.
-#     *    For example, say that you want the user to read "George's file". 
-#     *        GEORGE=George's file was on the desk.
-#     *        GEORGE2=George''s file and {0} were on the desk.
-#     *    GEORGE uses one apostrophe because there are no {n} and GEORGE2
-#     *    uses two apostrophes because there is a {n}.
-#     * c) '' text '' where text can be any word(s). The text between the double
-#     *    apostrophes should not be translated. 
-#     * d) <text> where text can be any word(s). The text between the angle
-#     *    brackets should NOT be translated.
-#     * e) "text" where text can be any word(s). The text between the quotation 
-#     *    marks should NOT be translated.
-#     *    
-#     *************************************************************************
-#     * Other instructions
-#     * a) Do not translate any text that is on a line which begins with a comment 
-#     *    symbol (#).
-#     * b) Do not translate these words: 
-#     *        schema, EJB, RDB, JAR, RMI, BMP, CMP, OOSQL
-#     * c) Please return the .properties files using the same directory structure.
-#     *    This is necessary because two of the files have the same name.
-#     *
-#     *************************************************************************
-# Any other comments to the translators are on lines which start like this:  # 2TC:
-#
-# Version 1.14
-#
-#
-# ID:
-#    VBF - Validation Builder Framework
-#       VBF_EXC=Exception or error text
-#       VBF_STATUS=Status message
-#       VBF_TASK=Task list message
-#
-
-# 
-# Begin Validation Builder Framework Strings
-#
-# IDs:
-#    VBF_EXC=Exception or error text
-#    VBF_STATUS=Status message
-#    VBF_TASK=Task list message
-#
-VBF_EXC_CANNOT_ADD_MARKER=IWAE0001E The marker cannot be added to resource {0} in the task list.
-VBF_EXC_CANNOT_REMOVE_MARKER=IWAE0002E The marker cannot be removed from resource {0} in the task list.
-
-VBF_EXC_HELPER_MISSING=IWAE0003E Unable to load {0} because it did not specify a <helper>. Each validator must identify the helper class that loads its MOF model.
-VBF_EXC_HELPER_CANNOTLOAD=IWAE0004E Unable to load {0} because its <helper>, {1}, could not be loaded. Ensure that the case-sensitive file name is spelled correctly.
-
-VBF_EXC_INTERNAL=IWAE0005E An internal error occurred during validation. Validation was being run on project {0} with validator {1}. The message thrown was {2}.
-
-# 2TC: In the following string, "type" is a noun
-VBF_EXC_INVALID_TYPE_FILTER=IWAE0006E Invalid type filter; {0} must be an instance of {1}.
-VBF_EXC_INVALID_RESOURCE=IWAE0007E Cannot add message "{0}" with target object "{1}" because no file, folder, or project can be found with which to associate the message.
-
-VBF_EXC_MISSING_VALIDATOR_EP=IWAE0008E The validator framework could not be started. The extension point named \"{0}\" could not be found. Save all log files and contact your IBM representative.
-VBF_EXC_MISSING_PROJECTNATURE_ID=IWAE0009E A projectNature must have an associated ID. Validation is ignoring this tag and continuing.
-
-VBF_EXC_RUNTIME=IWAE0010E Run-time exception {0} occurred during validation. The validator being run was {1} and the message thrown was {2}.
-
-VBF_EXC_SYNTAX_NULL_NAME=IWAE0011E Resource {0} cannot be added to file list because IHelper.getPortableName() returns null. This resource will not be validated by the validator named {1}.
-VBF_EXC_SYNTAX_NO_HELPER=IWAE0012E No <helper> element is specified in the plugin.xml file for validator {0}. Since the helper cannot be created, the validator will not be loaded.
-VBF_EXC_SYNTAX_NO_HELPER_CLASS=IWAE0013E No "class" attribute in the <helper> element is specified in the plugin.xml file for validator {0}. The helper cannot be created without the name of the class that implements it. Since the helper cannot be created, the validator will not be loaded.
-VBF_EXC_SYNTAX_NO_HELPER_THROWABLE=IWAE0014E The helper {0} cannot be created because a Throwable was caught.
-VBF_EXC_SYNTAX_NO_VAL_RUN=IWAE0015E Validator cannot be created because no <run> element is specified in the plugin.xml file for the validator named {0}. Cannot create a validator unless a <run> element exists that specifies the "class" attribute. The value of the "class" attribute should be the name of the class that implements the IWorkbenchHelper interface.
-VBF_EXC_SYNTAX_NO_VAL_CLASS=IWAE0016E Validator cannot be created because no "class" attribute is specified in the <run> element of the plugin.xml file for the validator named {0}. Cannot create a validator unless a <run> element exists that specifies the "class" attribute. The value of the "class" attribute should be the name of the class that implements the IWorkbenchHelper interface.
-VBF_EXC_SYNTAX_NO_VAL_THROWABLE=IWAE0017E Cannot create validator {0} because a Throwable was caught.
-VBF_EXC_SYNTAX_NO_VAL_NULL=IWAE0018E Validator class {0} could not be created. IConfigurationElement.createExecutableExtension(String) returned null.
-
-VBF_EXC_DISABLEV=IWAE0019E Cannot instantiate validator {0}. Disabling the validator; read the log for details.
-VBF_EXC_DISABLEH=IWAE0020E Cannot instantiate helper {0}. Disabling validator {1}; read the log for details.
-VBF_EXC_ORPHAN_IVALIDATOR=IWAE0021E Cannot locate meta-data for validator {0}.
-
-VBF_EXC_VALIDATORNAME_IS_NULL=IWAE0022E The plugin with ID {0} has been disabled because its getName() method returns null. The method must return a value.
-
-VBF_EXC_NULLCREATE=IWAE0023E Cannot create a validation configuration on a null resource.
-VBF_EXC_NULLSAVE=IWAE0024E Cannot save a validation configuration on a null resource.
-VBF_EXC_SAVE=IWAE0025E Could not save the validation configuration on resource {0}.
-VBF_EXC_NULLRETRIEVE=IWAE0026E Cannot retrieve the validation configuration because resource is null.
-VBF_EXC_RETRIEVE=IWAE0027E Could not retrieve the validation configuration for resource {0}.
-
-VBF_EXC_BADVMD=IWAE0028E ValidatorMetaData[] must not be null or empty.
-VBF_EXC_OPENPRJ=IWAE0029E Project {0} must be open.
-VBF_EXC_EXISTPRJ=IWAE0030E Project {0} must exist.
-VBF_EXC_BADPRJ=IWAE0031E Project {0} must be the project that contains the resources in the IResource[].
-VBF_EXC_MULTIPRJ=IWAE0032E All IResource instances in the IResource[] must be part of the same IProject instance. The resources come from the following projects: {0}.
-VBF_EXC_BADVAL=IWAE0033E Validator {0} must be configured on {1};
-
-VBF_STATUS_INITIALIZING=Initializing {0}.
-
-VBF_STATUS_VALIDATOR_CLEANUP=Performing cleanup on {0} before termination.
-
-VBF_STATUS_PROGRESSMONITOR_TITLE=Validating
-VBF_STATUS_NULL_DELTA=Last build state of {0} could not be retrieved. Performing a full validation.
-
-VBF_STATUS_VALIDATOR_TERMINATED=Validation of {0} using {1} was cancelled.
-
-VBF_STATUS_START_REMOVING_OLD_MESSAGES=Removing {0} messages on {1} has started...
-VBF_STATUS_FINISH_REMOVING_OLD_MESSAGES=Messages removed.
-
-VBF_STATUS_STARTING_VALIDATION=Validation of {0} by {1} has started...
-VBF_STATUS_ENDING_VALIDATION=Validation of {0} by {1} is complete. All known problems have been reported.
-VBF_STATUS_ENDING_VALIDATION_ABNORMALLY=Validation of {0} by {1} ended abnormally. The list of problems may be incomplete. Please check the information messages for the cause of the abnormal termination.
-
-VBF_STATUS_LOOKING=Looking for validation messages owned by uninstalled validators...
-VBF_STATUS_LOOKINGDONE=Looking for validation messages owned by uninstalled validators...done.
-VBF_STATUS_REMOVING=Removing validation messages owned by uninstalled validators...
-VBF_STATUS_REMOVINGDONE=Removing validation messages owned by uninstalled validators...done.
-
-# The following message will be deleted soon.
-VBF_TASK_WARN_MESSAGE_LIMIT_ABORT=IWAE0034W IWAD3000I: {1} terminated validation of {0} because the maximum number of messages were reported. Some messages may be missing.
-
-VBF_TASK_WARN_MESSAGE_LIMIT_VAL=IWAE0035W IWAD3000I: Some messages may be missing because the maximum number of messages has been reported. Increase the maximum number of messages and try again.
-
-#
-# End Validation Builder Framework Strings
-#
-
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ConfigurationConstants.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ConfigurationConstants.java
deleted file mode 100644
index 00d4b36..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ConfigurationConstants.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal;
-
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-
-
-/**
- * Validation constants needed to implement the marker extension point and the user's preferences.
- * 
- * Only the validation framework should use this interface.
- */
-public interface ConfigurationConstants {
-	/* package */static final String ASYNC_SETTING = "runAsync"; //$NON-NLS-1$ // boolean (Use the global preferences or override)
-	/* package */static final String AUTO_SETTING = "autoValidate"; //$NON-NLS-1$ // boolean
-	/* package */static final String BUILD_SETTING = "runWhenBuild"; //$NON-NLS-1$ // boolean
-
-	// Defaults for the preference and project values
-	
-	/* package */static String CURRENT_VERSION = (String) ValidationPlugin.getPlugin().getBundle().getHeaders().get(org.osgi.framework.Constants.BUNDLE_VERSION); //$NON-NLS-1$ // this is a constant, so it should be intern
-	/* package */static final boolean DEFAULT_ASYNC = true;
-	/* package */static final boolean DEFAULT_AUTO_SETTING = true;
-	/* package */static final boolean DEFAULT_BUILD_SETTING = true;
-	/* package */static ValidatorMetaData[] DEFAULT_ENABLED_VALIDATORS = ValidationRegistryReader.getReader().getValidatorMetaDataArrayEnabledByDefault(); //$NON-NLS-1$ // store a copy here so that we don't modify the original and don't create a copy every time we need this value
-	/* package */static final int DEFAULT_MAXNUMMESSAGES = 50;
-	public static final int DEPTH_INFINITE = IResource.DEPTH_INFINITE;
-	public static final int DEPTH_ZERO = IResource.DEPTH_ZERO;
-	/* package */static final String ELEMENT_SEPARATOR = ";"; //$NON-NLS-1$ // separates the name of one IValidator from the next in the list of enabled validators for a project or preference
-
-	// The following values must match the attributes in the preference marker as shown in
-	// plugin.xml
-	// Even though the plugin.xml values are not used to create new Preference or Project markers,
-	// maintaining one local name ensures that there's no confusion writing the migration code.
-	// These are the QualifiedNames used to persist the user's settings.
-	/* package */static final String ENABLED_VALIDATORS = "enabledValidatorList"; //$NON-NLS-1$ // String
-	public static final String J2EE_PLUGIN_ID = "org.eclipse.jst.j2ee"; //$NON-NLS-1$ // For 4.03, this is the plugin id that the validation constants were declared in.
-	/* package */static final String MAXNUMMESSAGES = "maxNumMessages"; //$NON-NLS-1$ // integer
-	public static final String PLUGIN_ID = ValidationPlugin.PLUGIN_ID;
-	/* package */static final String PREF_PROJECTS_CAN_OVERRIDE = "projectsCanOverride"; //$NON-NLS-1$ // boolean
-	// end validation message marker constants
-
-	// Preference and Project constants
-	/* package */static final String PREFERENCE_MARKER = PLUGIN_ID + ".preferencemarker"; //$NON-NLS-1$
-	/* package */static final String PRJ_MARKER = PLUGIN_ID + ".projectmarker"; //$NON-NLS-1$ // The extension which saves user validation preferences for a particular project (e.g. which validators run on the project)
-	/* package */static final String PRJ_MARKER_403 = J2EE_PLUGIN_ID + ".projectmarker"; //$NON-NLS-1$ // The extension which saves user validation preferences for a particular project (e.g. which validators run on the project)
-	/* package */static final String PRJ_OVERRIDEGLOBAL = "overrideGlobalPreferences"; //$NON-NLS-1$ // boolean (Use the global preferences or override)
-
-	/* package */static final QualifiedName USER_PREFERENCE = new QualifiedName(PLUGIN_ID, "ValidationConfiguration"); //$NON-NLS-1$ // ValidationConfiguration for the IResource
-
-	// Validation message marker constants
-	/* package */static final String VALIDATION_MARKER = PLUGIN_ID + ".problemmarker"; //$NON-NLS-1$ // The extension which is used to add validation markers to the task list
-	/* package */static final String VALIDATION_MARKER_GROUP = "groupName"; //$NON-NLS-1$ // For incremental validation, this field associates a message with a group, so that a subset of messages may be removed from a file.
-	/* package */static final String VALIDATION_MARKER_MESSAGEID = "messageId"; //$NON-NLS-1$ // Persist the message id of the message, not just the translated text.
-
-	// The following values must match the attributes in the validation message marker as shown in
-	// plugin.xml
-	/* package */static final String VALIDATION_MARKER_OWNER = "owner"; //$NON-NLS-1$ // The IValidator who owns the IMarker on the task list
-	/* package */static final String VALIDATION_MARKER_SEVERITY = "validationSeverity"; //$NON-NLS-1$ // one of the SeverityEnum values
-	/* package */static final String VALIDATION_MARKER_TARGETOBJECT = "targetObject"; //$NON-NLS-1$ // When more than one target object resolves to the same IResource, this field identifies which targetObject owns a particular message.
-	/* package */static final String VERSION = "version"; //$NON-NLS-1$
-
-	// WSAD versions which created markers of these types
-	/* package */static final String VERSION4_03 = "4.03"; //$NON-NLS-1$
-	/* package */static final String VERSION5_0 = "5.0"; //$NON-NLS-1$
-	/* package */static final String VERSION5_01 = "5.0.1"; //$NON-NLS-1$
-	// end preference and project defaults
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ConfigurationManager.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ConfigurationManager.java
deleted file mode 100644
index a5f7fc1..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ConfigurationManager.java
+++ /dev/null
@@ -1,275 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.logging.Level;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-
-
-/**
- * Only the validation framework can use this class.
- */
-public final class ConfigurationManager implements ConfigurationConstants {
-	private static ConfigurationManager inst = null;
-
-	private ConfigurationManager() {
-		//Default constructor
-	}
-
-	public static ConfigurationManager getManager() {
-		if (inst == null) {
-			inst = new ConfigurationManager();
-		}
-		return inst;
-	}
-
-	/**
-	 * Given a validation marker, return the fully-qualified class name of the validator who owns
-	 * the message. If the validator cannot be found or if the marker is not a validation marker,
-	 * return null.
-	 */
-	public String getValidator(IMarker marker) {
-		if (marker == null) {
-			return null;
-		}
-
-		try {
-			if (!marker.getType().equals(VALIDATION_MARKER)) {
-				return null;
-			}
-
-			Object attrib = marker.getAttribute(VALIDATION_MARKER_OWNER);
-			if (attrib == null) {
-				// owner not set
-				return null;
-			}
-			return attrib.toString();
-		} catch (CoreException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("InternalPreferenceManager.getValidator(IMarker)"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-			return null;
-		}
-	}
-
-	/**
-	 * Return true if the given marker is a validation marker. Otherwise return false.
-	 */
-	public boolean isValidationMarker(IMarker marker) {
-		if (marker == null) {
-			return false;
-		}
-
-		try {
-			return marker.getType().equals(VALIDATION_MARKER);
-		} catch (CoreException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("InternalPreferenceManager.isValidationMarker(IMarker)"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-			return false;
-		}
-	}
-
-	/**
-	 * This method is for use by the TVT Validation plugin ONLY!!! No code should access the
-	 * validation markers in the list directly except for the validation framework and the TVT
-	 * Validation plugin.
-	 */
-	public void removeAllValidationMarkers(IProject project) {
-		if ((project == null) || (!project.isOpen())) {
-			return;
-		}
-
-		try {
-			project.deleteMarkers(VALIDATION_MARKER, false, DEPTH_INFINITE); // false means only
-			// consider VALIDATION_MARKER, not variants of VALIDATION_MARKER. 
-			//Since addTask only adds VALIDATION_MARKER, we don't need to consider its subtypes.
-		} catch (CoreException exc) {
-			// Couldn't retrieve the markers from the resource for some reason...
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("WorkbenchMonitor.removeAllValidationMarkers(IProject)"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-		}
-	}
-
-	/**
-	 * This method returns the global preferences for the workspace.
-	 */
-	public GlobalConfiguration getGlobalConfiguration() throws InvocationTargetException {
-		IWorkspaceRoot root = ValidationConfiguration.getRoot();
-		GlobalConfiguration gp = null;
-		try {
-			gp = (GlobalConfiguration) root.getSessionProperty(USER_PREFERENCE);
-			if (gp == null) {
-				gp = new GlobalConfiguration(root);
-				gp.getVersion(); // initialize the configuration's version attribute
-				gp.load(); // initialize this instance from the stored values
-				gp.passivate(); // store this instance as a property on the IResource
-			}
-			return gp;
-		} catch (CoreException exc) {
-			throw new InvocationTargetException(exc, ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_RETRIEVE, new String[]{root.getName()}));
-		}
-	}
-
-	public ProjectConfiguration getProjectConfiguration(IProject project) throws InvocationTargetException {
-		ProjectConfiguration prjp = null;
-		try {
-			prjp = (ProjectConfiguration) project.getSessionProperty(USER_PREFERENCE);
-			if (prjp == null || !prjp.getResource().exists()) {
-				prjp = new ProjectConfiguration(project);
-				prjp.getVersion(); // initialize the configuration's version attribute
-				prjp.load(); // initialize this instance from the stored values
-				prjp.passivate(); // store this instance as a property on the IResource
-			}
-			return prjp;
-		} catch (CoreException exc) {
-			throw new InvocationTargetException(exc, ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_RETRIEVE, new String[]{project.getName()}));
-		}
-	}
-
-	public ProjectConfiguration getProjectConfigurationWithoutMigrate(IProject project) throws InvocationTargetException {
-		ProjectConfiguration prjp = null;
-		try {
-			prjp = (ProjectConfiguration) project.getSessionProperty(USER_PREFERENCE);
-			if (prjp == null || !prjp.getResource().exists()) {
-				prjp = new ProjectConfiguration(project);
-				prjp.getVersion(); // initialize the configuration's version attribute
-				prjp.load(); // initialize this instance from the stored values
-				prjp.passivate(); // store this instance as a property on the IResource
-			}
-			return prjp;
-		} catch (CoreException exc) {
-			throw new InvocationTargetException(exc, ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_RETRIEVE, new String[]{project.getName()}));
-		}
-	}
-
-
-	/**
-	 * The nature of the project has changed; update the enabled validators on the project.
-	 */
-	public void resetProjectNature(IProject project) throws InvocationTargetException {
-		resetProjectNature(getProjectConfiguration(project));
-	}
-
-	/**
-	 * When a project has been created for the first time, its natures may not have been complete at
-	 * the time that this Preference was recreated. Call this method to recalculate the vmds.
-	 */
-	protected void resetProjectNature(ProjectConfiguration prjp) throws InvocationTargetException {
-		prjp.resetProjectNature();
-	}
-
-	public void closing(IProject project) {
-		try {
-			if (isMigrated(project)) {
-				ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-				prjp.store();
-			}
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("InternalPreferenceManager::closing(" + project.getName() + ")"); //$NON-NLS-1$ //$NON-NLS-2$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-		}
-	}
-
-	public void deleting(IProject project) {
-	}
-
-	public void opening(IProject project) {
-		// Do not load or migrate the project in this method; let the getConfiguration(IProject)
-		// method do that. Do not load the project before it's necessary.
-	}
-
-	/**
-	 * Return true if the global preferences are at the current level of metadata, false otherwise.
-	 */
-	public boolean isGlobalMigrated() throws InvocationTargetException {
-		IWorkspaceRoot root = ValidationConfiguration.getRoot();
-		if (root == null) {
-			return false;
-		}
-
-		try {
-			GlobalConfiguration gp = (GlobalConfiguration) root.getSessionProperty(USER_PREFERENCE);
-			if (gp != null) {
-				return gp.isVersionCurrent();
-			}
-
-			String serializedPrjp = root.getPersistentProperty(USER_PREFERENCE);
-			if (serializedPrjp != null) {
-				gp = new GlobalConfiguration(root);
-				gp.getVersion(); // initialize the configuration's version attribute
-				return gp.isVersionCurrent();
-			}
-		} catch (CoreException exc) {
-			throw new InvocationTargetException(exc, ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_RETRIEVE, new String[]{root.getName()}));
-		}
-
-		return false;
-	}
-
-	/**
-	 * Return true if the given project has the current level of metadata, false otherwise.
-	 */
-	public boolean isMigrated(IProject project) throws InvocationTargetException {
-		if (project == null) {
-			return false;
-		}
-		try {
-			if (project.isAccessible()) {
-				ProjectConfiguration prjp = (ProjectConfiguration) project.getSessionProperty(USER_PREFERENCE);
-				if (prjp != null) {
-					return prjp.isVersionCurrent();
-				}
-				String serializedPrjp = project.getPersistentProperty(USER_PREFERENCE);
-				if (serializedPrjp != null) {
-					prjp = new ProjectConfiguration(project);
-					prjp.getVersion(); // initialize the configuration's
-					// version attribute
-					return prjp.isVersionCurrent();
-				}
-			}
-		} catch (CoreException exc) {
-			throw new InvocationTargetException(exc, ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_RETRIEVE, new String[]{project.getName()}));
-		}
-		return false;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/EventManager.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/EventManager.java
deleted file mode 100644
index fa7a232..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/EventManager.java
+++ /dev/null
@@ -1,430 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.logging.Level;
-
-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.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jem.util.UIContextDetermination;
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.validation.internal.operations.IWorkbenchContext;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-
-/**
- * This class manages resource change events for the validation framework.
- */
-public class EventManager implements IResourceChangeListener {
-	private static EventManager _inst = null;
-	private boolean _shutdown = false; // false means that eclipse is not shutting down, and true
-	// means that it is shutting down. Used in two methods:
-	// shutdown(),and resourceChanged(IResourceChangeEvent)
-	private IResourceDeltaVisitor _postAutoBuildVisitor = null;
-	private boolean _isActive = false; // has the registry been read?
-
-	private EventManager() {
-		super();
-	}
-
-	public static EventManager getManager() {
-		if (_inst == null) {
-			_inst = new EventManager();
-		}
-		return _inst;
-	}
-
-	public void opening(IProject project) {
-		if (project == null || !ValidationPlugin.isActivated()) {
-			return;
-		}
-
-		// When the project is opened, check for any orphaned tasks
-		// or tasks whose owners need to be updated.
-		ConfigurationManager.getManager().opening(project);
-	}
-
-	public void closing(IProject project) {
-		if (project == null || !ValidationPlugin.isActivated()) {
-			return;
-		}
-
-		try {
-			boolean isMigrated = ConfigurationManager.getManager().isMigrated(project);
-			// If it's not migrated, then it hasn't been loaded, and we don't want to load the
-			// validator and its prerequisite plugins until they're needed.
-			if (isMigrated) {
-				ValidatorMetaData[] vmds = ConfigurationManager.getManager().getProjectConfiguration(project).getValidators();
-				for (int i = 0; i < vmds.length; i++) {
-					ValidatorMetaData vmd = vmds[i];
-
-					if (!vmd.isActive()) {
-						// If this validator has not been activated, or if it has been shut down,
-						// don't activate it again.
-						continue;
-					}
-
-					IWorkbenchContext helper = null;
-					try {
-						helper = vmd.getHelper(project);
-						helper.closing();
-					} catch (InstantiationException exc) {
-						// Remove the vmd from the reader's list
-						ValidationRegistryReader.getReader().disableValidator(vmd);
-
-						// Log the reason for the disabled validator
-						Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-						if (logger.isLoggingLevel(Level.SEVERE)) {
-							LogEntry entry = ValidationPlugin.getLogEntry();
-							entry.setSourceID("EventManager::closing(IProject)"); //$NON-NLS-1$
-							entry.setTargetException(exc);
-							logger.write(Level.SEVERE, entry);
-						}
-
-						continue;
-					} catch (Throwable exc) {
-						// If there is a problem with this particular helper, log the error and
-						// continue
-						// with the next validator.
-						Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-						if (logger.isLoggingLevel(Level.SEVERE)) {
-							LogEntry entry = ValidationPlugin.getLogEntry();
-							entry.setSourceID("EventManager::closing(IProject)"); //$NON-NLS-1$
-							entry.setTargetException(exc);
-							logger.write(Level.SEVERE, entry);
-						}
-						continue;
-					}
-				}
-
-				ConfigurationManager.getManager().closing(project);
-			}
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("EventManager::closing(" + project.getName() + ")"); //$NON-NLS-1$  //$NON-NLS-2$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-		}
-	}
-
-	public void deleting(IProject project) {
-		if (project == null) {
-			return;
-		}
-
-		try {
-			boolean isMigrated = ConfigurationManager.getManager().isMigrated(project);
-			// If it's not migrated, then it hasn't been loaded, and we don't want to load the
-			// validator and its prerequisite plugins until they're needed.
-			if (isMigrated) {
-				ValidatorMetaData[] vmds = ConfigurationManager.getManager().getProjectConfiguration(project).getValidators();
-				for (int i = 0; i < vmds.length; i++) {
-					ValidatorMetaData vmd = vmds[i];
-
-					if (!vmd.isActive()) {
-						// If this validator has not been activated, or if it has been shut down,
-						// don't activate it again.
-						continue;
-					}
-
-					IWorkbenchContext helper = null;
-					try {
-						helper = vmd.getHelper(project);
-						helper.deleting();
-					} catch (InstantiationException exc) {
-						// Remove the vmd from the reader's list
-						ValidationRegistryReader.getReader().disableValidator(vmd);
-
-						// Log the reason for the disabled validator
-						Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-						if (logger.isLoggingLevel(Level.SEVERE)) {
-							LogEntry entry = ValidationPlugin.getLogEntry();
-							entry.setSourceID("EventManager::deleting(IProject)"); //$NON-NLS-1$
-							entry.setTargetException(exc);
-							logger.write(Level.SEVERE, entry);
-						}
-
-						continue;
-					} catch (Throwable exc) {
-						// If there is a problem with this particular helper, log the error and
-						// continue
-						// with the next validator.
-						Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-						if (logger.isLoggingLevel(Level.SEVERE)) {
-							LogEntry entry = ValidationPlugin.getLogEntry();
-							entry.setSourceID("EventManager::deleting(IProject)"); //$NON-NLS-1$
-							entry.setTargetException(exc);
-							logger.write(Level.SEVERE, entry);
-						}
-						continue;
-					}
-				}
-
-				ConfigurationManager.getManager().deleting(project);
-			}
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("EventManager::deleting(" + project.getName() + ")"); //$NON-NLS-1$  //$NON-NLS-2$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-		}
-	}
-
-	/**
-	 * If a project's description changes, The project may have changed its nature. Update the cache
-	 * to reflect the new natures. The project could be opening. Migrate.
-	 */
-	private void postAutoChange(IResourceDelta delta) {
-		if (_postAutoBuildVisitor == null) {
-			_postAutoBuildVisitor = new IResourceDeltaVisitor() {
-				public boolean visit(IResourceDelta subdelta) throws CoreException {
-					if (subdelta == null)
-						return true;
-
-					IResource resource = subdelta.getResource();
-					if (resource instanceof IProject) {
-						IProject project = (IProject) resource;
-						if ((subdelta.getFlags() & IResourceDelta.DESCRIPTION) == IResourceDelta.DESCRIPTION) {
-							try {
-								ConfigurationManager.getManager().resetProjectNature(project); // flush
-								// existing
-								// "enabled
-								// validator"
-								// settings
-								// and
-								// reset
-								// to
-								// default
-							} catch (InvocationTargetException exc) {
-								Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-								if (logger.isLoggingLevel(Level.SEVERE)) {
-									LogEntry entry = ValidationPlugin.getLogEntry();
-									entry.setSourceIdentifier("EventManager::postAutoChange"); //$NON-NLS-1$
-									entry.setTargetException(exc);
-									logger.write(Level.SEVERE, entry);
-
-									if (exc.getTargetException() != null) {
-										entry.setTargetException(exc);
-										logger.write(Level.SEVERE, entry);
-									}
-								}
-							}
-							return false;
-						}
-
-						if ((subdelta.getFlags() & IResourceDelta.OPEN) == IResourceDelta.OPEN) {
-							if (project.isOpen()) {
-								// Project was just opened. If project.isOpen() had returned false,
-								// project
-								// would just have been closed.
-								opening(project);
-							}
-							// closing is called by PRE_CLOSE in resourceChanged
-							//							else {
-							//								closing(project);
-							//							}
-						}
-					}
-
-					return true;
-				}
-			};
-		}
-
-		try {
-			delta.accept(_postAutoBuildVisitor, true);
-		} catch (CoreException exc) {
-			exc.printStackTrace();
-		}
-	}
-
-	/**
-	 * Notifies this manager that some resource changes have happened on the platform. If the change
-	 * is a project deletion, that project should be removed from the cache.
-	 * 
-	 * @see IResourceDelta
-	 * @see IResource
-	 */
-	public void resourceChanged(IResourceChangeEvent event) {
-		if (_shutdown && (!isActive())) {
-			// If we're shutting down, and nothing has been activated, don't need to
-			// do anything.
-			return;
-		}
-
-		/*
-		 * StringBuffer buffer = new StringBuffer(); buffer.append("IResourceChangeEvent type = ");
-		 * buffer.append(event.getType()); buffer.append(", resource = ");
-		 * buffer.append(event.getResource()); buffer.append(", source = ");
-		 * buffer.append(event.getSource()); buffer.append(", delta = ");
-		 * buffer.append(event.getDelta()); System.out.println(buffer.toString());
-		 */
-
-		if (event.getSource() instanceof IWorkspace) {
-			if ((event.getType() == IResourceChangeEvent.PRE_DELETE) && (event.getResource() instanceof IProject)) {
-				deleting((IProject) event.getResource());
-			} else if ((event.getType() == IResourceChangeEvent.PRE_CLOSE) && (event.getResource() instanceof IProject)) {
-				closing((IProject) event.getResource());
-			} else if (event.getType() == IResourceChangeEvent.POST_BUILD) {
-				postAutoChange(event.getDelta());
-			}
-
-		}
-	}
-
-	/**
-	 * Notifies this manager that the ValidationPlugin is shutting down. (Usually implies that
-	 * either the plugin could not load, or that the workbench is shutting down.)
-	 * 
-	 * The manager will then notify all active helpers of the shutdown, so that they may perform any
-	 * last-minute writes to disk, cleanup, etc.
-	 */
-	public void shutdown() {
-		try {
-			_shutdown = true; // resourceChanged(IResourceChangeEvent) needs to know when a shutdown
-			// has started.
-
-			/*
-			 * if( !isHeadless() && ConfigurationManager.getManager().isGlobalMigrated()) {
-			 * GlobalConfiguration gp = ConfigurationManager.getManager().getGlobalConfiguration();
-			 * gp.store(); // First, see if any validators are loaded. If none are, there is nothing
-			 * to // clean up. if(gp.numberOfValidators() == 0) { return; } }
-			 */
-
-			// If the validators are loaded, then for every project in the workbench,
-			// we must see if it has been loaded. If it has, every enabled IWorkbenchContext
-			// must be called to clean up. If the project hasn't been loaded, then no
-			// IWorkbenchContext built anything, and there's nothing to clean up.
-			IWorkspace workspace = ResourcesPlugin.getWorkspace();
-			IWorkspaceRoot workspaceRoot = workspace.getRoot();
-			IProject[] projects = workspaceRoot.getProjects();
-			ProjectConfiguration prjp = null;
-			IProject project = null;
-			for (int i = 0; i < projects.length; i++) {
-				project = projects[i];
-				if (!project.isOpen()) {
-					// If the project isn't opened, there's nothing to clean up.
-					// If the project was opened, it would have been migrated, and there's something
-					// to clean up.
-					continue;
-				}
-
-				try {
-					boolean isMigrated = ConfigurationManager.getManager().isMigrated(project);
-					// If it's not migrated, then it hasn't been loaded, and we don't want to load
-					// the
-					// validator and its prerequisite plugins until they're needed.
-					if (isMigrated) {
-						prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-						prjp.store();
-
-						ValidatorMetaData[] vmdList = prjp.getEnabledValidators();
-						// if vmdList is null, IProject has never been loaded, so nothing to clean
-						// up
-						if (vmdList != null) {
-							for (int j = 0; j < vmdList.length; j++) {
-								ValidatorMetaData vmd = vmdList[j];
-
-								if (!vmd.isActive()) {
-									// If this validator has not been activated, or if it has been
-									// shut down, don't activate it again.
-									continue;
-								}
-
-								IWorkbenchContext helper = vmd.getHelper(project);
-								if (helper != null) {
-									try {
-										helper.shutdown();
-									} catch (Throwable exc) {
-										// Since we're shutting down, ignore the exception.
-									}
-								}
-							}
-						}
-					}
-				} catch (InvocationTargetException exc) {
-					Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-					if (logger.isLoggingLevel(Level.SEVERE)) {
-						LogEntry entry = ValidationPlugin.getLogEntry();
-						entry.setSourceIdentifier("EventManager::shutdown(" + project.getName() + ")"); //$NON-NLS-1$  //$NON-NLS-2$
-						entry.setTargetException(exc);
-						logger.write(Level.SEVERE, entry);
-
-						if (exc.getTargetException() != null) {
-							entry.setTargetException(exc);
-							logger.write(Level.SEVERE, entry);
-						}
-					}
-				}
-			}
-		} catch (Throwable exc) {
-			// Since we're shutting down, ignore the exception.
-		}
-	}
-
-	public boolean isActive() {
-		// Have to use this convoluted technique for the shutdown problem.
-		// i.e., when eclipse is shut down, if validation plugin hasn't been loaded,
-		// the EventManager is activated for the first time, and it
-		// sends many exceptions to the .log. At first, I wrote a
-		// static method on ValidationRegistryReader, which returned true
-		// if the registry had been read, and false otherwise. However,
-		// that didn't solve the exception problem, because eclipse's
-		// class loader failed to load the ValidationRegistryReader class.
-		//
-		// The fix is to keep all shutdown mechanisms in this class.
-		// Track everything in here.
-		return _isActive;
-	}
-
-	/**
-	 * This method should only be called by the ValidationRegistryReader once the registry has been
-	 * read.
-	 */
-	public void setActive(boolean b) {
-		_isActive = b;
-	}
-
-	/**
-	 * This method should be used to determine if the workbench is running in UI or Headless
-	 */
-	public static boolean isHeadless() {
-		boolean ret = UIContextDetermination.getCurrentContext() == UIContextDetermination.HEADLESS_CONTEXT;
-		return ret;
-		//return UIContextDetermination.getCurrentContext() ==
-		// UIContextDetermination.HEADLESS_CONTEXT;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/FilterUtil.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/FilterUtil.java
deleted file mode 100644
index 3a82813..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/FilterUtil.java
+++ /dev/null
@@ -1,732 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal;
-
-
-import java.text.MessageFormat;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.logging.Level;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.IResourceVisitor;
-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.OperationCanceledException;
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.validation.internal.core.IFileDelta;
-import org.eclipse.wst.validation.internal.operations.IWorkbenchContext;
-import org.eclipse.wst.validation.internal.operations.WorkbenchFileDelta;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-
-/**
- * Utility class for the ValidationOperation hierarchy.
- */
-public final class FilterUtil {
-	private static VMDDeltaVisitor _deltaVisitor = null;
-	private static VMDResourceVisitor _resourceVisitor = null;
-
-	private interface VMDRecorder {
-		public Map getResult();
-
-		public void setEnabledValidators(Set enabledValidators);
-
-		public void setProgressMonitor(IProgressMonitor monitor);
-
-		public IProgressMonitor getProgressMonitor();
-	}
-
-	private interface VMDDeltaVisitor extends VMDRecorder, IResourceDeltaVisitor {
-		//constructor
-	}
-
-	private interface VMDResourceVisitor extends VMDRecorder, IResourceVisitor {
-		//constructor
-	}
-
-	/**
-	 * Don't let anyone create an instance of this class.
-	 */
-	private FilterUtil() {
-		//default
-	}
-
-	/**
-	 * Given a Set of enabled ValidatorMetaData, create a Map with each ValidatorMetaData as a key
-	 * with an associated null value.
-	 */
-	static Map wrapInMap(Set enabledValidators) {
-		Map result = new HashMap();
-		if ((enabledValidators == null) || (enabledValidators.size() == 0)) {
-			return result;
-		}
-
-		Iterator iterator = enabledValidators.iterator();
-		while (iterator.hasNext()) {
-			result.put(iterator.next(), null);
-		}
-		return result;
-	}
-
-	static void checkCanceled(IProgressMonitor monitor) throws OperationCanceledException {
-		if (monitor == null) {
-			return;
-		} else if (monitor.isCanceled()) {
-			throw new OperationCanceledException(""); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Given a Map of VMD <=>Set(IFileDelta), either return the existing Set or create a Set and
-	 * return it.
-	 */
-	private static Set getResourceDeltas(Map enabledValidators, ValidatorMetaData vmd) {
-		Set fileDeltas = (Set) enabledValidators.get(vmd);
-		if (fileDeltas == null) {
-			fileDeltas = new HashSet();
-			enabledValidators.put(vmd, fileDeltas);
-		}
-		return fileDeltas;
-	}
-
-	/**
-	 * Given the IFileDelta type, return the corresponding IResourceDelta type.
-	 */
-	private static int getResourceDeltaType(int ifileDeltaType) {
-		switch (ifileDeltaType) {
-			case (IFileDelta.ADDED) : {
-				return IResourceDelta.ADDED;
-			}
-
-			case (IFileDelta.DELETED) : {
-				return IResourceDelta.REMOVED;
-			}
-
-			case (IFileDelta.CHANGED) :
-			default : {
-				return IResourceDelta.CHANGED;
-			}
-		}
-	}
-
-	/**
-	 * Given the IResourceDelta type, return the corresponding IFileDelta type.
-	 */
-	static int getFileDeltaType(int iresourceDeltaType) {
-		switch (iresourceDeltaType) {
-			case IResourceDelta.ADDED : // resource has been added to the workbench
-			{
-				return IFileDelta.ADDED;
-			}
-
-			case IResourceDelta.CHANGED : // resources has been changed in the workbench
-			{
-				return IFileDelta.CHANGED;
-			}
-
-			case IResourceDelta.REMOVED : // resource has been deleted from the workbench
-			{
-				return IFileDelta.DELETED;
-			}
-
-			case IResourceDelta.ADDED_PHANTOM : // incoming workbench resource
-			{
-				return IFileDelta.ADDED;
-			}
-
-			case IResourceDelta.REMOVED_PHANTOM : // outgoing workbench resource
-			{
-				return IFileDelta.DELETED;
-			}
-
-			default : {
-				return IFileDelta.CHANGED;
-			}
-		}
-	}
-
-
-	/**
-	 * Return the validators which are both configured on this type of project, (as stored in
-	 * getProject()), and enabled by the user on this project.
-	 */
-	static void addFileDelta(Map enabledValidators, ValidatorMetaData vmd, WorkbenchFileDelta fileDelta) {
-		Set fileDeltas = getResourceDeltas(enabledValidators, vmd);
-		fileDeltas.add(fileDelta);
-		enabledValidators.put(vmd, fileDeltas);
-	}
-
-	/**
-	 * Return a Map wrapper, with each VMD from enabledValidators as the key, and the value a Set of
-	 * IFileDelta wrapper around the changed Object[].
-	 * 
-	 * If filterIn is true, do not check if the resources are filtered in by the validator. If
-	 * filterIn is false, check if the resources are filtered in by the validator (recommended).
-	 */
-	public static Map getFileDeltas(Set enabledValidators, Object[] changedResources, boolean filterIn) {
-		return getFileDeltas(enabledValidators, changedResources, IFileDelta.CHANGED, filterIn); // by
-		// default,
-		// assume
-		// that
-		// the
-		// resources
-		// have
-		// changed,
-		// not
-		// added
-		// or
-		// deleted
-	}
-
-	/**
-	 * Return a Map wrapper, with each VMD from enabledValidators as the key, and the value a Set of
-	 * IFileDelta wrapper around the changed Object[], with each delta of type deltaType.
-	 */
-	public static Map getFileDeltas(Set enabledValidators, Object[] changedResources, int ifileDeltaType) {
-		return getFileDeltas(enabledValidators, changedResources, ifileDeltaType, false); // by
-		// default,
-		// check
-		// if the
-		// Object[]
-		// are
-		// filtered
-		// in by
-		// the
-		// validator
-	}
-
-	/**
-	 * Return a Map wrapper, with each VMD from enabledValidators as the key, and the value a Set of
-	 * IFileDelta wrapper around the changed Object[].
-	 * 
-	 * If "force" is true, then don't check if the object is filtered in by the validator or not.
-	 * ValidatorSubsetOperation can use validators that don't filter in these particular resources,
-	 * but can use a defaultExtension's validators instead.
-	 */
-	public static Map getFileDeltas(Set enabledValidators, Object[] changedResources, int ifileDeltaType, boolean force) {
-		Map result = new HashMap();
-		if ((enabledValidators == null) || (enabledValidators.size() == 0)) {
-			return result;
-		}
-
-		Iterator iterator = enabledValidators.iterator();
-		boolean cannotLoad = false;
-		IWorkbenchContext helper = null;
-		while (iterator.hasNext()) {
-			ValidatorMetaData vmd = (ValidatorMetaData) iterator.next();
-			try {
-				Set deltas = new HashSet();
-				IProgressMonitor monitor = new NullProgressMonitor();
-				for (int i = 0; i < changedResources.length; i++) {
-					Object obj = changedResources[i];
-					WorkbenchFileDelta wfd = null;
-					if (obj instanceof IResource) {
-						IResource res = (IResource) obj;
-						if (force || !filterOut(monitor, vmd, res, getResourceDeltaType(ifileDeltaType))) {
-							helper = vmd.getHelper(res.getProject());
-
-							wfd = getFileDelta(helper, vmd, res, getResourceDeltaType(ifileDeltaType));
-						}
-					} else {
-						wfd = new WorkbenchFileDelta(obj);
-					}
-
-					if (wfd != null) {
-						deltas.add(wfd);
-					}
-				}
-				result.put(vmd, deltas);
-			} catch (InstantiationException exc) {
-				cannotLoad = true;
-
-				// Remove the vmd from the reader's list
-				ValidationRegistryReader.getReader().disableValidator(vmd);
-
-				// Log the reason for the disabled validator
-				Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-				if (logger.isLoggingLevel(Level.SEVERE)) {
-					LogEntry entry = ValidationPlugin.getLogEntry();
-					entry.setSourceID("FilterUtil::getFileDeltas(Set, Object[], int, boolean)"); //$NON-NLS-1$
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-				continue;
-			}
-
-		}
-
-		if (cannotLoad) {
-			// Some of the validators should not be in the result set because either their
-			// validator class or helper class could not be instantiated.
-			Object[] vmds = enabledValidators.toArray();
-			for (int i = 0; i < vmds.length; i++) {
-				ValidatorMetaData vmd = (ValidatorMetaData) vmds[i];
-				if (vmd.cannotLoad()) {
-					result.remove(vmd);
-				}
-			}
-		}
-
-
-		return result;
-	}
-
-	public static WorkbenchFileDelta getFileDelta(IWorkbenchContext helper, ValidatorMetaData vmd, IResource resource, int iresourceDeltaType) {
-		// strip off the eclipse-specific information
-		String fileName = helper.getPortableName(resource);
-		if (fileName == null) {
-			// The resource is not contained in the current project.
-			// Can't see how this would happen, but check for it anyway.
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("FilterUtil::getFileDelta(IWorkbenchContext, ValidatorMetaData, IResource, int)"); //$NON-NLS-1$
-				entry.setMessageTypeID(ResourceConstants.VBF_EXC_SYNTAX_NULL_NAME);
-				String result = MessageFormat.format(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_SYNTAX_NULL_NAME), new String[]{resource.getName(), vmd.getValidatorDisplayName()});
-				entry.setText(result);
-				//entry.setTokens(new String[]{resource.getName(), vmd.getValidatorDisplayName()});
-				logger.write(Level.SEVERE, entry);
-			}
-
-			IPath resourcePath = resource.getFullPath();
-			if (resourcePath != null) {
-				// Since null file names are not allowed, default to the fully-qualified name of the
-				// resource.
-				fileName = resourcePath.toString();
-			} else {
-				if (logger.isLoggingLevel(Level.SEVERE)) {
-					LogEntry entry = ValidationPlugin.getLogEntry();
-					entry.setSourceID("FilterUtil::getFileDelta(IWorkbenchContext, ValidtaorMetaData, IResource, int)"); //$NON-NLS-1$
-					entry.setText("portableName is null and path is null for resource " + resource); //$NON-NLS-1$
-					logger.write(Level.SEVERE, entry);
-				}
-				return null;
-			}
-		}
-
-		int ifileDeltaType = getFileDeltaType(iresourceDeltaType);
-		return new WorkbenchFileDelta(fileName, ifileDeltaType, resource);
-	}
-
-
-	/**
-	 * Add the IResource to the vmd's list of resources to validate. Return true if the add was
-	 * successful or false if the add was not successful.
-	 */
-	static boolean addToFileList(Map enabledValidators, IWorkbenchContext helper, ValidatorMetaData vmd, IResource resource, int resourceDelta, boolean isFullBuild) {
-		if ((vmd == null) || (resource == null)) {
-			return false;
-		}
-
-		try {
-			helper.registerResource(resource);
-		} catch (Throwable exc) {
-			// How to log this????
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("FilterUtil.addToFileList"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-
-			InternalValidatorManager.getManager().addInternalErrorTask(resource.getProject(), vmd, exc);
-
-			// Don't return ... even though the register threw an exception, that's not to say
-			// that the validator can't validate.
-		}
-
-		if (isFullBuild) {
-			// To indicate a full build to the validator, don't build up a list of files;
-			// pass in null instead. Given that the list of files should not be used,
-			// don't calculate it.
-			return true;
-		}
-
-
-		WorkbenchFileDelta newFileDelta = getFileDelta(helper, vmd, resource, resourceDelta);
-		if (newFileDelta != null) {
-			// if delta is null, getFileDelta will have logged the problem already
-			addFileDelta(enabledValidators, vmd, newFileDelta);
-		}
-
-		return true;
-	}
-
-	/**
-	 * Whether a full verification or a delta verification is in progress, both will call this
-	 * method to process the resource. This method calls the current Validator to filter the
-	 * resource (i.e., this method returns if the resource fails the filter test).
-	 * <code>process</code> also sends output to the <code>IProgressMonitor</code>, and calls
-	 * the current Validator to validate the resource.
-	 * 
-	 * To process a resource, there are several steps: 1. check if the resource is registered for
-	 * this validator (i.e., the validator has either specified it in a filter, or has not filtered
-	 * it out explicitly) 2. call <code>isValidationSource</code> on the current validator with
-	 * the current resource. This method performs further filtering by the Validator itself, in
-	 * addition to the static filtering done by the framework, based on the information in
-	 * plugin.xml. 3. If the resource passes both filters, call <code>validate</code> on the
-	 * validator, with the resource. 4. When complete (either by failing to pass a filter, or by the
-	 * completion of the <code>validate</code>), increment the IProgressMonitor's status by one
-	 * (i.e., one resource has been processed.)
-	 */
-	static boolean filterOut(IProgressMonitor monitor, ValidatorMetaData vmd, IResource resource, int resourceDelta) {
-		if (monitor == null) {
-			return false;
-		}
-
-		checkCanceled(monitor);
-		return !(vmd.isApplicableTo(resource, resourceDelta));
-	}
-
-	/**
-	 * Whether a full verification or a delta verification is in progress, both will call this
-	 * method to process the resource. This method calls the current Validator to filter the
-	 * resource (i.e., this method returns if the resource fails the filter test).
-	 * <code>process</code> also sends output to the <code>IProgressMonitor</code>, and calls
-	 * the current Validator to validate the resource.
-	 * 
-	 * To process a resource, there are several steps: 1. check if the resource is registered for
-	 * this validator (i.e., the validator has either specified it in a filter, or has not filtered
-	 * it out explicitly) 2. call <code>isValidationSource</code> on the current validator with
-	 * the current resource. This method performs further filtering by the Validator itself, in
-	 * addition to the static filtering done by the framework, based on the information in
-	 * plugin.xml. 3. If the resource passes both filters, call <code>validate</code> on the
-	 * validator, with the resource. 4. When complete (either by failing to pass a filter, or by the
-	 * completion of the <code>validate</code>), increment the IProgressMonitor's status by one
-	 * (i.e., one resource has been processed.)
-	 */
-	static void filterOut(IProgressMonitor monitor, Map enabledValidators, IResource resource, int resourceDelta, boolean isFullBuild) {
-		if (monitor == null) {
-			return;
-		}
-
-		checkCanceled(monitor);
-
-		Iterator iterator = enabledValidators.keySet().iterator();
-		boolean cannotLoad = false;
-		while (iterator.hasNext()) {
-			checkCanceled(monitor);
-
-			ValidatorMetaData vmd = (ValidatorMetaData) iterator.next();
-
-			if (!filterOut(monitor, vmd, resource, resourceDelta)) {
-				try {
-					// Notify the helper that a resource is about to be filtered in
-					IWorkbenchContext helper = vmd.getHelper(resource.getProject());
-					addToFileList(enabledValidators, helper, vmd, resource, resourceDelta, isFullBuild);
-				} catch (InstantiationException exc) {
-					cannotLoad = true;
-
-					// Remove the vmd from the reader's list
-					ValidationRegistryReader.getReader().disableValidator(vmd);
-
-					// Log the reason for the disabled validator
-					Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-					if (logger.isLoggingLevel(Level.SEVERE)) {
-						LogEntry entry = ValidationPlugin.getLogEntry();
-						entry.setSourceID("FilterUtil::filterOut(IProgressMonitor, Map, IResource, int, boolean)"); //$NON-NLS-1$
-						entry.setTargetException(exc);
-						logger.write(Level.SEVERE, entry);
-					}
-				}
-			}
-		}
-
-		if (cannotLoad) {
-			// Some of the validators need to be removed from the set because the validator
-			// or helper cannot be instantiated.
-			Object[] vmds = enabledValidators.keySet().toArray();
-			for (int i = 0; i < vmds.length; i++) {
-				ValidatorMetaData vmd = (ValidatorMetaData) vmds[i];
-				if (vmd.cannotLoad()) {
-					enabledValidators.remove(vmd);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Whether a full verification or a delta verification is in progress, both will call this
-	 * method to process the resource. This method calls the current Validator to filter the
-	 * resource (i.e., this method returns if the resource fails the filter test).
-	 * <code>process</code> also sends output to the <code>IProgressMonitor</code>, and calls
-	 * the current Validator to validate the resource.
-	 * 
-	 * This method is called during an incremental, not a full, validation. The full validation
-	 * fakes an IResourceDelta, and the incremental needs to check that the delta is one of the
-	 * deltas which is filtered in by the validation framework.
-	 * 
-	 * @see filterOut(IResourceDelta)
-	 * 
-	 * To process a resource, there are several steps: 1. check if the resource is registered for
-	 * this validator (i.e., the validator has either specified it in a filter, or has not filtered
-	 * it out explicitly) 2. call <code>isValidationSource</code> on the current validator with
-	 * the current resource. This method performs further filtering by the Validator itself, in
-	 * addition to the static filtering done by the framework, based on the information in
-	 * plugin.xml. 3. If the resource passes both filters, call <code>validate</code> on the
-	 * validator, with the resource. 4. When complete (either by failing to pass a filter, or by the
-	 * completion of the <code>validate</code>), increment the IProgressMonitor's status by one
-	 * (i.e., one resource has been processed.)
-	 */
-	static void filterOut(IProgressMonitor monitor, Map enabledValidators, IResource resource, IResourceDelta delta) {
-		// filter in only resources which have been added, deleted, or its content changed.
-		// moves will be registered as an add & delete combination
-		if (filterOut(delta)) {
-			return;
-		}
-		filterOut(monitor, enabledValidators, resource, delta.getKind(), false); // false =
-		// incremental
-		// build
-	}
-
-	/**
-	 * Filter out resource deltas which don't correspond to changes that validators can validate.
-	 * 
-	 * This method will filter in deltas only if the delta is an add, a delete, or if the content of
-	 * the file has changed.
-	 * 
-	 * Return true if the delta should be filtered out, and false if we should validate it.
-	 * 
-	 * @see IResourceDelta
-	 */
-	static boolean filterOut(IResourceDelta delta) {
-		if (delta == null) {
-			return true;
-		}
-
-		switch (delta.getKind()) {
-			case IResourceDelta.ADDED : // resource has been added to the workbench
-			{
-				return false;
-			}
-
-			case IResourceDelta.REMOVED : // resource has been deleted from the workbench
-			{
-				// If the delta is an IProject, and the IProject is getting deleted or closed, don't
-				// validate it or its children.
-				if (delta.getResource() instanceof IProject) {
-					return true;
-				}
-				return false;
-			}
-
-			case IResourceDelta.CHANGED : // resources has been changed in the workbench
-			{
-				// We want to add the enterprise bean only if its source file's
-				// contents have changed. (for example, if a folder has been
-				// added to the project, the IFile will be changed because
-				// its position has been changed, but the enterprise bean
-				// doesn't need to be redeployed. See IResourceDelta.getFlags()
-				// for more information.)
-				//
-				// Or, if ejb-jar.xml has changed, the EJBJar is destroyed & created
-				// from scratch, so the list of EnterpriseBean is new. Purge the old
-				// EJBJar from the EJBCache (since it will never be referenced again),
-				// and load the new EJBJar into the cache.
-				if ((delta.getResource() instanceof IFile) && ((delta.getFlags() & IResourceDelta.CONTENT) != 0)) {
-					return false;
-				}
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * This method returns true if the given resource and its children should be processed by the
-	 * validators. That is, there are several types of changes which can occur to an IProject which
-	 * should not trigger a revalidation of the project or its children. (e.g. project is deleted or
-	 * closed.) For those cases, or if the IResourceDelta is invalid, this method will return false
-	 * (do not validate the IProject or its children). Otherwise, return true (validate the resource &
-	 * its children). If an IProject itself has not changed, but one of its children has
-	 * (delta.getKind() of NO_CHANGE), then return true so that the children are validated.
-	 */
-	static boolean shouldProcess(IResource resource, IResourceDelta delta) {
-		if ((resource != null) && !(resource instanceof IProject)) {
-			return true;
-		}
-
-		if (delta == null) {
-			return false;
-		}
-
-		switch (delta.getKind()) {
-			case IResourceDelta.ADDED : // resource has been deleted from the workbench; may be part
-			// of a move
-			{
-				if (0 != (delta.getFlags() & IResourceDelta.MOVED_FROM)) {
-					// If it's being moved, don't revalidate its children. If it's being added, fall
-					// through to the "return true;" at the end of this method.
-					return false;
-				}
-				break;
-			}
-
-			case IResourceDelta.REMOVED : // resource has been deleted from the workbench; may be
-			// part of a move
-			{
-				// Whether it's being deleted or moved, don't revalidate its children.
-				return false;
-			}
-
-			case IResourceDelta.CHANGED : // resource has been changed in the workbench; may be part
-			// of a move
-			{
-				if ((delta.getFlags() & IResourceDelta.OPEN) != 0) {
-					// Change is related to the OPEN bit. Whether the project was closed and is now
-					// open,
-					// or the project was open and is now closed, don't need to revalidate the
-					// children.
-					return false;
-				} else if ((delta.getFlags() & IResourceDelta.REPLACED) != 0) {
-					// project was moved
-					return false;
-				}
-
-				break;
-			}
-		}
-
-		return true;
-	}
-
-	private static VMDResourceVisitor getResourceVisitor(IProgressMonitor monitor, Set enabledValidators) {
-		if (_resourceVisitor == null) {
-			_resourceVisitor = new VMDResourceVisitor() {
-				private Map _vmdDeltas = null;
-				private IProgressMonitor _progressMonitor = null;
-
-				public Map getResult() {
-					return _vmdDeltas;
-				}
-
-				public void setEnabledValidators(Set validators) {
-					_vmdDeltas = wrapInMap(validators);
-				}
-
-				public IProgressMonitor getProgressMonitor() {
-					return _progressMonitor;
-				}
-
-				public void setProgressMonitor(IProgressMonitor m) {
-					_progressMonitor = m;
-				}
-
-				public boolean visit(IResource res) throws CoreException {
-					FilterUtil.checkCanceled(getProgressMonitor());
-
-					// We don't need to filter out anything, because a full validation
-					// is about to be performed.
-					filterOut(getProgressMonitor(), _vmdDeltas, res, IResourceDelta.CHANGED, true); // true
-					// -
-					// this
-					// is a
-					// full
-					// build
-
-					return true; // visit the resource's children as well
-				}
-			};
-		}
-		_resourceVisitor.setProgressMonitor(monitor);
-		_resourceVisitor.setEnabledValidators(enabledValidators);
-
-		return _resourceVisitor;
-	}
-
-	private static VMDDeltaVisitor getDeltaVisitor(IProgressMonitor monitor, Set enabledValidators) {
-		if (_deltaVisitor == null) {
-			_deltaVisitor = new VMDDeltaVisitor() {
-				private Map _vmdDeltas = null;
-				private IProgressMonitor _progressMonitor = null;
-
-				public Map getResult() {
-					return _vmdDeltas;
-				}
-
-				public void setEnabledValidators(Set validators) {
-					_vmdDeltas = wrapInMap(validators);
-				}
-
-				public IProgressMonitor getProgressMonitor() {
-					return _progressMonitor;
-				}
-
-				public void setProgressMonitor(IProgressMonitor m) {
-					_progressMonitor = m;
-				}
-
-				public boolean visit(IResourceDelta subdelta) throws CoreException {
-					checkCanceled(getProgressMonitor());
-					if (subdelta == null)
-						return true;
-
-					IResource resource = subdelta.getResource();
-
-					Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-					if (logger.isLoggingLevel(Level.FINEST)) {
-						StringBuffer buffer = new StringBuffer("subdelta of "); //$NON-NLS-1$
-						buffer.append(resource.getName());
-						buffer.append(" is "); //$NON-NLS-1$
-						buffer.append(subdelta.getKind());
-						buffer.append(" resource exists? "); //$NON-NLS-1$
-						buffer.append(resource.exists());
-						buffer.append(" resource.isPhantom?"); //$NON-NLS-1$
-						buffer.append(resource.isPhantom());
-
-						if (logger.isLoggingLevel(Level.FINEST)) {
-							LogEntry entry = ValidationPlugin.getLogEntry();
-							entry.setSourceID("FilterUtil::visit(IResourceDelta)"); //$NON-NLS-1$
-							entry.setText(buffer.toString());
-							logger.write(Level.FINEST, entry);
-						}
-
-					}
-
-					// If the delta is an IProject, and the IProject is getting deleted or closed,
-					// don't validate it or its children.
-					if (shouldProcess(resource, subdelta)) {
-						filterOut(getProgressMonitor(), _vmdDeltas, resource, subdelta);
-						return true; // visit the delta's children as well
-					}
-					return false; // do not visit the delta's children
-				}
-			};
-		}
-		_deltaVisitor.setProgressMonitor(monitor);
-		_deltaVisitor.setEnabledValidators(enabledValidators);
-
-		return _deltaVisitor;
-	}
-
-	public static Map loadDeltas(final IProgressMonitor monitor, final Set enabledValidators, IResourceDelta delta) throws CoreException {
-		VMDDeltaVisitor visitor = getDeltaVisitor(monitor, enabledValidators);
-		delta.accept(visitor, true); // true means include phantom resources
-		return visitor.getResult();
-	}
-
-	public static Map loadDeltas(final IProgressMonitor monitor, final Set enabledValidators, IProject project) throws CoreException {
-		VMDResourceVisitor visitor = getResourceVisitor(monitor, enabledValidators);
-		project.accept(visitor, IResource.DEPTH_INFINITE, true); // true means include phantom
-		// resources
-		return visitor.getResult();
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/GlobalConfiguration.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/GlobalConfiguration.java
deleted file mode 100644
index cf9829f..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/GlobalConfiguration.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.logging.Level;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-
-
-/**
- * This class represents the global Preferences as set on the Validation Preferences page.
- */
-public class GlobalConfiguration extends ValidationConfiguration {
-	/* package */static final boolean PREF_PROJECTS_CAN_OVERRIDE_DEFAULT = true;
-
-	private boolean _canProjectsOverride = getCanProjectsOverrideDefault();
-
-	/**
-	 * This constructor should be used in all cases except for the Preference page's values.
-	 */
-	public GlobalConfiguration(IWorkspaceRoot root) throws InvocationTargetException {
-		super(root, convertToArray(ValidationRegistryReader.getReader().getAllValidators()));
-
-		// Can't put the call to load() and passivate() in the ValidationConfiguration constructor
-		// due
-		// to the order of initialization.
-		//    1. First the ValidationConfiguration constructor is called, and that loads the stored
-		// values.
-		//    2. Then this class's <init> method is called, and that initializes the "override" field
-		// to the default,
-		//       which may be different than the stored value.
-	}
-
-	/**
-	 * This constructor is provided only for the Preference page, so that the page can store values
-	 * without persisting them (i.e., if the user presses Cancel then nothing needs to be done.)
-	 */
-	public GlobalConfiguration(GlobalConfiguration original) throws InvocationTargetException {
-		super();
-		original.copyTo(this);
-	}
-
-	public boolean canProjectsOverride() {
-		return _canProjectsOverride;
-	}
-
-	public void setCanProjectsOverride(boolean can) {
-		_canProjectsOverride = can;
-	}
-
-	public void resetToDefault() {
-		setAutoValidate(getAutoValidateDefault());
-		setEnabledValidators(getEnabledValidatorsDefault());
-		setMaximumNumberOfMessages(getMaximumNumberOfMessagesDefault());
-		setBuildValidate(getBuildValidateDefault());
-		setCanProjectsOverride(getCanProjectsOverrideDefault());
-	}
-
-	/**
-	 * This method exists only for migration purposes. The root marker must be deleted after
-	 * migration is complete.
-	 */
-	protected IMarker[] getMarker() {
-		try {
-			IWorkspaceRoot root = getRoot();
-			IMarker[] markers = root.findMarkers(ConfigurationConstants.PREFERENCE_MARKER, false, IResource.DEPTH_ONE);
-
-			if (markers.length == 1) {
-				return markers;
-			}
-			// job is done. Nothing to migrate.
-			return null;
-
-		} catch (CoreException exc) {
-			// Can't find the IMarker? Assume it's deleted.
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("GlobalConfiguration.getMarker()"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-			return null;
-		}
-	}
-
-	protected void load(IMarker[] marker) {
-		// The 5.0 preferences were stored in an IMarker, and the current.preferences are stored in
-		// PersistentProperties on the IResource.
-		// A 5.0 root can have no marker values if the preference page, properties page, and
-		// validation were never viewed or run.
-		try {
-			IWorkspaceRoot root = getRoot();
-			if (marker == null) {
-				// There were no global preferences in 4.03, so the migration is to create some.
-				resetToDefault(); // assign the default values to the new Global Preference
-				return;
-			}
-
-			IMarker rootMarker = marker[0]; // getMarker() has already checked that there's a marker
-			// in the array
-			ValidatorMetaData[] enabledValidators = null;
-			String enabledValidatorsString = (String) getValue(rootMarker, ConfigurationConstants.ENABLED_VALIDATORS);
-			if (enabledValidatorsString == null) {
-				enabledValidators = ConfigurationConstants.DEFAULT_ENABLED_VALIDATORS;
-			} else {
-				enabledValidators = getStringAsEnabledElementsArray(enabledValidatorsString);
-			}
-
-			setEnabledValidators(enabledValidators);
-			setAutoValidate(getValue(rootMarker, ConfigurationConstants.AUTO_SETTING, ConfigurationConstants.DEFAULT_AUTO_SETTING));
-			setBuildValidate(getValue(rootMarker, ConfigurationConstants.BUILD_SETTING, ConfigurationConstants.DEFAULT_BUILD_SETTING));
-			setMaximumNumberOfMessages(getValue(rootMarker, ConfigurationConstants.MAXNUMMESSAGES, ConfigurationConstants.DEFAULT_MAXNUMMESSAGES));
-			setCanProjectsOverride(getValue(rootMarker, ConfigurationConstants.PREF_PROJECTS_CAN_OVERRIDE, PREF_PROJECTS_CAN_OVERRIDE_DEFAULT));
-
-			root.getWorkspace().deleteMarkers(marker);
-		} catch (CoreException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("GlobalConfiguration.loadV50"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-		}
-	}
-
-	protected void copyTo(GlobalConfiguration gp) throws InvocationTargetException {
-		super.copyTo(gp);
-
-		// Need to have a distinct method for this child class (i.e., the parameter
-		// is not a ValidationConfiguration) because if this initialization is
-		// called as part of ValidationConfiguration's constructor, then the value of
-		// this field is overwritten. Fields of this class are initialized to the
-		// default after the ValidationConfiguration parent is created.
-		gp.setCanProjectsOverride(canProjectsOverride());
-	}
-
-	public static boolean getCanProjectsOverrideDefault() {
-		return PREF_PROJECTS_CAN_OVERRIDE_DEFAULT;
-	}
-
-	/**
-	 * @see org.eclipse.wst.validation.internal.operations.internal.attribute.ValidationConfiguration#deserialize(String)
-	 */
-	public void deserialize(String storedConfiguration) throws InvocationTargetException {
-		super.deserialize(storedConfiguration);
-
-		if (storedConfiguration != null && storedConfiguration.length() > 0) {
-			// If it's null, then super.deserialize has already called resetToDefault to initialize
-			// this instance.
-			int canOverrideIndex = storedConfiguration.indexOf(ConfigurationConstants.PREF_PROJECTS_CAN_OVERRIDE);
-			int autoIndex = storedConfiguration.indexOf(ConfigurationConstants.AUTO_SETTING);
-
-			String canOverride = storedConfiguration.substring(canOverrideIndex + ConfigurationConstants.PREF_PROJECTS_CAN_OVERRIDE.length(), autoIndex);
-			setCanProjectsOverride(Boolean.valueOf(canOverride).booleanValue());
-		}
-	}
-
-	/**
-	 * @see org.eclipse.wst.validation.internal.operations.internal.attribute.ValidationConfiguration#serialize()
-	 */
-	public String serialize() throws InvocationTargetException {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append(ConfigurationConstants.PREF_PROJECTS_CAN_OVERRIDE);
-		buffer.append(String.valueOf(canProjectsOverride()));
-		buffer.append(super.serialize());
-		return buffer.toString();
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/IProjectValidationHelper.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/IProjectValidationHelper.java
deleted file mode 100644
index f22df4f..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/IProjectValidationHelper.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IProject;
-
-public interface IProjectValidationHelper {
-	
-	public IContainer[] getOutputContainers(IProject project);
-	
-	public IContainer[] getSourceContainers(IProject project);
-	
-	public void disposeInstance();
-
-}
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/IValidationSelectionHandler.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/IValidationSelectionHandler.java
deleted file mode 100644
index 38292b6..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/IValidationSelectionHandler.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal;
-
-import org.eclipse.core.resources.IResource;
-
-/**
- * This is used by extensions to add valid validation types to the validate
- * menu action.
- */
-public interface IValidationSelectionHandler {
-
-	/**
-	 * Return a valid IResource type for the extensible object selection,
-	 * should be instance of IFolder, IFile, or IProject if this extension knows
-	 * how to handle the selection, otherwise it should return null
-	 */ 
-	public IResource getBaseValidationType(Object selection);
-	
-	/**
-	 * @return the classname of the validation type to register for validation
-	 */
-	public String getValidationTypeString();
-	
-	public void setValidationTypeString(String validationType);
-	
-}
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/InternalValidatorManager.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/InternalValidatorManager.java
deleted file mode 100644
index 07d3845..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/InternalValidatorManager.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal;
-
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.logging.Level;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.validation.internal.core.Message;
-import org.eclipse.wst.validation.internal.operations.WorkbenchReporter;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-
-/**
- */
-public final class InternalValidatorManager {
-	private static InternalValidatorManager _inst = null;
-	private static final String OP_GROUP = "ValidationOperation"; //$NON-NLS-1$ // when the ValidationOperation
-
-	// adds a message to the task
-	// list; e.g. cancel, or internal
-	// error, this group name is used
-	// to distinguish between the
-	// messages that the validator
-	// itself put, and the ones which
-	// the validator owns, but the
-	// operation put. //$NON-NLS-1$
-
-	private InternalValidatorManager() {
-		//default
-	}
-
-	public static InternalValidatorManager getManager() {
-		if (_inst == null) {
-			_inst = new InternalValidatorManager();
-		}
-		return _inst;
-	}
-
-	/**
-	 * Return a new Set that contains all of the elements from the array.
-	 */
-	public static Set wrapInSet(Object[] obj) {
-		Set result = new HashSet();
-		if ((obj == null) || (obj.length == 0)) {
-			return result;
-		}
-
-		for (int i = 0; i < obj.length; i++) {
-			result.add(obj[i]);
-		}
-
-		return result;
-	}
-
-	/**
-	 * If the current validator throws a Throwable, log the internal error to the task list.
-	 * 
-	 * This method is for use by the validation framework only.
-	 */
-	public void addInternalErrorTask(IProject project, ValidatorMetaData vmd, Throwable exc) {
-		addOperationTask(project, vmd, ResourceConstants.VBF_EXC_INTERNAL, new String[]{project.getName(), vmd.getValidatorDisplayName(), ((exc.getMessage() == null) ? "" : exc.getMessage())}); //$NON-NLS-1$
-	}
-
-	/**
-	 * If the user is cancelling validation on the current project/resource, Add an information task
-	 * to the task list informing the user that validation has not been run on the current project.
-	 * 
-	 * If the current validator throws a Throwable, log the internal error to the task list.
-	 */
-	public void addOperationTask(IProject project, ValidatorMetaData vmd, String messageId, String[] parms) {
-		Message message = ValidationPlugin.getMessage();
-		message.setSeverity(IMessage.LOW_SEVERITY);
-		message.setId(messageId);
-		message.setParams(parms);
-		message.setGroupName(OP_GROUP);
-
-		// Although the message is owned by the validator, the string of the message has to be
-		// loaded by this class' ClassLoader
-		WorkbenchReporter.addMessage(project, vmd.getValidatorUniqueName(), getClass().getClassLoader(), message);
-	}
-
-
-	/**
-	 * If the user cancelled the previous validation with this validator, or if there was a
-	 * Throwable caught during the last execution of this validator, and the validator is in the
-	 * process of validating now, remove the former information task messages.
-	 */
-	public void removeOperationTasks(IProject project, ValidatorMetaData vmd) {
-		WorkbenchReporter.removeMessageSubset(project, vmd.getValidatorUniqueName(), OP_GROUP);
-	}
-
-	/**
-	 * Return an array of the fully-qualified names of the validator classes.
-	 */
-	public String[] getValidatorNames(ValidatorMetaData[] vmds) {
-		Set temp = new HashSet();
-		for (int i = 0; i < vmds.length; i++) {
-			String[] names = vmds[i].getValidatorNames();
-			for (int j = 0; j < names.length; j++) {
-				temp.add(names[j]);
-			}
-		}
-
-		String[] vmdNames = new String[temp.size()];
-		temp.toArray(vmdNames);
-		return vmdNames;
-	}
-
-	/**
-	 * Return an array of the fully-qualified names of the validator classes.
-	 */
-	public String[] getValidatorNames(Collection vmds) {
-		Set temp = new HashSet();
-		Iterator iterator = vmds.iterator();
-		while (iterator.hasNext()) {
-			ValidatorMetaData vmd = (ValidatorMetaData) iterator.next();
-			String[] names = vmd.getValidatorNames();
-			for (int j = 0; j < names.length; j++) {
-				temp.add(names[j]);
-			}
-		}
-
-		String[] vmdNames = new String[temp.size()];
-		temp.toArray(vmdNames);
-		return vmdNames;
-	}
-
-	/**
-	 * Return a list of validators that validate files with the given extension.
-	 */
-	public ValidatorMetaData[] getValidatorsForExtension(IProject project, String fileExtension) {
-		try {
-			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-
-			// Get all of the validators configured on the project for the given file extension
-			ValidatorMetaData[] vmds = prjp.getValidators();
-
-			// Construct a fake IFile type to represent a file with this extension.
-			StringBuffer buffer = new StringBuffer(project.getName());
-			buffer.append(IPath.SEPARATOR);
-			buffer.append(fileExtension);
-			IPath path = new Path(buffer.toString());
-			IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
-
-			ValidatorMetaData[] temp = new ValidatorMetaData[vmds.length];
-			int count = 0;
-			for (int i = 0; i < vmds.length; i++) {
-				ValidatorMetaData vmd = vmds[i];
-				if (vmd.isApplicableTo(file)) {
-					temp[count++] = vmd;
-				}
-			}
-
-			ValidatorMetaData[] result = new ValidatorMetaData[count];
-			System.arraycopy(temp, 0, result, 0, count);
-			return result;
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("InternalValidatorManager::getValidatorsForExtension(" + project.getName() + ", " + fileExtension + ")"); //$NON-NLS-1$  //$NON-NLS-2$ //$NON-NLS-3$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-			return new ValidatorMetaData[0];
-		}
-	}
-
-	/**
-	 * Return a list of validator names that validate files with the given extension.
-	 */
-	public String[] getValidatorNamesForExtension(IProject project, String fileExtension) {
-		ValidatorMetaData[] vmds = getValidatorsForExtension(project, fileExtension);
-
-		String[] names = new String[vmds.length];
-		for (int i = 0; i < names.length; i++) {
-			names[i] = vmds[i].getValidatorUniqueName();
-		}
-		return names;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ProjectConfiguration.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ProjectConfiguration.java
deleted file mode 100644
index 0e7d711..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ProjectConfiguration.java
+++ /dev/null
@@ -1,615 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.logging.Level;
-
-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.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-
-
-/**
- * This class represents the Project Preferences as set on the Project's Validation Properties page.
- */
-public class ProjectConfiguration extends ValidationConfiguration {
-	/* package */static final boolean PRJ_OVERRIDEGLOBAL_DEFAULT = false; // If the user has never
-	// set
-	// a preference before, this
-	// is the override default
-	// (on)
-	private boolean _doesProjectOverride = getDoesProjectOverrideDefault();
-
-	/**
-	 * This constructor should be used in all cases except for the Properties page's values.
-	 */
-	protected ProjectConfiguration(IProject project) throws InvocationTargetException {
-		// The extractProjectValidators method extracts just this project's validators from the
-		// global list.
-		super(project, extractProjectValidators(convertToArray(ValidationRegistryReader.getReader().getAllValidators()), project));
-
-		// Can't put the call to load() and passivate() in the ValidationConfiguration constructor
-		// due
-		// to the order of initialization.
-		//    1. First the ValidationConfiguration constructor is called, and that loads the stored
-		// values.
-		//    2. Then this class's <init> method is called, and that initializes the "override" field
-		// to the default,
-		//       which may be different than the stored value.
-	}
-
-	/**
-	 * This constructor is provided only for the Properties page, so that the page can store values
-	 * without persisting them (i.e., if the user presses Cancel then nothing needs to be done.)
-	 */
-	public ProjectConfiguration(ProjectConfiguration original) throws InvocationTargetException {
-		super();
-		original.copyTo(this);
-	}
-
-	/**
-	 * Return the ValidationConfiguration to use, whether global or project.
-	 */
-	protected boolean useGlobalPreference() {
-		try {
-			GlobalConfiguration gp = ConfigurationManager.getManager().getGlobalConfiguration();
-			if (gp == null) {
-				return false;
-			}
-
-			if (!gp.canProjectsOverride()) {
-				// If project's can't override the global, use the global
-				return true;
-			}
-
-			// If the project overrides, then don't use the global.
-			// If the project does not override, use the global.
-			return !_doesProjectOverride;
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("ProjectConfiguration.userGlobalPreference"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-			return false;
-		}
-	}
-
-	public boolean doesProjectOverride() {
-		// If the global preference doesn't allow projects to override, it doesn't matter what the
-		// value of _doesProjectOverride is.
-		return !useGlobalPreference();
-	}
-
-	public void setDoesProjectOverride(boolean does) {
-		_doesProjectOverride = does;
-	}
-
-	/**
-	 * If the preferences should be used then the preference settings are returned; otherwise return
-	 * the project settings.
-	 */
-	public ValidatorMetaData[] getEnabledValidators() throws InvocationTargetException {
-		if (useGlobalPreference()) {
-			return extractProjectValidators(ConfigurationManager.getManager().getGlobalConfiguration().getEnabledValidators(), getResource());
-		}
-		return super.getEnabledValidators();
-	}
-
-	/**
-	 * @see org.eclipse.wst.validation.internal.operations.internal.preference.ValidationConfiguration#getDisabledValidators()
-	 */
-	public ValidatorMetaData[] getDisabledValidators() throws InvocationTargetException {
-		if (useGlobalPreference()) {
-			return extractProjectValidators(ConfigurationManager.getManager().getGlobalConfiguration().getDisabledValidators(), getResource());
-		}
-		return super.getDisabledValidators();
-	}
-
-	/**
-	 * @see org.eclipse.wst.validation.internal.operations.internal.preference.ValidationConfiguration#getValidators()
-	 */
-	public ValidatorMetaData[] getValidators() throws InvocationTargetException {
-		if (useGlobalPreference()) {
-			return extractProjectValidators(ConfigurationManager.getManager().getGlobalConfiguration().getValidators(), getResource());
-		}
-		return super.getValidators();
-	}
-
-	/**
-	 * @see org.eclipse.wst.validation.internal.operations.internal.attribute.ValidationConfiguration#getEnabledIncrementalValidators(boolean)
-	 */
-	public ValidatorMetaData[] getEnabledIncrementalValidators(boolean incremental) throws InvocationTargetException {
-		if (useGlobalPreference()) {
-			return extractProjectValidators(ConfigurationManager.getManager().getGlobalConfiguration().getEnabledIncrementalValidators(incremental), getResource());
-		}
-		return super.getEnabledIncrementalValidators(incremental);
-	}
-
-	/**
-	 * @see org.eclipse.wst.validation.internal.operations.internal.preference.ValidationConfiguration#isEnabled(ValidatorMetaData)
-	 */
-	public boolean isEnabled(ValidatorMetaData vmd) throws InvocationTargetException {
-		if (useGlobalPreference()) {
-			return ConfigurationManager.getManager().getGlobalConfiguration().isEnabled(vmd);
-		}
-		return super.isEnabled(vmd);
-	}
-
-	/**
-	 * @see org.eclipse.wst.validation.internal.operations.internal.preference.ValidationConfiguration#numberOfDisabledValidators()
-	 */
-	public int numberOfDisabledValidators() throws InvocationTargetException {
-		if (useGlobalPreference()) {
-			return ConfigurationManager.getManager().getGlobalConfiguration().numberOfDisabledValidators();
-		}
-		return super.numberOfDisabledValidators();
-	}
-
-	/**
-	 * @see org.eclipse.wst.validation.internal.operations.internal.preference.ValidationConfiguration#numberOfEnabledIncrementalValidators()
-	 */
-	public int numberOfEnabledIncrementalValidators() throws InvocationTargetException {
-		if (useGlobalPreference()) {
-			return ConfigurationManager.getManager().getGlobalConfiguration().numberOfEnabledIncrementalValidators();
-		}
-		return super.numberOfEnabledIncrementalValidators();
-	}
-
-	/**
-	 * @see org.eclipse.wst.validation.internal.operations.internal.preference.ValidationConfiguration#numberOfEnabledValidators()
-	 */
-	public int numberOfEnabledValidators() throws InvocationTargetException {
-		if (useGlobalPreference()) {
-			return ConfigurationManager.getManager().getGlobalConfiguration().numberOfEnabledValidators();
-		}
-		return super.numberOfEnabledValidators();
-	}
-
-	/**
-	 * @see org.eclipse.wst.validation.internal.operations.internal.preference.ValidationConfiguration#numberOfIncrementalValidators()
-	 */
-	public int numberOfIncrementalValidators() throws InvocationTargetException {
-		if (useGlobalPreference()) {
-			return ConfigurationManager.getManager().getGlobalConfiguration().numberOfIncrementalValidators();
-		}
-		return super.numberOfIncrementalValidators();
-	}
-
-	/**
-	 * @see org.eclipse.wst.validation.internal.operations.internal.preference.ValidationConfiguration#numberOfValidators()
-	 */
-	public int numberOfValidators() throws InvocationTargetException {
-		if (useGlobalPreference()) {
-			return ConfigurationManager.getManager().getGlobalConfiguration().numberOfValidators();
-		}
-		return super.numberOfValidators();
-	}
-
-	/**
-	 * This method could be called with the project's values, or with the global preference values.
-	 * Validators that are not configured on this project will be ignored.
-	 */
-	public void setEnabledValidators(ValidatorMetaData[] vmds) {
-		super.setEnabledValidators(extractProjectValidators(vmds, getResource()));
-	}
-
-	/**
-	 * This method could be called with the project's values, or with the global preference values.
-	 * Validators that are not configured on this project will be ignored.
-	 */
-	public void setValidators(ValidatorMetaData[] vmds) {
-		super.setValidators(extractProjectValidators(vmds, getResource()));
-	}
-
-	/**
-	 * Given a set of validators, usually the global preference set, change the set so that it
-	 * contains only the validators configured on this project.
-	 */
-	private static ValidatorMetaData[] extractProjectValidators(ValidatorMetaData[] vmds, IResource resource) {
-		ValidationRegistryReader reader = ValidationRegistryReader.getReader();
-		int length = (vmds == null) ? 0 : vmds.length;
-		ValidatorMetaData[] temp = new ValidatorMetaData[length];
-		if (length == 0) {
-			return temp;
-		}
-
-		int count = 0;
-		IProject project = (IProject) resource;
-		for (int i = 0; i < vmds.length; i++) {
-			ValidatorMetaData vmd = vmds[i];
-			if (reader.isConfiguredOnProject(vmd, project)) {
-				temp[count++] = vmd;
-			}
-		}
-
-		ValidatorMetaData[] result = new ValidatorMetaData[count];
-		System.arraycopy(temp, 0, result, 0, count);
-		temp = null;
-
-		return result;
-	}
-
-	/**
-	 * If the preferences should be used then the preference settings are returned; otherwise return
-	 * the project settings.
-	 */
-	public int getMaximumNumberOfMessages() throws InvocationTargetException {
-		if (useGlobalPreference()) {
-			return ConfigurationManager.getManager().getGlobalConfiguration().getMaximumNumberOfMessages();
-		}
-		return super.getMaximumNumberOfMessages();
-	}
-
-	/**
-	 * If the preferences should be used then the preference settings are returned; otherwise return
-	 * the project settings.
-	 */
-	public boolean isAutoValidate() throws InvocationTargetException {
-		if (useGlobalPreference()) {
-			return ConfigurationManager.getManager().getGlobalConfiguration().isAutoValidate();
-		}
-		return super.isAutoValidate();
-	}
-
-	/**
-	 * If the preferences should be used then the preference settings are returned; otherwise return
-	 * the project settings.
-	 */
-	public boolean isBuildValidate() throws InvocationTargetException {
-		if (useGlobalPreference()) {
-			return ConfigurationManager.getManager().getGlobalConfiguration().isBuildValidate();
-		}
-		return super.isBuildValidate();
-	}
-
-	/**
-	 * If the preferences should be used then the preference settings are returned; otherwise return
-	 * the project settings.
-	 */
-	public boolean runAsync() throws InvocationTargetException {
-		if (useGlobalPreference()) {
-			return ConfigurationManager.getManager().getGlobalConfiguration().runAsync();
-		}
-		return super.runAsync();
-	}
-
-	public void resetToDefault() throws InvocationTargetException {
-		// The default values of the project is whatever the preference values are
-		GlobalConfiguration gp = ConfigurationManager.getManager().getGlobalConfiguration();
-
-		setAutoValidate(gp.isAutoValidate());
-		setEnabledValidators(gp.getEnabledValidators());
-		setMaximumNumberOfMessages(gp.getMaximumNumberOfMessages());
-		setBuildValidate(gp.isBuildValidate());
-
-		// except for this field, which is unique to the project preferences
-		setDoesProjectOverride(getDoesProjectOverrideDefault());
-	}
-
-	public void resetToDefaultForProjectDescriptionChange() throws InvocationTargetException {
-		// The default values of the project is whatever the preference values are
-		GlobalConfiguration gp = ConfigurationManager.getManager().getGlobalConfiguration();
-
-		setAutoValidate(gp.isAutoValidate());
-		setEnabledValidators(gp.getEnabledValidators());
-		setMaximumNumberOfMessages(gp.getMaximumNumberOfMessages());
-		setBuildValidate(gp.isBuildValidate());
-
-		// except for this field, which is unique to the project preferences
-		//setDoesProjectOverride(getDoesProjectOverrideDefault());
-	}
-
-	/**
-	 * The project's nature has changed, so recalculate the validators that are configured on the
-	 * project, and reset the values of the project to the default.
-	 */
-	public void resetProjectNature() {
-		/*
-		 * We do not want to perform the resetting the of the validators as the nature never gets
-		 * reset due to change in the project references - VKB GlobalConfiguration gp =
-		 * ConfigurationManager.getManager().getGlobalConfiguration();
-		 * setValidators(gp.getValidators()); // Reset the validators that are configured on the
-		 * project (the ProjectConfiguration automatically saves only the validators that are
-		 * configured on the project). resetToDefault(); // Given that the project is "new", reset
-		 * its values to the Preferences.
-		 */
-	}
-
-	/**
-	 * This method exists only for migration purposes. The project marker must be deleted after
-	 * migration is complete.
-	 */
-	protected IMarker[] getMarker() {
-		try {
-			// First try to find the 4.03 project marker.
-			IMarker[] allMarkers = getResource().findMarkers(ConfigurationConstants.PRJ_MARKER_403, false, IResource.DEPTH_ZERO);
-
-			// If it doesn't exist, then this might be a 5.0 project marker.
-			if ((allMarkers == null) || (allMarkers.length == 0)) {
-				allMarkers = getResource().findMarkers(ConfigurationConstants.PRJ_MARKER, false, IResource.DEPTH_ZERO);
-			}
-
-			// There should be only one projectmarker.
-			if (allMarkers.length == 1) {
-				return allMarkers;
-			}
-			// Job is done. Nothing to migrate.
-			return null;
-		} catch (CoreException exc) {
-			// Can't find the IMarker? Assume it's deleted.
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("ProjectConfiguration::getMarker"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-			return null;
-		}
-	}
-
-	protected void load(IMarker[] marker) {
-		// 4.03 project preferences are different from the current in the following ways:
-		//    1. Only preferences that could be set were the enabled validators and the auto-validate
-		// option.
-		//    2. The preferences were stored in an IMarker instead of a PersistentProperty.
-		// The 5.0 project settings were stored in an IMarker, and the current settings are stored
-		// in a PersistentProperty.
-		// A 5.0 project could have a null validation marker if the validation page was never
-		// opened on it, and if validation was never run.
-		try {
-			if (marker == null) {
-				// Assume default values
-				resetToDefault();
-				return;
-			}
-
-			IMarker prjMarker = marker[0]; // getProjectMarker() has already checked that there's a
-			// marker in the array
-			GlobalConfiguration gp = ConfigurationManager.getManager().getGlobalConfiguration();
-
-			String enabledValStr = (String) getValue(prjMarker, ConfigurationConstants.ENABLED_VALIDATORS);
-			ValidatorMetaData[] enabledVal = null;
-			if (enabledValStr == null) {
-				enabledVal = gp.getEnabledValidators();
-			} else {
-				enabledVal = getStringAsEnabledElementsArray(enabledValStr);
-			}
-			setEnabledValidators(enabledVal);
-
-			String version = loadVersion(marker); // In 4.03, every project had its own validators &
-			// auto-validate settings.
-			Boolean boolVal = (Boolean) getValue(prjMarker, ConfigurationConstants.PRJ_OVERRIDEGLOBAL);
-			if ((boolVal == null) && (version.equals(ConfigurationConstants.VERSION4_03))) {
-				// Different default for 4.03. In 4.03, all projects overrode the global, because
-				// the
-				// global preferences didn't exist.
-				setDoesProjectOverride(true);
-			} else if (boolVal == null) {
-				setDoesProjectOverride(getDoesProjectOverrideDefault());
-			} else {
-				setDoesProjectOverride(boolVal.booleanValue());
-			}
-			boolean override = doesProjectOverride();
-
-
-			boolVal = (Boolean) getValue(prjMarker, ConfigurationConstants.AUTO_SETTING);
-			if ((boolVal == null) || (!override)) {
-				setAutoValidate(gp.isAutoValidate());
-			} else {
-				setAutoValidate(boolVal.booleanValue());
-			}
-
-			boolVal = (Boolean) getValue(prjMarker, ConfigurationConstants.BUILD_SETTING);
-			if ((boolVal == null) || (!override)) {
-				setBuildValidate(gp.isBuildValidate());
-			} else {
-				setBuildValidate(boolVal.booleanValue());
-			}
-
-			Integer intVal = (Integer) getValue(prjMarker, ConfigurationConstants.MAXNUMMESSAGES);
-			if ((intVal == null) || (!override)) {
-				setMaximumNumberOfMessages(gp.getMaximumNumberOfMessages());
-			} else {
-				setMaximumNumberOfMessages(intVal.intValue());
-			}
-
-			getResource().getWorkspace().deleteMarkers(marker);
-		} catch (CoreException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("ProjectConfiguration.loadMarker "); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("ProjectConfiguration.loadMarker InvocationTargetException"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-		}
-	}
-
-	protected void copyTo(ProjectConfiguration prjp) throws InvocationTargetException {
-		super.copyTo(prjp);
-
-		// Need to have a distinct method for this child class (i.e., the parameter
-		// is not a ValidationConfiguration) because if this initialization is
-		// called as part of ValidationConfiguration's constructor, then the value of
-		// this field is overwritten. Fields of this class are initialized to the
-		// default after the ValidationConfiguration parent is created.
-		prjp.setDoesProjectOverride(doesProjectOverride());
-	}
-
-	public static boolean getDoesProjectOverrideDefault() {
-		return PRJ_OVERRIDEGLOBAL_DEFAULT;
-	}
-
-	/**
-	 * Return true if the enabled validators have not changed since this ValidationConfiguration was
-	 * constructed, false otherwise. (This method is needed for the Properties and Preference pages;
-	 * if the list of validators hasn't changed, then there is no need to update the task list;
-	 * updating the task list is a costly operation.)
-	 * 
-	 * The "allow" parameter represents whether or not the global "allow projects to override" has
-	 * been changed: - TRUE means that the preference "allow" parameter has been changed - FALSE
-	 * means that the preference "allow" paramter has not been changed
-	 */
-	public boolean hasEnabledValidatorsChanged(ValidatorMetaData[] oldEnabledVmd, boolean allow) throws InvocationTargetException {
-		// First check the obvious: is every enabled validator still enabled, and is
-		// the number of enabled validators the same as it was before? If not, return true.
-		if (super.hasEnabledValidatorsChanged(oldEnabledVmd)) {
-			return true;
-		}
-
-
-		// If the global preference validators have changed, does the task list need to be updated?
-		// PREF | PROJ | UPDATE
-		// ALLOW | OVERRIDE | TASK LIST
-		//------------------------------
-		//     0 | 0 | 1
-		//     0 | 1 | 1
-		//     1 | 0 | 1
-		//     1 | 1 | 0
-		//
-		// If the global "allow" preference changes from "allow" to "don't allow", or vice versa,
-		// and the project overrides the preferences, and the validators differ between the project
-		// and the preferences, then the task list must be updated.
-		if (allow) {
-			// "allow" has changed, so see if the preference and the project validators match.
-			ValidatorMetaData[] projEnabledVmd = super.getEnabledValidators(); // bypass the check
-			// for whether the
-			// global preferences
-			// are to be used or
-			// not
-			GlobalConfiguration gp = ConfigurationManager.getManager().getGlobalConfiguration();
-			return gp.hasEnabledValidatorsChanged(projEnabledVmd);
-		}
-
-		return false;
-	}
-
-
-	/**
-	 * @see org.eclipse.wst.validation.internal.operations.internal.attribute.ValidationConfiguration#deserialize(String)
-	 */
-	public void deserialize(String storedConfiguration) throws InvocationTargetException {
-		if (storedConfiguration == null) {
-			resetToDefault();
-		} else if (storedConfiguration != null) {
-			int prjOverrideIndex = storedConfiguration.indexOf(ConfigurationConstants.PRJ_OVERRIDEGLOBAL);
-			int autoIndex = storedConfiguration.indexOf(ConfigurationConstants.AUTO_SETTING);
-
-			String prjOverride = null;
-			if (autoIndex < 0) {
-				// project doesn't override the global
-				prjOverride = storedConfiguration.substring(prjOverrideIndex + ConfigurationConstants.PRJ_OVERRIDEGLOBAL.length());
-			} else {
-				// project overrides the global, so retrieve the values
-				super.deserialize(storedConfiguration);
-				prjOverride = storedConfiguration.substring(prjOverrideIndex + ConfigurationConstants.PRJ_OVERRIDEGLOBAL.length(), autoIndex);
-			}
-			setDoesProjectOverride(Boolean.valueOf(prjOverride).booleanValue());
-		}
-	}
-
-	/**
-	 * @see org.eclipse.wst.validation.internal.operations.internal.attribute.ValidationConfiguration#serialize()
-	 */
-	public String serialize() throws InvocationTargetException {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append(ConfigurationConstants.PRJ_OVERRIDEGLOBAL);
-		buffer.append(String.valueOf(doesProjectOverride()));
-		if (doesProjectOverride()) {
-			// Store common values for the Project configuration only if they differ from the global
-			buffer.append(super.serialize());
-		}
-		return buffer.toString();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.validation.internal.operations.internal.attribute.ValidationConfiguration#getEnabledFullBuildValidators(boolean)
-	 */
-	public ValidatorMetaData[] getEnabledFullBuildValidators(boolean fullBuild) throws InvocationTargetException {
-		if (useGlobalPreference()) {
-			return extractProjectValidators(ConfigurationManager.getManager().getGlobalConfiguration().getEnabledFullBuildValidators(fullBuild), getResource());
-		}
-		return super.getEnabledFullBuildValidators(fullBuild);
-	}
-
-	/**
-	 * Given a set of validators, usually the global preference set, change the set so that it
-	 * contains only the validators configured on this project.
-	 */
-	private static ValidatorMetaData[] extractProjectValidators(ValidatorMetaData[] vmds, IResource resource, boolean onlyReferenced) {
-		ValidationRegistryReader reader = ValidationRegistryReader.getReader();
-		int length = (vmds == null) ? 0 : vmds.length;
-		ValidatorMetaData[] temp = new ValidatorMetaData[length];
-		if (length == 0) {
-			return temp;
-		}
-
-		int count = 0;
-		IProject project = (IProject) resource;
-		for (int i = 0; i < vmds.length; i++) {
-			ValidatorMetaData vmd = vmds[i];
-			if (reader.isConfiguredOnProject(vmd, project)) {
-				if (!onlyReferenced || vmd.isDependentValidator())
-					temp[count++] = vmd;
-			}
-		}
-
-		ValidatorMetaData[] result = new ValidatorMetaData[count];
-		System.arraycopy(temp, 0, result, 0, count);
-		temp = null;
-
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.validation.internal.operations.internal.attribute.ValidationConfiguration#getEnabledFullBuildValidators(boolean)
-	 */
-	public ValidatorMetaData[] getEnabledFullBuildValidators(boolean fullBuild, boolean onlyReferenced) throws InvocationTargetException {
-		if (useGlobalPreference()) {
-			return extractProjectValidators(ConfigurationManager.getManager().getGlobalConfiguration().getEnabledFullBuildValidators(fullBuild), getResource(), onlyReferenced);
-		}
-		return super.getEnabledFullBuildValidators(fullBuild, onlyReferenced);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.validation.internal.operations.internal.attribute.ValidationConfiguration#getIncrementalValidators()
-	 */
-	public ValidatorMetaData[] getIncrementalValidators() throws InvocationTargetException {
-		if (useGlobalPreference()) {
-			return extractProjectValidators(ConfigurationManager.getManager().getGlobalConfiguration().getIncrementalValidators(), getResource());
-		}
-		return super.getIncrementalValidators();
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ReferencialFileValidatorExtension.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ReferencialFileValidatorExtension.java
deleted file mode 100644
index 9927fd4..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ReferencialFileValidatorExtension.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on May 3, 2004
- *
- * To change the template for this generated file go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-package org.eclipse.wst.validation.internal;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.validation.internal.operations.ReferencialFileValidator;
-
-/**
- * @author vijayb
- * 
- * To change the template for this generated type comment go to Window - Preferences - Java - Code
- * Generation - Code and Comments
- */
-public class ReferencialFileValidatorExtension {
-	private String id = null;
-	private ReferencialFileValidator instance;
-	private boolean errorCondition = false;
-	private IConfigurationElement element;
-	public static final String REF_FILE_VALIDATOR_EXTENSION = "referencialFileValidator"; //$NON-NLS-1$
-	public static final String RUN = "run"; //$NON-NLS-1$
-	public static final String ATT_ID = "id"; //$NON-NLS-1$
-	public static final String ATT_CLASS = "class"; //$NON-NLS-1$
-
-	/**
-	 *  
-	 */
-	public ReferencialFileValidatorExtension() {
-		super();
-	}
-
-	public ReferencialFileValidator getInstance() {
-		try {
-			if (instance == null && !errorCondition)
-				instance = (ReferencialFileValidator) element.createExecutableExtension("run"); //$NON-NLS-1$
-		} catch (Throwable e) {
-			Logger.getLogger().logError(e);
-			errorCondition = true;
-		}
-		return instance;
-	}
-
-	public ReferencialFileValidatorExtension(IConfigurationElement element) {
-		if(!REF_FILE_VALIDATOR_EXTENSION.equals(element.getName()))
-			throw new IllegalArgumentException("Extensions must be of the type \"" + REF_FILE_VALIDATOR_EXTENSION + "\"."); //$NON-NLS-1$ //$NON-NLS-2$
-		this.element = element;
-		init();
-	}
-
-	private void init() {
-		this.id = this.element.getAttribute(ATT_ID);
-	}
-
-	/**
-	 * @return Returns the id.
-	 */
-	public String getId() {
-		return id;
-	}
-	
-	public IConfigurationElement getElement() {
-		return element;
-	}
-
-	/**
-	 * @param id
-	 *            The id to set.
-	 */
-	public void setId(String id) {
-		this.id = id;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ReferencialFileValidatorRegistryReader.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ReferencialFileValidatorRegistryReader.java
deleted file mode 100644
index 59f803a..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ReferencialFileValidatorRegistryReader.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on May 3, 2004
- *
- * To change the template for this generated file go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-package org.eclipse.wst.validation.internal;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jem.util.RegistryReader;
-import org.eclipse.wst.validation.internal.operations.ReferencialFileValidator;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-
-/**
- * @author vijayb
- * 
- * To change the template for this generated type comment go to Window - Preferences - Java - Code
- * Generation - Code and Comments
- */
-public class ReferencialFileValidatorRegistryReader extends RegistryReader {
-	static ReferencialFileValidatorRegistryReader instance = null;
-	protected List referencialFileValidationExtensions;
-
-	/**
-	 * @param arg0
-	 * @param arg1
-	 * @param arg2
-	 */
-	public ReferencialFileValidatorRegistryReader() {
-		super(ValidationPlugin.PLUGIN_ID, "referencialFileValidator"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.RegistryReader#readElement(org.eclipse.core.runtime.IConfigurationElement)
-	 */
-	public boolean readElement(IConfigurationElement element) {
-		if (ReferencialFileValidatorExtension.REF_FILE_VALIDATOR_EXTENSION.equals(element.getName())) {
-			addExtension(element);
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Sets the extension point.
-	 * 
-	 * @param extensions
-	 *            The extensions to set
-	 */
-	protected void addExtension(IConfigurationElement newExtension) {
-
-    	//add to the list of post validator extesions only if the ext is not added yet
-    	boolean containsExt = true;
-    	List extensions = getReferencialFileValidationExtensions();
-    	Iterator it = extensions.iterator();
-    	while(it.hasNext()) {
-    		ReferencialFileValidatorExtension ext = (ReferencialFileValidatorExtension)it.next();
-    		if(!ext.getElement().getAttribute("id").equals(newExtension.getAttribute("id")))
-    			containsExt = false;
-    	}
-    	if(!containsExt ||getReferencialFileValidationExtensions().isEmpty())
-    		getReferencialFileValidationExtensions().add(new ReferencialFileValidatorExtension(newExtension));
-    
-		getReferencialFileValidationExtensions().add(new ReferencialFileValidatorExtension(newExtension));
-	}
-
-	/**
-	 * Sets the extension point.
-	 * 
-	 * @param extensions
-	 *            The extensions to set
-	 */
-	protected void addExtensionPoint(ReferencialFileValidatorExtension newExtension) {
-		if (referencialFileValidationExtensions == null)
-			referencialFileValidationExtensions = new ArrayList();
-		referencialFileValidationExtensions.add(newExtension);
-	}
-
-	/**
-	 * @return the appropriate handler for the project based on priorities of those which are
-	 *         available and enabled
-	 */
-	public ReferencialFileValidator getReferencialFileValidator() {
-		ReferencialFileValidatorExtension refFileValExt;
-		for (Iterator refFileValItr = getReferencialFileValidationExtensions().iterator(); refFileValItr.hasNext();) {
-			refFileValExt = (ReferencialFileValidatorExtension) refFileValItr.next();
-			return refFileValExt.getInstance();
-		}
-		return null;
-	}
-
-	/**
-	 * Gets the instance.
-	 * 
-	 * @return Returns a EJBCodegenHandlerExtensionReader
-	 */
-	public static ReferencialFileValidatorRegistryReader getInstance() {
-		if (instance == null) {
-			instance = new ReferencialFileValidatorRegistryReader();
-			instance.readRegistry();
-		}
-		return instance;
-	}
-
-	/**
-	 * @return Returns the handlerExtensions.
-	 */
-	protected List getReferencialFileValidationExtensions() {
-		if (referencialFileValidationExtensions == null)
-			referencialFileValidationExtensions = new ArrayList();
-		return referencialFileValidationExtensions;
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/RegistryConstants.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/RegistryConstants.java
deleted file mode 100644
index aba5d1c..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/RegistryConstants.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal;
-
-
-import org.eclipse.wst.validation.internal.operations.IRuleGroup;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-
-
-/**
- * Validation constants needed to declare an extension point, and to implement an extension.
- */
-public interface RegistryConstants {
-	public static final String PLUGIN_ID = ValidationPlugin.PLUGIN_ID;
-	public static final String VALIDATOR_EXT_PT_ID = "validator"; //$NON-NLS-1$ // extension point declaration of the validator
-
-	/* package */static final String TAG_RUN_CLASS = "run"; //$NON-NLS-1$ // identifies the Validator class
-	/* package */static final String TAG_FILTER = "filter"; //$NON-NLS-1$ // identifies a filter -- type and/or name -- used to filter out resources which are not to be validated. (i.e., if the resource doesn't pass this filter test, don't validate it.)
-	/* package */static final String TAG_HELPER_CLASS = "helper"; //$NON-NLS-1$ // IValidationContext which loads the MOF model for the IValidator
-	/* package */static final String TAG_PROJECT_NATURE = "projectNature"; //$NON-NLS-1$ // identifies the projects which the validator should run on
-	/* package */static final String TAG_AGGREGATE_VALIDATORS = "aggregateValidator"; //$NON-NLS-1$ // identifies a validator(s) which this validator aggregates. This value is used to remove all messages owned by a particular validator. Aggregate validators cannot be shared. Only one validator may use an aggregate of that type.
-
-	/* package */static final String ATT_OBJECT_CLASS = "objectClass"; //$NON-NLS-1$ // identifies a type
-	/* package */static final String ATT_NAME_FILTER = "nameFilter"; //$NON-NLS-1$ // identifies a name (may include the '*' wildcard anywhere in the name)
-	/* package */static final String ATT_ID = "id"; //$NON-NLS-1$ // identifies a unique id to filter on
-	/* package */static final String ATT_CLASS = "class"; //$NON-NLS-1$ // identifies a class name of a tag, e.g. "helper class", or "run class"
-	/* package */static final String ATT_ACTION_FILTER = "action"; //$NON-NLS-1$ // identifies the incremental validation actions for which a resource should be filtered in
-	/* package */static final String ATT_INCREMENTAL = "incremental"; //$NON-NLS-1$ // identifies whether or not the validator supports incremental build validation. Default is true (i.e., incremental builds are supported).
-	/* package */static final boolean ATT_INCREMENTAL_DEFAULT = true; // The incremental default.
-	/* package */static final String ATT_FULLBUILD = "fullBuild"; //$NON-NLS-1$ // identifies whether or not the validator supports full build validation. Default is true (i.e., full build validation is supported).
-	/* package */static final boolean ATT_FULLBUILD_DEFAULT = true; // The build default.
-	/* package */static final String ATT_ENABLED = "enabled"; //$NON-NLS-1$ // identifies whether or not the validator is enabled by default. Default is "true" (enabled).
-	/* package */static final boolean ATT_ENABLED_DEFAULT = true; // The "enabled" default.
-	/* package */static final String ATT_INCLUDE = "include"; //$NON-NLS-1$ // Include projects with this nature
-	/* package */static final boolean ATT_INCLUDE_DEFAULT = true; // By default, if "include" is not
-	// specified in the projectNature
-	// element, then assume that the
-	// nature is included.
-	/* package */static final String ATT_RULE_GROUP = "ruleGroup"; //$NON-NLS-1$ // identifies the different validation passes which this validator recognizes. The values are identified in IRuleGroup.
-	/* package */static final int ATT_RULE_GROUP_DEFAULT = IRuleGroup.PASS_FAST; // the default pass
-	// includes only the
-	// FAST PASS. FULL
-	// can be invoked
-	// only explicitly by
-	// an operation.
-	/* package */static final String ATT_CASE_SENSITIVE = "caseSensitive"; //$NON-NLS-1$
-	/* package */static final String ATT_ASYNC = "async"; //$NON-NLS-1$ // Is the validator thread-safe? 
-	/* package */static final boolean ATT_ASYNC_DEFAULT = false; // The "can validator run
-	// asynchronously" default. Initially
-	// set to false, but in future this
-	// will be changed to true.
-
-
-	/* package */static final String TAG_MIGRATE = "migrate"; //$NON-NLS-1$ // the "migrate" section of the validator
-	/* package */static final String TAG_VALIDATOR = "validator"; //$NON-NLS-1$ // the "validator" element of the "migrate" section
-	/* package */static final String ATT_FROM = "from"; //$NON-NLS-1$ // the fully-qualified class name of the former validator class
-	/* package */static final String ATT_TO = "to"; //$NON-NLS-1$ // the fully-qualified class name of the current validator class
-	static final String DEP_VALIDATOR = "dependentValidator"; //$NON-NLS-1$
-	static final String DEP_VAL_VALUE = "depValValue"; //$NON-NLS-1$
-	static final String MARKER_ID = "markerId"; //$NON-NLS-1$
-	static final String MARKER_ID_VALUE = "markerIdValue"; //$NON-NLS-1$
-	static final boolean DEP_VAL_VALUE_DEFAULT = false;
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ResourceConstants.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ResourceConstants.java
deleted file mode 100644
index 7d7ba30..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ResourceConstants.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal;
-
-
-
-/**
- * Constants used to access the string resources associated with the plugin.
- * 
- * See the plugin.properties file, in the plugin's directory, for the contents of the strings.
- */
-public interface ResourceConstants {
-	// A marker cannot be added to the task list.
-	public static final String VBF_EXC_CANNOT_ADD_MARKER = "VBF_EXC_CANNOT_ADD_MARKER"; //$NON-NLS-1$ 
-
-	// A marker cannot be removed from the task list.
-	public static final String VBF_EXC_CANNOT_REMOVE_MARKER = "VBF_EXC_CANNOT_REMOVE_MARKER"; //$NON-NLS-1$ 
-
-	// Internal error has occurred.
-	public static final String VBF_EXC_INTERNAL = "VBF_EXC_INTERNAL"; //$NON-NLS-1$ 
-
-	// If the validator cannot be loaded because it didn't specify a helper
-	public static final String VBF_EXC_HELPER_MISSING = "VBF_EXC_HELPER_MISSING"; //$NON-NLS-1$ 
-
-	// If the validator cannot be loaded because its helper cannot be loaded
-	public static final String VBF_EXC_HELPER_CANNOTLOAD = "VBF_EXC_HELPER_CANNOTLOAD"; //$NON-NLS-1$ 
-
-	// A java.lang.Runtime error has occured during the build.
-	public static final String VBF_EXC_RUNTIME = "VBF_EXC_RUNTIME"; //$NON-NLS-1$ 
-
-	// If the "Validator" extension point has been removed from the plugin.xml file.
-	public static final String VBF_EXC_MISSING_VALIDATOR_EP = "VBF_EXC_MISSING_VALIDATOR_EP"; //$NON-NLS-1$ 
-
-	// If the user has specified an invalid type filter in their plugin.xml file.
-	// i.e., it isn't an instance of IResource.
-	public static final String VBF_EXC_INVALID_TYPE_FILTER = "VBF_EXC_INVALID_TYPE_FILTER"; //$NON-NLS-1$ 
-
-	// The validator extension has made a mistake in its plugin.xml's projectNature tag
-	public static final String VBF_EXC_MISSING_PROJECTNATURE_ID = "VBF_EXC_MISSING_PROJECTNATURE_ID"; //$NON-NLS-1$ 
-
-	// The validator extension has made a mistake in its plugin.xml's syntax.
-	public static final String VBF_EXC_VALIDATORNAME_IS_NULL = "VBF_EXC_VALIDATORNAME_IS_NULL"; //$NON-NLS-1$ 
-
-	// Title for the IProgressMonitor.
-	public static final String VBF_STATUS_PROGRESSMONITOR_TITLE = "VBF_STATUS_PROGRESSMONITOR_TITLE"; //$NON-NLS-1$ 
-
-	// Status line for the IProgressMonitor
-	public static final String VBF_STATUS_INITIALIZING = "VBF_STATUS_INITIALIZING"; //$NON-NLS-1$ 
-
-	// If the user has cancelled validation, each validator might have cleanup to do. This message
-	// is shown to tell the user which validator is being cleaned up at the moment.
-	public static final String VBF_STATUS_VALIDATOR_CLEANUP = "VBF_STATUS_VALIDATOR_CLEANUP"; //$NON-NLS-1$ 
-
-	// If the user cancelled validation, remove all of the validator's tasks from the task list, and
-	// put an entry saying that validation on {project} using {validator} was cancelled.
-	public static final String VBF_STATUS_VALIDATOR_TERMINATED = "VBF_STATUS_VALIDATOR_TERMINATED"; //$NON-NLS-1$ 
-
-	// Before a validator is begun, this message informs the user that validation, using a
-	// particular validator, has begun
-	public static final String VBF_STATUS_STARTING_VALIDATION = "VBF_STATUS_STARTING_VALIDATION"; //$NON-NLS-1$ 
-
-	// After a validator is finished, this message informs the user that validtaion, using a
-	// particular validator, has completed.
-	public static final String VBF_STATUS_ENDING_VALIDATION = "VBF_STATUS_ENDING_VALIDATION"; //$NON-NLS-1$ 
-
-	// If a validator throws an unchecked exception, this message is displayed to the user.
-	public static final String VBF_STATUS_ENDING_VALIDATION_ABNORMALLY = "VBF_STATUS_ENDING_VALIDATION_ABNORMALLY"; //$NON-NLS-1$ 
-
-	// If the build's getDelta(getProject()) method returns null, let the user know that a full
-	// validation will be performed because there's no delta information.
-	public static final String VBF_STATUS_NULL_DELTA = "VBF_STATUS_NULL_DELTA"; //$NON-NLS-1$ 
-
-	public static final String VBF_EXC_SYNTAX_NULL_NAME = "VBF_EXC_SYNTAX_NULL_NAME"; //$NON-NLS-1$ 
-	public static final String VBF_EXC_SYNTAX_NO_HELPER = "VBF_EXC_SYNTAX_NO_HELPER"; //$NON-NLS-1$ 
-	public static final String VBF_EXC_SYNTAX_NO_HELPER_CLASS = "VBF_EXC_SYNTAX_NO_HELPER_CLASS"; //$NON-NLS-1$ 
-	public static final String VBF_EXC_SYNTAX_NO_HELPER_THROWABLE = "VBF_EXC_SYNTAX_NO_HELPER_THROWABLE"; //$NON-NLS-1$ 
-	public static final String VBF_EXC_SYNTAX_NO_VAL_RUN = "VBF_EXC_SYNTAX_NO_VAL_RUN"; //$NON-NLS-1$ 
-	public static final String VBF_EXC_SYNTAX_NO_VAL_CLASS = "VBF_EXC_SYNTAX_NO_VAL_CLASS"; //$NON-NLS-1$ 
-	public static final String VBF_EXC_SYNTAX_NO_VAL_THROWABLE = "VBF_EXC_SYNTAX_NO_VAL_THROWABLE"; //$NON-NLS-1$ 
-	public static final String VBF_EXC_SYNTAX_NO_VAL_NULL = "VBF_EXC_SYNTAX_NO_VAL_NULL"; //$NON-NLS-1$ 
-	public static final String VBF_EXC_INVALID_RESOURCE = "VBF_EXC_INVALID_RESOURCE"; //$NON-NLS-1$ 
-
-	public static final String VBF_EXC_NULLCREATE = "VBF_EXC_NULLCREATE"; //$NON-NLS-1$ 
-	public static final String VBF_EXC_NULLSAVE = "VBF_EXC_NULLSAVE"; //$NON-NLS-1$ 
-	public static final String VBF_EXC_SAVE = "VBF_EXC_SAVE"; //$NON-NLS-1$ 
-	public static final String VBF_EXC_NULLRETRIEVE = "VBF_EXC_NULLRETRIEVE"; //$NON-NLS-1$ 
-	public static final String VBF_EXC_RETRIEVE = "VBF_EXC_RETRIEVE"; //$NON-NLS-1$ 
-
-	public static final String VBF_EXC_BADVMD = "VBF_EXC_BADVMD"; //$NON-NLS-1$ 
-	public static final String VBF_EXC_OPENPRJ = "VBF_EXC_OPENPRJ"; //$NON-NLS-1$ 
-	public static final String VBF_EXC_EXISTPRJ = "VBF_EXC_EXISTPRJ"; //$NON-NLS-1$ 
-	public static final String VBF_EXC_BADPRJ = "VBF_EXC_BADPRJ"; //$NON-NLS-1$ 
-	public static final String VBF_EXC_MULTIPRJ = "VBF_EXC_MULTIPRJ"; //$NON-NLS-1$ 
-	public static final String VBF_EXC_BADVAL = "VBF_EXC_BADVAL"; //$NON-NLS-1$ 
-
-	public static final String VBF_STATUS_START_REMOVING_OLD_MESSAGES = "VBF_STATUS_START_REMOVING_OLD_MESSAGES"; //$NON-NLS-1$ 
-	public static final String VBF_STATUS_FINISH_REMOVING_OLD_MESSAGES = "VBF_STATUS_FINISH_REMOVING_OLD_MESSAGES"; //$NON-NLS-1$ 
-
-	public static final String VBF_TASK_WARN_MESSAGE_LIMIT_VAL = "VBF_TASK_WARN_MESSAGE_LIMIT_VAL"; //$NON-NLS-1$ 
-
-	public static final String VBF_EXC_DISABLEV = "VBF_EXC_DISABLEV"; //$NON-NLS-1$ 
-	public static final String VBF_EXC_DISABLEH = "VBF_EXC_DISABLEH"; //$NON-NLS-1$ 
-	public static final String VBF_EXC_ORPHAN_IVALIDATOR = "VBF_EXC_ORPHAN_IVALIDATOR"; //$NON-NLS-1$ 
-
-	public static final String VBF_STATUS_LOOKING = "VBF_STATUS_LOOKING"; //$NON-NLS-1$ 
-	public static final String VBF_STATUS_LOOKINGDONE = "VBF_STATUS_LOOKINGDONE"; //$NON-NLS-1$ 
-	public static final String VBF_STATUS_REMOVING = "VBF_STATUS_REMOVING"; //$NON-NLS-1$ 
-	public static final String VBF_STATUS_REMOVINGDONE = "VBF_STATUS_REMOVINGDONE"; //$NON-NLS-1$ 
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ResourceHandler.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ResourceHandler.java
deleted file mode 100644
index 0cf1cd4..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ResourceHandler.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-import java.util.logging.Level;
-
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-
-
-/**
- * This class retrieves the Strings from the .properties file appropriate for the machine's Locale.
- * 
- *  
- */
-public class ResourceHandler {
-	//TODO Make this class final once the public ResourceHandler has been deleted.
-	private static ResourceBundle _bundle = null;
-
-	protected ResourceHandler() {
-		//TODO Make this method private once the public ResourceHandler has been deleted.
-		super();
-	}
-
-	/**
-	 * Return the resource bundle which contains the messages, as identified by
-	 */
-	public static ResourceBundle getBundle() {
-		if (_bundle == null) {
-			try {
-				_bundle = ResourceBundle.getBundle(ValidationPlugin.getBundleName());
-			} catch (MissingResourceException exc) {
-				_bundle = null;
-				Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-				if (logger.isLoggingLevel(Level.FINE)) {
-					LogEntry entry = ValidationPlugin.getLogEntry();
-					entry.setSourceID("org.eclipse.wst.validation.internal.operations.internal.ResourceHandler.getBundle()"); //$NON-NLS-1$
-					entry.setText("Cannot find bundle " + ValidationPlugin.getBundleName()); //$NON-NLS-1$
-					entry.setTargetException(exc);
-					logger.write(Level.FINE, entry);
-				}
-			}
-		}
-		return _bundle;
-	}
-
-	public static String getExternalizedMessage(String key) {
-		try {
-			ResourceBundle bundle = getBundle();
-			if (bundle == null) {
-				Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-				if (logger.isLoggingLevel(Level.FINE)) {
-					LogEntry entry = ValidationPlugin.getLogEntry();
-					entry.setSourceID("org.eclipse.wst.validation.internal.operations.internal.ResourceHandler.getExternalizedMessage(String)"); //$NON-NLS-1$
-					entry.setText("Resource bundle is null"); //$NON-NLS-1$
-					logger.write(Level.FINE, entry);
-				}
-				return key;
-			}
-
-			return bundle.getString(key);
-		} catch (NullPointerException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.FINE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("org.eclipse.wst.validation.internal.operations.ui.ResourceHandler.getExternalizedMessage(String)"); //$NON-NLS-1$
-				entry.setText("Cannot find message id " + key); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.FINE, entry);
-			}
-		}
-		return key;
-	}
-
-	public static String getExternalizedMessage(String key, String[] parms) {
-		String res = ""; //$NON-NLS-1$
-		try {
-			res = java.text.MessageFormat.format(getExternalizedMessage(key), parms);
-		} catch (MissingResourceException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.FINE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("org.eclipse.wst.validation.internal.operations.internal.ResourceHandler.getExternalizedMessage(String, String[])"); //$NON-NLS-1$
-				entry.setText("Cannot find message id " + key); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.FINE, entry);
-			}
-		} catch (NullPointerException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.FINE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("org.eclipse.wst.validation.internal.operations.internal.ResourceHandler.getExternalizedMessage(String, String[])"); //$NON-NLS-1$
-				entry.setText("Cannot format message id " + key + " with " + parms.length + " parameters."); //$NON-NLS-1$  //$NON-NLS-2$  //$NON-NLS-3$
-				entry.setTargetException(exc);
-				logger.write(Level.FINE, entry);
-			}
-		}
-		return res;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/TaskListUtility.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/TaskListUtility.java
deleted file mode 100644
index cdbf991..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/TaskListUtility.java
+++ /dev/null
@@ -1,571 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal;
-
-import java.util.Map;
-import java.util.logging.Level;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-
-/**
- * This class must be called only by the validation framework.
- * 
- * This singleton interacts with the eclipse workbench's Task list. TaskListUtility adds and removes
- * tasks from the list.
- * 
- * This class must not be called outside of an IWorkspaceRunnable or IRunnableWithProgress. Many
- * resource deltas can be generated by the methods in this class.
- */
-public class TaskListUtility implements ConfigurationConstants {
-	protected static final int DEPTH_INFINITE = IResource.DEPTH_INFINITE;
-	protected static final int DEPTH_ZERO = IResource.DEPTH_ZERO;
-	protected static final String VALIDATION_MARKER_TARGETOBJECT = "targetObject"; //$NON-NLS-1$
-	private final static IMarker[] NO_MARKERS = new IMarker[0];
-
-	public static IWorkspaceRoot getRoot() {
-		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-		return root;
-	}
-
-	/**
-	 * This method is here for use by the SABER validator's reporter instance ONLY. Do not use. See
-	 * defect 260144 for details.
-	 */
-	public static IMarker setPriority(IMarker item, int priority) throws CoreException {
-		Map attrib = item.getAttributes();
-		attrib.put(IMarker.PRIORITY, new Integer(priority));
-		item.setAttributes(attrib);
-		return item;
-	}
-	
-	/**
-	 * This method adds a message to a resource in the task list.
-	 */
-	public static IMarker addTask(String pluginId, IResource resource, String location, String messageId, String message, int markerType, String markerName, String targetObjectName, String groupName, int offset, int length) throws CoreException {
-		if ((message == null) || (resource == null)) {
-			return null;
-		}
-
-		int severity = getSeverity(markerType);
-
-		// Allow duplicate entries in the task list.
-		// Prior to a full validation, the validation framework will remove all messages owned
-		// by a validator before it is executed.
-		// Prior to an incremental validation, the validation framework will remove all messages,
-		// on each of the changed resources, owned by a validator before it is invoked.
-		// 
-		// It is up to the validator to make sure that it is not adding the same message
-		// in more than one place, and also to clear out any old messages which are not cleared
-		// by the validation framework.
-		IMarker item = null;
-		if(markerName != null && markerName.length() >0 )
-			 item = resource.createMarker(markerName); // add a validation marker
-		else
-		     item = resource.createMarker(VALIDATION_MARKER); // add a validation marker
-
-		// For performance reasons, replace the multiple setAttribute
-		// calls above with a single setAttributes call.
-		boolean offsetSet = ((offset != IMessage.OFFSET_UNSET) && (length != IMessage.OFFSET_UNSET));
-		int size = (offsetSet) ? 10 : 8; // add CHAR_START, CHAR_END only if the offset is set. If
-		// the offset is set, it takes precendence over the line
-		// number. (eclipse's rule, not mine.)
-		String[] attribNames = new String[size];
-		Object[] attribValues = new Object[size];
-
-		// Very first thing, add the owner. That way, if the code dies
-		// before things are persisted, hopefully this marker will be persisted.
-		// Hopefully, eclipse WILL persist this field, as requested.
-		attribNames[0] = VALIDATION_MARKER_OWNER;
-		attribValues[0] = pluginId;
-		attribNames[1] = VALIDATION_MARKER_SEVERITY; // this validation severity is stored, in
-		// addition to the marker severity, to enable
-		// more than one severity of message to be
-		// displayed. e.g. ERROR | WARNING (using
-		// binary OR). The IMarker constants are
-		// regular decimal constants.
-		attribValues[1] = new Integer(markerType);
-		attribNames[2] = VALIDATION_MARKER_TARGETOBJECT; // to distinguish between messages which
-		// are registered on an IResource, but
-		// against different target objects
-		attribValues[2] = ((targetObjectName == null) ? "" : targetObjectName); //$NON-NLS-1$
-		attribNames[3] = VALIDATION_MARKER_GROUP;
-		attribValues[3] = ((groupName == null) ? "" : groupName); //$NON-NLS-1$
-		attribNames[4] = IMarker.MESSAGE;
-		attribValues[4] = message;
-		attribNames[5] = VALIDATION_MARKER_MESSAGEID;
-		attribValues[5] = messageId;
-
-		attribNames[6] = IMarker.SEVERITY; // IMarker.SEVERITY_ERROR, IMarker.SEVERITY_WARNING,
-		// IMarker.SEVERITY_INFO
-		attribValues[6] = new Integer(severity);
-		try {
-			// If the location is a line number, store it as a line number
-			Integer lineNumber = Integer.valueOf(location);
-			attribNames[7] = IMarker.LINE_NUMBER;
-			attribValues[7] = lineNumber;
-		} catch (NumberFormatException exc) {
-			// Otherwise, store it as a text location
-			attribNames[7] = IMarker.LOCATION;
-			attribValues[7] = location;
-		}
-
-		if (offsetSet) {
-			attribNames[8] = IMarker.CHAR_START;
-			attribValues[8] = new Integer(offset);
-			attribNames[9] = IMarker.CHAR_END;
-			attribValues[9] = new Integer(offset + length);
-		}
-
-		item.setAttributes(attribNames, attribValues);
-
-		return item;
-	}
-
-	/**
-	 * This method adds a message to a resource in the task list.
-	 */
-	public static IMarker addTask(String pluginId, IResource resource, String location, String messageId, String message, int markerType, String targetObjectName, String groupName, int offset, int length) throws CoreException {
-		if ((message == null) || (resource == null)) {
-			return null;
-		}
-
-		int severity = getSeverity(markerType);
-
-		// Allow duplicate entries in the task list.
-		// Prior to a full validation, the validation framework will remove all messages owned
-		// by a validator before it is executed.
-		// Prior to an incremental validation, the validation framework will remove all messages,
-		// on each of the changed resources, owned by a validator before it is invoked.
-		// 
-		// It is up to the validator to make sure that it is not adding the same message
-		// in more than one place, and also to clear out any old messages which are not cleared
-		// by the validation framework.
-		IMarker item = resource.createMarker(VALIDATION_MARKER); // add a validation marker
-
-		// For performance reasons, replace the multiple setAttribute
-		// calls above with a single setAttributes call.
-		boolean offsetSet = ((offset != IMessage.OFFSET_UNSET) && (length != IMessage.OFFSET_UNSET));
-		int size = (offsetSet) ? 10 : 8; // add CHAR_START, CHAR_END only if the offset is set. If
-		// the offset is set, it takes precendence over the line
-		// number. (eclipse's rule, not mine.)
-		String[] attribNames = new String[size];
-		Object[] attribValues = new Object[size];
-
-		// Very first thing, add the owner. That way, if the code dies
-		// before things are persisted, hopefully this marker will be persisted.
-		// Hopefully, eclipse WILL persist this field, as requested.
-		attribNames[0] = VALIDATION_MARKER_OWNER;
-		attribValues[0] = pluginId;
-		attribNames[1] = VALIDATION_MARKER_SEVERITY; // this validation severity is stored, in
-		// addition to the marker severity, to enable
-		// more than one severity of message to be
-		// displayed. e.g. ERROR | WARNING (using
-		// binary OR). The IMarker constants are
-		// regular decimal constants.
-		attribValues[1] = new Integer(markerType);
-		attribNames[2] = VALIDATION_MARKER_TARGETOBJECT; // to distinguish between messages which
-		// are registered on an IResource, but
-		// against different target objects
-		attribValues[2] = ((targetObjectName == null) ? "" : targetObjectName); //$NON-NLS-1$
-		attribNames[3] = VALIDATION_MARKER_GROUP;
-		attribValues[3] = ((groupName == null) ? "" : groupName); //$NON-NLS-1$
-		attribNames[4] = IMarker.MESSAGE;
-		attribValues[4] = message;
-		attribNames[5] = VALIDATION_MARKER_MESSAGEID;
-		attribValues[5] = messageId;
-
-		attribNames[6] = IMarker.SEVERITY; // IMarker.SEVERITY_ERROR, IMarker.SEVERITY_WARNING,
-		// IMarker.SEVERITY_INFO
-		attribValues[6] = new Integer(severity);
-		try {
-			// If the location is a line number, store it as a line number
-			Integer lineNumber = Integer.valueOf(location);
-			attribNames[7] = IMarker.LINE_NUMBER;
-			attribValues[7] = lineNumber;
-		} catch (NumberFormatException exc) {
-			// Otherwise, store it as a text location
-			attribNames[7] = IMarker.LOCATION;
-			attribValues[7] = location;
-		}
-
-		if (offsetSet) {
-			attribNames[8] = IMarker.CHAR_START;
-			attribValues[8] = new Integer(offset);
-			attribNames[9] = IMarker.CHAR_END;
-			attribValues[9] = new Integer(offset + length);
-		}
-
-		item.setAttributes(attribNames, attribValues);
-
-		return item;
-	}
-
-	/**
-	 * Given one of the SeverityEnum severities, return the IMarker severity int that is its
-	 * equivalent.
-	 * 
-	 * This method was made public for the SaberReporter. No one other than TaskListUtility, or the
-	 * SaberReporter, should use this method!
-	 *  
-	 */
-	private static int getSeverity(int severityEnumValue) {
-		switch (severityEnumValue) {
-			case (IMessage.HIGH_SEVERITY) : {
-				return IMarker.SEVERITY_ERROR;
-			}
-
-			case (IMessage.LOW_SEVERITY) : {
-				return IMarker.SEVERITY_INFO;
-			}
-
-			case (IMessage.NORMAL_SEVERITY) : {
-				return IMarker.SEVERITY_WARNING;
-			}
-
-			case (IMessage.ALL_MESSAGES) :
-			case (IMessage.ERROR_AND_WARNING) :
-			default : {
-				// assume it's a warning.
-				return IMarker.SEVERITY_WARNING;
-			}
-		}
-	}
-
-	private static int getDepth(IResource resource) {
-		if (resource instanceof IProject) {
-			return DEPTH_INFINITE; // DEPTH_INFINITE means get this project's markers, and the
-			// markers belonging to the project's children.
-		} else if (resource instanceof IWorkspaceRoot) {
-			// Needed for the ValidationMigrator when it checks for orphan tasks.
-			return DEPTH_INFINITE; // DEPTH_INFINITE means get all of the markers in the workspace
-		}
-
-		return DEPTH_ZERO; // DEPTH_ZERO means just this resource, not its children
-	}
-
-	public static IMarker[] getValidationTasks(int severity, IProject project) {
-		// DEPTH_INFINITE means get this project's markers, and the markers
-		// belonging to the project's children.
-		return getValidationTasks(project, severity);
-	}
-
-	public static IMarker[] getValidationTasks(IResource resource, int severity) {
-		return getValidationTasks(resource, severity, getDepth(resource));
-	}
-
-	/**
-	 * Return true if the marker is owned by the ownerId.
-	 */
-	public static boolean isOwner(IMarker marker, String ownerId) {
-		try {
-			Object owner = marker.getAttribute(VALIDATION_MARKER_OWNER);
-			if ((owner == null) || !(owner instanceof String)) {
-				// The ValidationMigrator will remove any "unowned" validation markers.
-				return false;
-			}
-
-			return ((String) owner).equals(ownerId);
-		} catch (CoreException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("TaskListUtility.isOwner(IMarker, ownerId)"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-			return false;
-		}
-	}
-
-	private static IMarker[] getValidationTasks(IResource resource, int severity, int depth) {
-		IMarker[] tempMarkers = null;
-		int validCount = 0;
-		try {
-			IMarker[] allMarkers = null;
-			try {
-				allMarkers = resource.findMarkers(VALIDATION_MARKER, true, depth); // false means
-				// only consider
-				// PROBLEM_MARKER,
-				// not variants
-				// of
-				// PROBLEM_MARKER.
-				// Since addTask
-				// only adds
-				// PROBLEM_MARKER,
-				// we don't need
-				// to consider
-				// its subtypes.
-			} catch (CoreException exc) {
-				Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-				if (logger.isLoggingLevel(Level.SEVERE)) {
-					LogEntry entry = ValidationPlugin.getLogEntry();
-					entry.setSourceID("TaskListUtility.getValidationTasks(IResource, int)"); //$NON-NLS-1$
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-				return NO_MARKERS;
-			}
-
-			// Now filter in the markers, based on severity type.
-			if (allMarkers.length != 0) {
-				tempMarkers = new IMarker[allMarkers.length];
-				for (int i = 0; i < allMarkers.length; i++) {
-					IMarker marker = allMarkers[i];
-					Integer filterSeverity = (Integer) marker.getAttribute(VALIDATION_MARKER_SEVERITY);
-					if (filterSeverity == null) {
-						// odd...marker wasn't created correctly. How could this happen?
-						// Default to the current severity and add it to the list.
-						try {
-							marker.setAttribute(IMarker.SEVERITY, getSeverity(severity));
-						} catch (CoreException exc) {
-							Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-							if (logger.isLoggingLevel(Level.SEVERE)) {
-								LogEntry entry = ValidationPlugin.getLogEntry();
-								entry.setSourceID("TaskListUtility.getValidationTasks(int, IResource, int)"); //$NON-NLS-1$
-								entry.setTargetException(exc);
-								logger.write(Level.SEVERE, entry);
-							}
-							continue;
-						} catch (Throwable exc) {
-							Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-							if (logger.isLoggingLevel(Level.SEVERE)) {
-								LogEntry entry = ValidationPlugin.getLogEntry();
-								entry.setSourceID("TaskListUtility.getValidationTasks(int, IResource, int)"); //$NON-NLS-1$
-								entry.setTargetException(exc);
-								logger.write(Level.SEVERE, entry);
-							}
-							continue;
-						}
-					} else if ((severity & filterSeverity.intValue()) == 0) {
-						continue;
-					}
-					tempMarkers[validCount++] = marker;
-				}
-			}
-		} catch (CoreException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("TaskListUtility.getValidationTasks(int, IResource, int)"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-		}
-
-		if (validCount == 0) {
-			return NO_MARKERS;
-		}
-
-		IMarker[] validMarkers = new IMarker[validCount];
-		System.arraycopy(tempMarkers, 0, validMarkers, 0, validCount);
-		return validMarkers;
-	}
-
-	public static IMarker[] getValidationTasks(IResource resource, String messageOwner) {
-		return getValidationTasks(resource, new String[]{messageOwner}, getDepth(resource));
-	}
-
-	public static IMarker[] getValidationTasks(IResource resource, String[] messageOwners) {
-		return getValidationTasks(resource, messageOwners, getDepth(resource));
-	}
-
-	private static IMarker[] getValidationTasks(IResource resource, String[] messageOwners, int depth) {
-		IMarker[] markers = getValidationTasks(resource, IMessage.ALL_MESSAGES, depth);
-		if (markers.length == 0) {
-			return NO_MARKERS;
-		}
-
-		IMarker[] temp = new IMarker[markers.length];
-		int validCount = 0;
-		for (int i = 0; i < markers.length; i++) {
-			IMarker marker = markers[i];
-
-			try {
-				Object owner = marker.getAttribute(VALIDATION_MARKER_OWNER);
-				if ((owner == null) || !(owner instanceof String)) {
-					// The ValidationMigrator will remove any "unowned" validation markers.
-					continue;
-				}
-
-				for (int j = 0; j < messageOwners.length; j++) {
-					String messageOwner = messageOwners[j];
-					if (((String) owner).equals(messageOwner)) {
-						temp[validCount++] = marker;
-						break;
-					}
-				}
-			} catch (CoreException exc) {
-				Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-				if (logger.isLoggingLevel(Level.SEVERE)) {
-					LogEntry entry = ValidationPlugin.getLogEntry();
-					entry.setSourceID("TaskListUtility.getValidationTasks(project, String[])"); //$NON-NLS-1$
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-				return NO_MARKERS;
-			}
-		}
-
-		IMarker[] result = new IMarker[validCount];
-		System.arraycopy(temp, 0, result, 0, validCount);
-		return result;
-	}
-
-	/**
-	 * This method retrieves all validation tasks from the resource. If depth is INFINITE, child
-	 * tasks are returned as well. Only the tasks which are owned by the specified messageOwner, and
-	 * apply to the named IMessage's target object (objectName) will be returned.
-	 */
-	private static IMarker[] getValidationTasks(IResource resource, String[] messageOwner, String objectName, String groupName, int depth) throws CoreException {
-		if ((messageOwner == null) || (resource == null)) {
-			return NO_MARKERS;
-		}
-
-		int validCount = 0;
-		IMarker[] validList = null;
-		IMarker[] markers = getValidationTasks(resource, messageOwner, depth);
-		if (markers != null) {
-			validList = new IMarker[markers.length];
-			for (int i = 0; i < markers.length; i++) {
-				IMarker marker = markers[i];
-
-				// If more than one target object resolves to the same resource, removing one
-				// target's
-				// messages should not remove the other target object's messages.
-				if (objectName != null) {
-					Object targetObject = marker.getAttribute(VALIDATION_MARKER_TARGETOBJECT);
-					if ((targetObject == null) || !(targetObject instanceof String) || !(((String) targetObject).equals(objectName))) {
-						continue;
-					}
-				}
-
-				if (groupName != null) {
-					Object group = marker.getAttribute(VALIDATION_MARKER_GROUP);
-					if ((group == null) || !(group instanceof String) || !(((String) group).equals(groupName))) {
-						continue;
-					}
-				}
-
-				validList[validCount++] = marker;
-			}
-		}
-
-		if (validCount == 0) {
-			return NO_MARKERS;
-		}
-
-		IMarker[] result = new IMarker[validCount];
-		System.arraycopy(validList, 0, result, 0, validCount);
-		return result;
-	}
-
-	/**
-	 * Remove all validation messages from the resource and its children.
-	 */
-	public static void removeAllTasks(IResource resource) {
-		if (resource == null) {
-			return;
-		}
-
-		try {
-			IMarker[] markers = getValidationTasks(resource, IMessage.ALL_MESSAGES);
-			ResourcesPlugin.getWorkspace().deleteMarkers(markers);
-		} catch (CoreException exc) {
-			// Couldn't remove the task from the task list for some reason...
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("WorkbenchMonitor.removeAllMessages(String[], IResource, String)"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-		}
-	}
-
-	/**
-	 * This method removes all tasks from the resource. If the resource is an IProject, all tasks
-	 * are also removed from the project's children.
-	 */
-	public static void removeAllTasks(IResource resource, String[] owners) throws CoreException {
-		removeAllTasks(resource, owners, null); // null means remove messages from all target
-		// objects
-	}
-
-	/**
-	 * This method removes all messages from a resource in the task list.
-	 */
-	public static void removeAllTasks(IResource resource, String owner, String objectName) throws CoreException {
-		removeAllTasks(resource, new String[]{owner}, objectName);
-	}
-
-	public static void removeAllTasks(IResource resource, String[] owners, String objectName) throws CoreException {
-		removeAllTasks(resource, owners, objectName, getDepth(resource));
-	}
-
-	protected static void removeAllTasks(IResource resource, String[] owners, String objectName, int depth) throws CoreException {
-		removeTaskSubset(resource, owners, objectName, null, depth); // null means no group name
-	}
-
-	/**
-	 * This method removes a subset of tasks from the project, including child tasks. Every task
-	 * which belongs to the group, identified by groupName, will be removed.
-	 */
-	public static void removeTaskSubset(IResource resource, String[] owners, String objectName, String groupName) throws CoreException {
-		removeTaskSubset(resource, owners, objectName, groupName, getDepth(resource));
-	}
-
-	/**
-	 * This method removes a subset of tasks from the project, including child tasks. Every task
-	 * which belongs to the group, identified by groupName, will be removed.
-	 */
-	protected static void removeTaskSubset(IResource resource, String[] owners, String objectName, String groupName, int depth) throws CoreException {
-		if ((owners == null) || (resource == null)) {
-			return;
-		}
-
-		IMarker[] allTasks = getValidationTasks(resource, owners, objectName, groupName, depth);
-		if (allTasks.length > 0) {
-			ResourcesPlugin.getWorkspace().deleteMarkers(allTasks);
-		}
-	}
-
-	/**
-	 * This method changes all validator markers which are owned by "from" to make their owner "to".
-	 */
-	public static void updateOwner(String from, String to) throws CoreException {
-		updateOwner(from, to, getRoot());
-	}
-
-	/**
-	 * This method changes all validator markers on the IResource and its children. All markers
-	 * owned by "from" have their owner reassigned to "to".
-	 */
-	public static void updateOwner(String from, String to, IResource resource) throws CoreException {
-		IMarker[] ownedMarkers = getValidationTasks(resource, from);
-		if (ownedMarkers == null) {
-			return;
-		}
-
-		for (int i = 0; i < ownedMarkers.length; i++) {
-			IMarker marker = ownedMarkers[i];
-			marker.setAttribute(VALIDATION_MARKER_OWNER, to);
-		}
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/TimeEntry.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/TimeEntry.java
deleted file mode 100644
index d63ed17..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/TimeEntry.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal;
-
-import org.eclipse.jem.util.logger.LogEntry;
-
-
-/**
- * This class should be used when logging "elapsed time" information and nothing else. Instead of
- * creating a new instance of this class every time it is needed, for performance reasons, create an
- * instance and reuse it. The text in this class is never translated.
- */
-public class TimeEntry extends LogEntry {
-	private String _toolName = null;
-	private String _details = null;
-	private String _projectName = null;
-	private String _sourceId = null;
-	private int _executionMap = 0x0;
-
-	public TimeEntry() {
-		super();
-	}
-
-	/**
-	 * The name of the tool (e.g., a validator, a builder) whose time is measured.
-	 */
-	public String getToolName() {
-		return _toolName;
-	}
-
-	public void setToolName(String name) {
-		_toolName = name;
-	}
-
-
-	/**
-	 * If there are any details that need to be recorded about the tool, such as what input it runs
-	 * on, this field stores the value. This field is optional.
-	 */
-	public String getDetails() {
-		return _details;
-	}
-
-	public void setDetails(String d) {
-		_details = d;
-	}
-
-	/**
-	 * The name of the project on which the tool ran.
-	 */
-	public String getProjectName() {
-		return _projectName;
-	}
-
-	public void setProjectName(String name) {
-		_projectName = name;
-	}
-
-	/**
-	 * The id of the code that launched the tool.
-	 */
-	public String getSourceID() {
-		return _sourceId;
-	}
-
-	public void setSourceID(String id) {
-		_sourceId = id;
-	}
-
-	/**
-	 * If, in addition to elapsed time, the tool needs to track the execution path of a method, this
-	 * field stores the hexadecimal number that tracks the path. See ValidationBuilder::build for an
-	 * example that uses an execution path.
-	 */
-	public int getExcecutionMap() {
-		return _executionMap;
-	}
-
-	public void setExecutionMap(int map) {
-		_executionMap = map;
-	}
-
-	/**
-	 * Clear all of the fields back to their initial setting so that this TimeEntry instance can be
-	 * reused.
-	 */
-	public void reset() {
-		_toolName = null;
-		_details = null;
-		_projectName = null;
-		_sourceId = null;
-		_executionMap = 0;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/VThreadManager.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/VThreadManager.java
deleted file mode 100644
index 05b3891..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/VThreadManager.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal;
-
-
-import java.util.Vector;
-import java.util.logging.Level;
-
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-
-
-/**
- * This class manages (queue, invoke, etc.) the Runnables that perform the validation for a
- * particular validator.
- */
-public class VThreadManager {
-	private static VThreadManager _manager = null;
-	private static final int MAX_NUM_OF_RESTART = 5; // the maximum number of times that the thread
-	// should attempt to ignore a Throwable and
-	// carry on
-
-	private Thread _validationThread = null; // This thread checks if the current Runnable is
-	// finished, and if so, loads the first Runnable off of
-	// the queue and starts it.
-	volatile int restart = 0; // how many times has the thread been restarted?
-	volatile Jobs _jobs = null;
-
-	private VThreadManager() {
-		_jobs = new Jobs();
-
-		// Start the validation thread to check for queued ValidationOperation
-		Runnable validationRunnable = new Runnable() {
-			public void run() {
-				while (true) {
-					try {
-						if (restart > MAX_NUM_OF_RESTART) {
-							// something has gone seriously, seriously wrong
-							Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-							if (logger.isLoggingLevel(Level.SEVERE)) {
-								LogEntry entry = ValidationPlugin.getLogEntry();
-								entry.setSourceID("VThreadManager::validationRunnable"); //$NON-NLS-1$
-								entry.setText("restart = " + restart); //$NON-NLS-1$
-								logger.write(Level.SEVERE, entry);
-							}
-							break;
-						}
-
-						Runnable job = getJobs().dequeue(); // If currentRunnable is null, there's
-						// nothing on the queue. Shouldn't
-						// happen with a semaphore.
-						if (job != null) {
-							getJobs().setActive(true);
-							job.run();
-							getJobs().setActive(false);
-						}
-					} catch (Throwable exc) {
-						// This exception is added as FINE instead of SEVERE because it's not
-						// improbable
-						// that an exception will be thrown
-						restart++;
-						getJobs().setActive(false);
-
-						Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-						if (logger.isLoggingLevel(Level.FINE)) {
-							LogEntry entry = ValidationPlugin.getLogEntry();
-							entry.setSourceID("VThreadManager::validationRunnable"); //$NON-NLS-1$
-							entry.setTargetException(exc);
-							logger.write(Level.FINE, entry);
-						}
-					} finally {
-						//do nothing
-					}
-				}
-			}
-		};
-
-		_validationThread = new Thread(validationRunnable, "ValidationThread"); //$NON-NLS-1$
-		_validationThread.start();
-	}
-
-	public static VThreadManager getManager() {
-		if (_manager == null) {
-			_manager = new VThreadManager();
-		}
-		return _manager;
-	}
-
-	Jobs getJobs() {
-		return _jobs;
-	}
-
-	public void queue(Runnable runnable) {
-		getJobs().queue(runnable);
-	}
-
-	/**
-	 * Return true if all of the Runnables have been run.
-	 */
-	public boolean isDone() {
-		return getJobs().isDone();
-	}
-
-	private class Jobs {
-		private Vector __jobs = null; // The queued Runnables that need to be run.
-		private boolean _isActive = false; // Is a job being run in the validation thread?
-
-		public Jobs() {
-			__jobs = new Vector();
-		}
-
-		public synchronized void queue(Runnable runnable) {
-			// If there is a thread running already, then it must finish before another validation
-			// thread is launched, or the validation messages could reflect the last thread
-			// finished,
-			// instead of the last state of changes.
-
-			// Have to wait for the current Runnable to finish, so add this to the end of the queue
-			__jobs.add(runnable);
-			notifyAll();
-		}
-
-		/**
-		 * Pop the Runnable off of the head of the queue.
-		 */
-		synchronized Runnable dequeue() {
-			while (__jobs.size() == 0) {
-				try {
-					wait();
-				} catch (InterruptedException exc) {
-					//Ignore
-				}
-			} // Block on the semaphore; break when a job has been added to the queue.
-
-			Runnable job = null;
-			if (__jobs.size() > 0) {
-				job = (Runnable) __jobs.get(0);
-				if (job != null) {
-					__jobs.remove(0);
-				}
-			}
-			return job;
-		}
-
-		public synchronized boolean isActive() {
-			return _isActive;
-		}
-
-		public synchronized void setActive(boolean active) {
-			_isActive = active;
-		}
-
-		/**
-		 * Return true if all of the Runnables have been run.
-		 */
-		public synchronized boolean isDone() {
-			return ((__jobs.size() == 0) && !isActive());
-		}
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidationConfiguration.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidationConfiguration.java
deleted file mode 100644
index a9b7847..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidationConfiguration.java
+++ /dev/null
@@ -1,769 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.StringTokenizer;
-import java.util.logging.Level;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-
-
-/**
- * This class represents the user's preference or project settings.
- * 
- * This class is populated from the multiple persistent properties, and is kept as a session
- * property while the resource is open.
- */
-public abstract class ValidationConfiguration {
-	private IResource _resource = null;
-	private boolean _autoValidate = getAutoValidateDefault();
-	private boolean _buildValidate = getBuildValidateDefault();
-	private int _maxMessages = getMaximumNumberOfMessagesDefault();
-	private String _version = null;
-	private Map _validators = null; // Map of all validators (ValidatorMetaData) configured on the
-	// project or installed globally. The value is a Boolean; TRUE
-	// means that the VMD is enabled, FALSE means that the VMD is
-	// disabled.
-	private boolean _runAsync = getAsyncDefault();
-
-	public static String getEnabledElementsAsString(Set elements) {
-		if (elements == null) {
-			return null;
-		}
-
-		StringBuffer buffer = new StringBuffer();
-		Iterator iterator = elements.iterator();
-		while (iterator.hasNext()) {
-			buffer.append(((ValidatorMetaData) iterator.next()).getValidatorUniqueName());
-			buffer.append(ConfigurationConstants.ELEMENT_SEPARATOR);
-		}
-		return buffer.toString();
-	}
-
-	public static String getEnabledElementsAsString(Object[] elements) {
-		StringBuffer buffer = new StringBuffer();
-		for (int i = 0; i < elements.length; i++) {
-			buffer.append(((ValidatorMetaData) elements[i]).getValidatorUniqueName());
-			buffer.append(ConfigurationConstants.ELEMENT_SEPARATOR);
-		}
-		return buffer.toString();
-	}
-
-	public static Set getStringAsEnabledElements(String elements) {
-		if (elements == null) {
-			return null;
-		}
-
-		HashSet result = new HashSet();
-		StringTokenizer tokenizer = new StringTokenizer(elements, ConfigurationConstants.ELEMENT_SEPARATOR);
-		while (tokenizer.hasMoreTokens()) {
-			String elem = tokenizer.nextToken();
-			ValidatorMetaData vmd = ValidationRegistryReader.getReader().getValidatorMetaData(elem);
-			if (vmd != null) {
-				result.add(vmd);
-			}
-		}
-		return result;
-	}
-
-	public static ValidatorMetaData[] getStringAsEnabledElementsArray(String elements) {
-		if (elements == null) {
-			return null;
-		}
-
-		StringTokenizer tokenizer = new StringTokenizer(elements, ConfigurationConstants.ELEMENT_SEPARATOR);
-		ValidatorMetaData[] result = new ValidatorMetaData[tokenizer.countTokens()];
-		int count = 0;
-		while (tokenizer.hasMoreTokens()) {
-			String elem = tokenizer.nextToken();
-			ValidatorMetaData vmd = ValidationRegistryReader.getReader().getValidatorMetaData(elem);
-			if (vmd != null) {
-				result[count++] = vmd;
-			}
-		}
-
-		if (count != result.length) {
-			ValidatorMetaData[] trimResult = new ValidatorMetaData[count];
-			System.arraycopy(result, 0, trimResult, 0, count);
-			return trimResult;
-		}
-
-		return result;
-	}
-
-	public static IWorkspaceRoot getRoot() {
-		return ResourcesPlugin.getWorkspace().getRoot();
-	}
-
-	protected ValidationConfiguration() throws InvocationTargetException {
-		_validators = new HashMap();
-	}
-
-	protected ValidationConfiguration(IResource resource, ValidatorMetaData[] validators) throws InvocationTargetException {
-		this();
-
-		if (resource == null) {
-			throw new InvocationTargetException(null, ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_NULLCREATE));
-		}
-
-		setResource(resource);
-		setValidators(validators);
-	}
-
-	private void setResource(IResource resource) {
-		_resource = resource;
-	}
-
-	public boolean isAutoValidate() throws InvocationTargetException {
-		return _autoValidate;
-	}
-
-	public void setAutoValidate(boolean auto) {
-		_autoValidate = auto;
-	}
-
-	public boolean isBuildValidate() throws InvocationTargetException {
-		return _buildValidate;
-	}
-
-	public void setBuildValidate(boolean build) {
-		_buildValidate = build;
-	}
-
-	public boolean runAsync() throws InvocationTargetException {
-		return _runAsync;
-	}
-
-	public void setAsync(boolean doRunInBackgroundThread) throws InvocationTargetException {
-		_runAsync = doRunInBackgroundThread;
-	}
-
-	public ValidatorMetaData[] getEnabledValidators() throws InvocationTargetException {
-		return getValidators(true);
-	}
-
-	/**
-	 * If "incremental" is true, return the enabled incremental validators. If "incremental" is
-	 * false, return the enabled non-incremental validators.
-	 */
-	public ValidatorMetaData[] getEnabledIncrementalValidators(boolean incremental) throws InvocationTargetException {
-		ValidatorMetaData[] temp = new ValidatorMetaData[numberOfValidators()];
-		Iterator iterator = getValidatorMetaData().keySet().iterator();
-		int count = 0;
-		while (iterator.hasNext()) {
-			ValidatorMetaData vmd = (ValidatorMetaData) iterator.next();
-			Boolean bvalue = (Boolean) getValidatorMetaData().get(vmd);
-			if (bvalue.booleanValue() == true) {
-				// If the validator is enabled
-				if ((vmd.isIncremental() && incremental) || (!vmd.isIncremental() && !incremental)) {
-					temp[count++] = vmd;
-				}
-			}
-		}
-
-		ValidatorMetaData[] result = new ValidatorMetaData[count];
-		System.arraycopy(temp, 0, result, 0, count);
-		return result;
-	}
-
-	/**
-	 * If "fullBuild" is true, return the enabled validators that support full builds. If
-	 * "fullBuild" is false, return the enabled validators that do not support full builds.
-	 */
-	public ValidatorMetaData[] getEnabledFullBuildValidators(boolean fullBuild) throws InvocationTargetException {
-		return getEnabledFullBuildValidators(fullBuild, false);
-	}
-
-	public ValidatorMetaData[] getEnabledFullBuildValidators(boolean fullBuild, boolean onlyReferenced) throws InvocationTargetException {
-		ValidatorMetaData[] temp = new ValidatorMetaData[numberOfValidators()];
-		Iterator iterator = getValidatorMetaData().keySet().iterator();
-		int count = 0;
-		while (iterator.hasNext()) {
-			ValidatorMetaData vmd = (ValidatorMetaData) iterator.next();
-			Boolean bvalue = (Boolean) getValidatorMetaData().get(vmd);
-			if (bvalue.booleanValue() == true) {
-				// If the validator is enabled
-				if (vmd == null)
-					continue;
-				if ((vmd.isFullBuild() && fullBuild) || (!vmd.isFullBuild() && !fullBuild)) {
-					if (!onlyReferenced || vmd.isDependentValidator())
-						temp[count++] = vmd;
-				}
-			}
-		}
-
-		ValidatorMetaData[] result = new ValidatorMetaData[count];
-		System.arraycopy(temp, 0, result, 0, count);
-		return result;
-	}
-
-	public void setEnabledValidators(ValidatorMetaData[] vmds) {
-		// First, "disable" all validators
-		Map all = getValidatorMetaData();
-		Iterator iterator = all.keySet().iterator();
-		while (iterator.hasNext()) {
-			ValidatorMetaData vmd = (ValidatorMetaData) iterator.next();
-			all.put(vmd, Boolean.FALSE);
-		}
-
-		// Then enable only the validators in the array
-		if ((vmds == null) || (vmds.length == 0)) {
-			return;
-		}
-		for (int i = 0; i < vmds.length; i++) {
-			all.put(vmds[i], Boolean.TRUE);
-		}
-	}
-
-	private Map getValidatorMetaData() {
-		return _validators;
-	}
-
-	public ValidatorMetaData[] getDisabledValidators() throws InvocationTargetException {
-		return getValidators(false);
-	}
-
-	/**
-	 * Return an array of ValidatorMetaData - if value is false, return the disabled validators; if
-	 * value is true, return the enabled validators.
-	 */
-	private ValidatorMetaData[] getValidators(boolean value) throws InvocationTargetException {
-		ValidatorMetaData[] temp = new ValidatorMetaData[numberOfValidators()];
-		Iterator iterator = getValidatorMetaData().keySet().iterator();
-		int count = 0;
-		while (iterator.hasNext()) {
-			ValidatorMetaData vmd = (ValidatorMetaData) iterator.next();
-			Boolean bvalue = (Boolean) getValidatorMetaData().get(vmd);
-			if (bvalue.booleanValue() == value) {
-				temp[count++] = vmd;
-			}
-		}
-
-		ValidatorMetaData[] result = new ValidatorMetaData[count];
-		System.arraycopy(temp, 0, result, 0, count);
-		return result;
-	}
-
-	/**
-	 * Return all incremental validators for this preference; either every installed validator
-	 * (global) or every validator configured on the project (project).
-	 */
-	public ValidatorMetaData[] getIncrementalValidators() throws InvocationTargetException {
-		ValidatorMetaData[] temp = new ValidatorMetaData[numberOfValidators()];
-		Iterator iterator = getValidatorMetaData().keySet().iterator();
-		int count = 0;
-		while (iterator.hasNext()) {
-			ValidatorMetaData vmd = (ValidatorMetaData) iterator.next();
-			Boolean bvalue = (Boolean) getValidatorMetaData().get(vmd);
-			if (bvalue.booleanValue() == true) {
-				// If the validator is enabled
-				if (vmd.isIncremental()) {
-					temp[count++] = vmd;
-				}
-			}
-		}
-
-		ValidatorMetaData[] result = new ValidatorMetaData[count];
-		System.arraycopy(temp, 0, result, 0, count);
-		return result;
-	}
-
-	/**
-	 * Return all validators for this preference; either every installed validator (global) or every
-	 * validator configured on the project (project).
-	 */
-	public ValidatorMetaData[] getValidators() throws InvocationTargetException {
-		return convertToArray(_validators.keySet());
-	}
-
-	public void setValidators(ValidatorMetaData[] vmds) {
-		_validators.clear();
-		for (int i = 0; i < vmds.length; i++) {
-			if (vmds[i] == null)
-				continue;
-			_validators.put(vmds[i], (vmds[i].isEnabledByDefault() ? Boolean.TRUE : Boolean.FALSE));
-		}
-	}
-
-	/**
-	 * Returns the number of configured validators on the given project or installed validators in
-	 * the workspace.
-	 */
-	public int numberOfValidators() throws InvocationTargetException {
-		return _validators.size();
-	}
-
-	public int numberOfEnabledIncrementalValidators() throws InvocationTargetException {
-		return numberOfIncrementalValidators(getEnabledValidators());
-	}
-
-	public int numberOfIncrementalValidators() throws InvocationTargetException {
-		return numberOfIncrementalValidators(getValidators());
-	}
-
-	private static int numberOfIncrementalValidators(ValidatorMetaData[] vmds) {
-		int count = 0;
-		for (int i = 0; i < vmds.length; i++) {
-			ValidatorMetaData vmd = vmds[i];
-			if (vmd.isIncremental()) {
-				count++;
-			}
-		}
-		return count;
-	}
-
-	/**
-	 * Returns the number of enabled validators on the project or workspace.
-	 */
-	public int numberOfEnabledValidators() throws InvocationTargetException {
-		return getEnabledValidators().length;
-	}
-
-	/**
-	 * Returns the number of disabled validators on the project or workspace.
-	 */
-	public int numberOfDisabledValidators() throws InvocationTargetException {
-		return getDisabledValidators().length;
-	}
-
-	public int getMaximumNumberOfMessages() throws InvocationTargetException {
-		return _maxMessages;
-	}
-
-	public void setMaximumNumberOfMessages(int max) {
-		_maxMessages = max;
-	}
-
-	/**
-	 * The value returned from this method is guaranteed to be non-null.
-	 */
-	public final String getVersion() throws InvocationTargetException {
-		if (_version == null) {
-			loadVersion();
-		}
-		return _version;
-	}
-
-	private void setVersion(String version) {
-		_version = version;
-	}
-
-	/**
-	 * This preference has been migrated; change the version to the current version.
-	 */
-	public void markVersionCurrent() {
-		// The version should not be marked current until the migration is complete
-		// (i.e., ValidationMigrator has been invoked.) Migrating the user's configuration
-		// is only the first step of the migration.
-		setVersion(ConfigurationConstants.CURRENT_VERSION);
-	}
-
-	public boolean isVersionCurrent() throws InvocationTargetException {
-		return getVersion().equals(ConfigurationConstants.CURRENT_VERSION);
-	}
-
-	// IResource could be an IProject or an IWorkspaceRoot
-	public IResource getResource() {
-		return _resource;
-	}
-
-	/**
-	 * Return true if the validator is enabled on this preference.
-	 */
-	public boolean isEnabled(String validatorClassName) throws InvocationTargetException {
-		if (validatorClassName == null) {
-			return false;
-		}
-
-		ValidatorMetaData vmd = ValidationRegistryReader.getReader().getValidatorMetaData(validatorClassName);
-		return isEnabled(vmd);
-	}
-
-	/**
-	 * Return true if the validator is enabled on this preference.
-	 */
-	public boolean isEnabled(ValidatorMetaData vmd) throws InvocationTargetException {
-		if (vmd == null) {
-			return false;
-		}
-
-		Boolean value = (Boolean) getValidatorMetaData().get(vmd);
-		if (value == null) {
-			return false;
-		}
-
-		return value.booleanValue();
-	}
-
-	/**
-	 * Once all of the fields have been updated on this ValidationConfiguration instance, this
-	 * preference should be stored back on the IResource for later use. This method must be called
-	 * manually by the validation framework once the fields of this type have been updated.
-	 */
-	public final void passivate() throws InvocationTargetException {
-		try {
-			if (getResource() == null) {
-				throw new InvocationTargetException(null, ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_NULLSAVE));
-			}
-
-			getResource().setSessionProperty(ConfigurationConstants.USER_PREFERENCE, this);
-		} catch (CoreException exc) {
-			throw new InvocationTargetException(exc, ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_SAVE, new String[]{getResource().getName()}));
-		}
-	}
-
-	/**
-	 * Reset the values to the default values.
-	 */
-	public abstract void resetToDefault() throws InvocationTargetException;
-
-	protected Boolean convertToBoolean(boolean value) {
-		return (value == true ? Boolean.TRUE : Boolean.FALSE);
-	}
-
-	protected Integer convertToInteger(int value) {
-		return new Integer(value);
-	}
-
-	protected boolean convertToBoolean(String value) {
-		Boolean b = Boolean.valueOf(value);
-		return b.booleanValue();
-	}
-
-	protected int convertToInt(String value) {
-		Integer t = Integer.valueOf(value);
-		return t.intValue();
-	}
-
-	public static ValidatorMetaData[] convertToArray(Collection c) {
-		int length = (c == null) ? 0 : c.size();
-		ValidatorMetaData[] result = new ValidatorMetaData[length];
-		if (length == 0) {
-			return result;
-		}
-
-		Iterator iterator = c.iterator();
-		int count = 0;
-		while (iterator.hasNext()) {
-			ValidatorMetaData vmd = (ValidatorMetaData) iterator.next();
-			result[count++] = vmd;
-		}
-
-		return result;
-	}
-
-	public static ValidatorMetaData[] convertToArray(Object[] c) {
-		int length = (c == null) ? 0 : c.length;
-		ValidatorMetaData[] result = new ValidatorMetaData[length];
-		if (length == 0) {
-			return result;
-		}
-
-		System.arraycopy(c, 0, result, 0, length);
-		return result;
-	}
-
-	/**
-	 * Save the values of these fields before the project or workspace is closed.
-	 */
-	public void store() throws InvocationTargetException {
-		if (getResource() == null) {
-			throw new InvocationTargetException(null, ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_NULLSAVE));
-		}
-
-		try {
-			getResource().setPersistentProperty(ConfigurationConstants.USER_PREFERENCE, serialize());
-		} catch (CoreException exc) {
-			throw new InvocationTargetException(exc, ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_SAVE, new String[]{getResource().getName()}));
-		}
-	}
-
-	/**
-	 * Load and store the version number, but nothing else. The version isn't a preference, but it's
-	 * stored and loaded as if it is. Because the load mechanism is different between an IProject
-	 * and the IWorkspaceRoot, keep the load mechanism inside the ValidationConfiguration
-	 * implementation, but initialize only the minimum at first. After the project has been
-	 * migrated, load the other fields (loading the other fields before the migration may overwrite
-	 * the values of those fields).
-	 */
-	protected final void loadVersion() throws InvocationTargetException {
-		if (getResource() == null) {
-			throw new InvocationTargetException(null, ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_NULLRETRIEVE));
-		}
-
-		IMarker[] marker = getMarker();
-		String version = null;
-		if (marker == null) {
-			// either a new workspace or already migrated; proceed as normal
-			version = loadVersion(getResource());
-		} else {
-			// migrate
-			version = loadVersion(marker);
-		}
-		setVersion(version);
-	}
-
-	protected final String loadVersion(IMarker[] marker) throws InvocationTargetException {
-		String version = (String) getValue(marker[0], ConfigurationConstants.VERSION);
-		if (version == null) {
-			return ConfigurationConstants.VERSION4_03;
-		}
-
-		return version;
-	}
-
-	protected final String loadVersion(IResource resource) throws InvocationTargetException {
-		try {
-			// This method will be called in one of two situations:
-			//    1. This is a new workspace and no preferences exist.
-			//    2. This is a migrated workspace and the old preferences have already been created as
-			// persistent properties.
-			String storedConfiguration = resource.getPersistentProperty(ConfigurationConstants.USER_PREFERENCE);
-			String version = null;
-			if (storedConfiguration == null) {
-				version = getVersionDefault();
-			} else {
-				int versionIndex = storedConfiguration.indexOf(ConfigurationConstants.VERSION);
-				if (versionIndex != -1)
-					version = storedConfiguration.substring(versionIndex + ConfigurationConstants.VERSION.length());
-			}
-
-			if (version == null) {
-				return getVersionDefault();
-			}
-
-			return version;
-		} catch (CoreException exc) {
-			throw new InvocationTargetException(exc, ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_RETRIEVE, new String[]{getResource().getName()}));
-		}
-	}
-
-	/**
-	 * Load the values of these fields when the project or workspace is opened.
-	 */
-	protected final void load() throws InvocationTargetException {
-		try {
-			if (getResource() == null) {
-				throw new InvocationTargetException(null, ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_NULLRETRIEVE));
-			}
-
-			IMarker[] marker = getMarker();
-			if (marker == null) {
-				// either a new workspace or already migrated; proceed as normal
-				load(getResource());
-			} else {
-				// migrate
-				load(marker);
-			}
-		} catch (InvocationTargetException exc) {
-			throw exc;
-		} catch (Throwable exc) {
-			String resourceName = (getResource() == null) ? "null" : getResource().getName(); //$NON-NLS-1$
-			throw new InvocationTargetException(exc, ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_RETRIEVE, new String[]{resourceName}));
-		}
-	}
-
-	/**
-	 * Return the IMarker that used to store the preference information, if the marker exists. (If
-	 * it doesn't exist, then it's already been migrated.)
-	 */
-	protected abstract IMarker[] getMarker();
-
-	protected abstract void load(IMarker[] marker) throws InvocationTargetException;
-
-	protected Object getValue(IMarker marker, String attribName) {
-		if (marker == null) {
-			return null;
-		}
-
-		try {
-			return marker.getAttribute(attribName);
-		} catch (CoreException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("ValidationConfiguration::getValue(" + attribName + ")"); //$NON-NLS-1$ //$NON-NLS-2$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-			return null;
-		}
-	}
-
-	protected boolean getValue(IMarker marker, String attribName, boolean defaultValue) {
-		Boolean bool = (Boolean) getValue(marker, attribName);
-		if (bool == null) {
-			return defaultValue;
-		}
-
-		return bool.booleanValue();
-	}
-
-	protected int getValue(IMarker marker, String attribName, int defaultValue) {
-		Integer integer = (Integer) getValue(marker, attribName);
-		if (integer == null) {
-			return defaultValue;
-		}
-
-		return integer.intValue();
-	}
-
-	protected String getValue(IMarker marker, String attribName, String defaultValue) {
-		String string = (String) getValue(marker, attribName);
-		if (string == null) {
-			return defaultValue;
-		}
-
-		return string;
-	}
-
-	protected final void load(IResource resource) throws InvocationTargetException {
-		// This method will be called in one of two situations:
-		//    1. This is a new workspace and no preferences exist.
-		//    2. This is a migrated workspace and the old preferences have already been created as
-		// persistent properties.
-		try {
-			String storedConfiguration = resource.getPersistentProperty(ConfigurationConstants.USER_PREFERENCE);
-			deserialize(storedConfiguration);
-		} catch (CoreException exc) {
-			throw new InvocationTargetException(exc, ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_RETRIEVE, new String[]{getResource().getName()}));
-		}
-	}
-
-	protected void copyTo(ValidationConfiguration up) throws InvocationTargetException {
-		up.setVersion(getVersion());
-		up.setResource(getResource());
-		up.setValidators(getValidators());
-		up.setAutoValidate(isAutoValidate());
-		up.setBuildValidate(isBuildValidate());
-		up.setEnabledValidators(getEnabledValidators());
-		up.setMaximumNumberOfMessages(getMaximumNumberOfMessages());
-	}
-
-	/**
-	 * Return true if the enabled validators have not changed since this ValidationConfiguration was
-	 * constructed, false otherwise. (This method is needed for the Properties and Preference pages;
-	 * if the list of validators hasn't changed, then there is no need to update the task list;
-	 * updating the task list is a costly operation.)
-	 */
-	protected boolean hasEnabledValidatorsChanged(ValidatorMetaData[] oldEnabledVmd) throws InvocationTargetException {
-		// First check the obvious: is every enabled validator still enabled, and is
-		// the number of enabled validators the same as it was before? If not, return true.
-		if (oldEnabledVmd == null) {
-			// Something's gone wrong...
-			return true;
-		}
-
-		for (int i = 0; i < oldEnabledVmd.length; i++) {
-			ValidatorMetaData vmd = oldEnabledVmd[i];
-			if (!isEnabled(vmd)) {
-				return true;
-			}
-		}
-
-		// Everything that was enabled is still enabled; have any additional
-		// validators been enabled?
-		if (numberOfEnabledValidators() != oldEnabledVmd.length) {
-			return true;
-		}
-
-		return false;
-	}
-
-	protected String serialize() throws InvocationTargetException {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append(ConfigurationConstants.AUTO_SETTING);
-		buffer.append(String.valueOf(isAutoValidate()));
-		buffer.append(ConfigurationConstants.BUILD_SETTING);
-		buffer.append(String.valueOf(isBuildValidate()));
-		buffer.append(ConfigurationConstants.MAXNUMMESSAGES);
-		buffer.append(String.valueOf(getMaximumNumberOfMessages()));
-		buffer.append(ConfigurationConstants.ASYNC_SETTING);
-		buffer.append(String.valueOf(runAsync()));
-		buffer.append(ConfigurationConstants.ENABLED_VALIDATORS);
-		buffer.append(getEnabledElementsAsString(getEnabledValidators()));
-		buffer.append(ConfigurationConstants.VERSION);
-		buffer.append(getVersion());
-		return buffer.toString();
-	}
-
-	/**
-	 * Deserialize everything except the version number; the version is deserialized first, in the
-	 * loadVersion() method.
-	 */
-	protected void deserialize(String storedConfiguration) throws InvocationTargetException {
-		if (storedConfiguration == null || storedConfiguration.length() == 0) {
-			// Assume that the configuration has never been set (new workspace).
-			resetToDefault();
-			return;
-		}
-
-		int autoIndex = storedConfiguration.indexOf(ConfigurationConstants.AUTO_SETTING);
-		int buildIndex = storedConfiguration.indexOf(ConfigurationConstants.BUILD_SETTING);
-		int maxIndex = storedConfiguration.indexOf(ConfigurationConstants.MAXNUMMESSAGES);
-		int asyncIndex = storedConfiguration.indexOf(ConfigurationConstants.ASYNC_SETTING);
-		int enabledIndex = storedConfiguration.indexOf(ConfigurationConstants.ENABLED_VALIDATORS);
-		int versionIndex = storedConfiguration.indexOf(ConfigurationConstants.VERSION);
-
-		String auto = storedConfiguration.substring(autoIndex + ConfigurationConstants.AUTO_SETTING.length(), buildIndex);
-		String build = storedConfiguration.substring(buildIndex + ConfigurationConstants.BUILD_SETTING.length(), maxIndex);
-		String max = storedConfiguration.substring(maxIndex + ConfigurationConstants.MAXNUMMESSAGES.length(), asyncIndex);
-		String async = storedConfiguration.substring(asyncIndex + ConfigurationConstants.ASYNC_SETTING.length(), enabledIndex);
-		String enabled = storedConfiguration.substring(enabledIndex + ConfigurationConstants.ENABLED_VALIDATORS.length(), versionIndex);
-
-		setAutoValidate(Boolean.valueOf(auto).booleanValue());
-		setBuildValidate(Boolean.valueOf(build).booleanValue());
-		setMaximumNumberOfMessages(Integer.valueOf(max).intValue());
-		setAsync(Boolean.valueOf(async).booleanValue());
-		setEnabledValidators(getStringAsEnabledElementsArray(enabled));
-	}
-
-	public static boolean getAutoValidateDefault() {
-		return ConfigurationConstants.DEFAULT_AUTO_SETTING;
-	}
-
-	public static boolean getBuildValidateDefault() {
-		return ConfigurationConstants.DEFAULT_BUILD_SETTING;
-	}
-
-	public static ValidatorMetaData[] getEnabledValidatorsDefault() {
-		return ConfigurationConstants.DEFAULT_ENABLED_VALIDATORS;
-	}
-
-	public static int getMaximumNumberOfMessagesDefault() {
-		return ConfigurationConstants.DEFAULT_MAXNUMMESSAGES;
-	}
-
-	public static String getVersionDefault() {
-		// If the version can't be retrieved, assume that it's a new workspace. (A null version
-		// could also mean a 4.03 workspace, but that's taken care of in the load(IMarker[])
-		// method.)
-		return ConfigurationConstants.CURRENT_VERSION;
-	}
-
-	public static boolean getAsyncDefault() {
-		return ConfigurationConstants.DEFAULT_ASYNC;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidationFactoryImpl.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidationFactoryImpl.java
deleted file mode 100644
index 058e8f8..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidationFactoryImpl.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal;
-
-import org.eclipse.wst.validation.internal.provisional.ValidationFactory;
-import org.eclipse.wst.validation.internal.provisional.core.IValidator;
-
-public class ValidationFactoryImpl implements ValidationFactory {
-	static ValidationFactory inst = null;
-	
-	public ValidationFactoryImpl() {
-		super();
-	}
-
-	public static ValidationFactory getInstance() {
-		if(inst == null)
-			inst = new ValidationFactoryImpl();
-		return inst;
-	}
-
-	public IValidator getValidator(String validatorUniqueId) throws InstantiationException {
-		ValidationRegistryReader reader = ValidationRegistryReader.getReader();
-		return reader.getValidator(validatorUniqueId);
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidationRegistryReader.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidationRegistryReader.java
deleted file mode 100644
index cbe0914..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidationRegistryReader.java
+++ /dev/null
@@ -1,1394 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal;
-
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.StringTokenizer;
-import java.util.logging.Level;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-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.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.validation.internal.operations.IRuleGroup;
-import org.eclipse.wst.validation.internal.operations.IWorkbenchContext;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-import org.eclipse.wst.validation.internal.provisional.core.IValidator;
-
-
-/**
- * ValidationRegistryReader is a singleton who reads the plugin registry for Validator extensions.
- * The read is done once (in the constructor), and the list of validators can be accessed by calling
- * "getValidatorMetaData(String)" on this class. The read is triggered by a call from
- * ValidatorManager's loadValidatorMetaData(IProject) method. ValidatorManager delegates the load
- * call to this class, and if this class is null, the singleton is new'ed up, and the registry is
- * read.
- * 
- * No Validator should need to know about this class. The only class which should call
- * ValidationRegistryReader is ValidatorManager.
- * 
- * The Validator itself is initialized in the "initializeValidator" method.
- * 
- * <extension point="org.eclipse.wst.validation.internal.provisional.core.core.validator" id="EJBValidator" name="EJB
- * Validator"> <validator><projectNature id="com.ibm.etools.j2ee.EJBNature" include="false"/>
- * <filter objectClass="org.eclipse.core.resources.IFile" nameFilter = "ejb-jar.xml"/> <filter
- * objectClass="org.eclipse.core.resources.IFile" nameFilter = "*.java"/> <helper
- * class="org.eclipse.wst.validation.internal.provisional.core.core.ejb.workbenchimpl.EJBHelper"/> <run
- * class="org.eclipse.wst.validation.internal.provisional.core.core.ejb.EJBValidator" incremental="false" enabled="false"
- * pass="fast,full" async="false"/> <aggregateValidator class="my.aggregate.ValidatorClass"/>
- * <migrate><validator from="old.class.name" to="new.class.name"/> </migrate> </validator>
- * </extension>
- */
-public final class ValidationRegistryReader implements RegistryConstants {
-	private static ValidationRegistryReader inst = null;
-	private HashMap _validators; // list of all validators registered, with their associated
-	// ValidatorMetaData, indexed by project nature id
-	private HashMap _indexedValidators; // list of all validators, indexed by validator class name,
-	// with the validator's ValidatorMetaData as the value.
-	// Needed by the WorkbenchReporter, because sometimes the
-	// IValidator is not enough to remove all messages from the
-	// task list.
-	private Set _defaultEnabledValidators;
-	// Since IProject's contents are all instances of IResource, every type filter for a validator
-	// must be an instance of IResource. This applies to both the rebuildCache pass and to the
-	// validation pass.
-	private static final String IRESOURCE = "org.eclipse.core.resources.IResource"; //$NON-NLS-1$
-
-	private static final String UNKNOWN_PROJECT = "UNKNOWN"; //$NON-NLS-1$ // This 'project nature id' is used as a key to get the validators which can run on a project type which hasn't been explicitly filtered in or out by any validator.
-	private static final String EXCLUDED_PROJECT = "EXCLUDED"; //$NON-NLS-1$ // This 'project nature id' is used as a key to get the validators which are excluded on certain projects.
-
-	private List _tempList = null; // list for temporary values. Retrieve and use via the
-	
-	public HashMap projectValidationMetaData = null;
-
-	/**
-	 * The registry is read once - when this class is instantiated.
-	 */
-	private ValidationRegistryReader() {
-		super();
-
-		try {
-			_validators = new HashMap();
-			_indexedValidators = new HashMap();
-			_defaultEnabledValidators = new HashSet();
-
-			// Read the registry and build a map of validators. The key into
-			// the map is the IValidator instance and the value is the ValidatorMetaData
-			// which describes the IValidator.
-			readRegistry();
-
-			// Once all of the validators have been read, the caches of the
-			// validators need to be updated.
-			buildCache();
-		} catch (Throwable exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("ValidationRegistryReader()"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-		}
-	}
-
-	/**
-	 * Traverse over the list of VMDs which have been added and create copies of it. The copies are
-	 * created to increase runtime performance.
-	 */
-	private void buildCache() {
-		Iterator iterator = _indexedValidators.values().iterator();
-		while (iterator.hasNext()) {
-			ValidatorMetaData vmd = (ValidatorMetaData) iterator.next();
-			buildProjectNatureCache(vmd);
-			buildDefaultEnabledCache(vmd);
-		}
-
-		// Now add the validators which are configured on all projects,
-		// and all projects but X.
-		addRemainder();
-
-		// this temporary list isn't needed any more. All of the excluded
-		// projects have been added to the project natures which they don't exlcude.
-		_validators.remove(EXCLUDED_PROJECT);
-
-		Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-		if (logger.isLoggingLevel(Level.FINEST)) {
-			LogEntry entry = ValidationPlugin.getLogEntry();
-			entry.setSourceID("ValidationRegistryReader.buildCache()"); //$NON-NLS-1$
-			entry.setText(debug());
-			logger.write(Level.FINEST, entry);
-		}
-
-	}
-
-	/**
-	 * Build the cache of VMDs which is indexed by project nature ids. If the validator is
-	 * registered on all project types, the vmd's project nature filters will be null.
-	 */
-	private void buildProjectNatureCache(ValidatorMetaData vmd) {
-		// Build the cache with the identified project natures in validators'
-		// extensions.
-		ValidatorNameFilter[] projNatureIds = vmd.getProjectNatureFilters();
-		if (projNatureIds == null) {
-			// Can run on any project
-			add(UNKNOWN_PROJECT, vmd);
-		} else {
-			boolean noneIncluded = true; // assume that the validator does not include any project
-			// natures
-			for (int i = 0; i < projNatureIds.length; i++) {
-				ValidatorNameFilter pn = projNatureIds[i];
-				if (pn.isInclude()) {
-					noneIncluded = false;
-					add(pn.getNameFilter(), vmd);
-				}
-			}
-
-			if (noneIncluded) {
-				// add it to the list of EXCLUDED projects
-				// (that is, a validator which excludes project natures but doesn't
-				// explicitly include any. This type of validator runs on any unrecognized (UNKNOWN)
-				// projects, but the rest of the cache needs to be built before this is added
-				// to the UNKNOWN list. See addExcludedRemainder().
-				add(EXCLUDED_PROJECT, vmd);
-			}
-		}
-	}
-
-	/**
-	 * Build the list of validators which are enabled by default.
-	 */
-	private void buildDefaultEnabledCache(ValidatorMetaData vmd) {
-		if (vmd == null) {
-			return;
-		}
-
-		if (vmd.isEnabledByDefault()) {
-			_defaultEnabledValidators.add(vmd);
-		}
-	}
-
-	/**
-	 * Add vmd to the list of validators, indexed by validator class name
-	 */
-	private void add(ValidatorMetaData vmd) {
-		if (vmd == null) {
-			return;
-		}
-
-		_indexedValidators.put(vmd.getValidatorUniqueName(), vmd);
-	}
-
-	/*
-	 * Some validators can run on any type of project. In order to have a static list, add the "any
-	 * project" validators to each "project nature" validators' list. This avoids adding the "any
-	 * project" validators to the "project nature" validators at runtime, which results in
-	 * performance savings.
-	 * 
-	 * Some validators run on any type of project but X, where X is an excluded project nature.
-	 * Those validators should also be added via this method.
-	 */
-	private void addRemainder() {
-		// First, add all "can-run-on-any-project-type" to every registered project nature type in
-		// the cache.
-		addAnyRemainder();
-
-		// Then add the "can-run-on-any-project-type-but-X" to every non-X registered project nature
-		// type in the cache.
-		addExcludedRemainder();
-	}
-
-	private void addExcludedRemainder() {
-		Set excludedProjVmds = (Set) _validators.get(EXCLUDED_PROJECT);
-		if (excludedProjVmds == null) {
-			// no excluded project natures
-			return;
-		}
-
-		Iterator exIterator = excludedProjVmds.iterator();
-		while (exIterator.hasNext()) {
-			ValidatorMetaData vmd = (ValidatorMetaData) exIterator.next();
-
-			boolean noneIncluded = true; // assume that, by default, if someone explicitly excludes
-			// a project nature then they don't include any project
-			// natures
-			Set keys = _validators.keySet();
-			Iterator iterator = keys.iterator();
-			while (iterator.hasNext()) {
-				String projId = (String) iterator.next();
-				if (projId.equals(UNKNOWN_PROJECT) || projId.equals(EXCLUDED_PROJECT)) {
-					// Don't add list to a project nature which is excluded or applicable to all.
-					continue;
-				}
-
-				ValidatorNameFilter filter = vmd.findProjectNature(projId);
-				if (filter != null) {
-					// Don't add list to itself (filter.isIncluded() == true) or
-					// to a list from which it's excluded (filter.isIncluded() == false)
-					if (filter.isInclude()) {
-						noneIncluded = false;
-					}
-					continue;
-				}
-
-				add(projId, vmd);
-			}
-
-			if (noneIncluded) {
-				// At this point, the "can-run-on-any-project" becomes
-				// "not-excluded-on-these-projects". That is, if the project
-				// nature id isn't in the list of _validators, then it isn't
-				// included or excluded by any validators, so all validators
-				// which can run on any project AND all validators which can
-				// run on any but certain excluded projects can run on the
-				// given IProject.
-				add(UNKNOWN_PROJECT, vmd);
-			}
-		}
-	}
-
-	private void addAnyRemainder() {
-		Set anyProjVmds = (Set) _validators.get(UNKNOWN_PROJECT);
-		if (anyProjVmds == null) {
-			// no validators run on all projects
-			return;
-		}
-
-		Set keys = _validators.keySet();
-		Iterator iterator = keys.iterator();
-		while (iterator.hasNext()) {
-			String projId = (String) iterator.next();
-			if (projId.equals(UNKNOWN_PROJECT) || projId.equals(EXCLUDED_PROJECT)) {
-				// Don't add list to itself or to a project nature which is excluded.
-				continue;
-			}
-
-			add(projId, anyProjVmds);
-		}
-	}
-
-	private void add(String projectNatureId, Set vmdList) {
-		if ((vmdList == null) || (vmdList.size() == 0)) {
-			return;
-		}
-
-		Set pnVal = createSet(projectNatureId); // whether the validator includes or excludes this
-		// project nature id, make sure that an entry is
-		// created for it in the table
-		pnVal.addAll(vmdList);
-		_validators.put(projectNatureId, pnVal);
-	}
-
-	private void add(String projectNatureId, ValidatorMetaData vmd) {
-		if (vmd == null) {
-			return;
-		}
-
-		Set pnVal = createSet(projectNatureId); // whether the validator includes or excludes this
-		// project nature id, make sure that an entry is
-		// created for it in the table
-		pnVal.add(vmd);
-		_validators.put(projectNatureId, pnVal);
-	}
-
-	/**
-	 * When a validator's class or helper class cannot be loaded, the vmd calls this method to
-	 * disable the validator. The validator will be removed from the preference page, properties
-	 * page, and enabled list of any project thereafter validated.
-	 */
-	public void disableValidator(ValidatorMetaData vmd) {
-		_indexedValidators.remove(vmd.getValidatorUniqueName());
-		_defaultEnabledValidators.remove(vmd);
-
-		// The whole "on-any-project" and "exclude-this-project-nature" would take
-		// a lot of processing time... Instead, traverse the list of proj nature ids,
-		// and search the Set of that proj nature id, and remove the vmd if it's in the
-		// Set.
-		Object[] keys = _validators.keySet().toArray();
-		for (int i = 0; i < keys.length; i++) {
-			Object key = keys[i];
-			Set value = (Set) _validators.get(key);
-			if (value == null) {
-				continue;
-			}
-
-			if (value.contains(vmd)) {
-				value.remove(vmd);
-				_validators.put(key, value);
-			}
-		}
-	}
-
-	private Set createSet(String projNature) {
-		Set v = (Set) _validators.get(projNature);
-		if (v == null) {
-			v = new HashSet();
-		}
-		return v;
-	}
-
-	/**
-	 * Given an IConfigurationElement, if it has a project nature(s) specified, return the
-	 * ValidatorNameFilters which represent those natures. Otherwise return null.
-	 * 
-	 * A project nature can be specified in plugin.xml to indicate what types of IProjects a
-	 * validator can run on.
-	 */
-	private String[] getAggregateValidatorsNames(IConfigurationElement element) {
-		IConfigurationElement[] filters = element.getChildren(TAG_AGGREGATE_VALIDATORS);
-		if (filters.length == 0)
-			return null;
-
-		String[] names = new String[filters.length];
-		for (int i = 0; i < names.length; i++) {
-			// In order to speed up our String comparisons, load these
-			// names into Java's constants space. This way, we'll be able to
-			// use pointer comparison instead of the traditional
-			// character-by-character comparison. Since these names should
-			// never be set by anyone other than this class, and this class
-			// sets them only once, it is safe to declare these Strings
-			// constants.
-			//
-			// To load a String into the constants space, call intern() on the String.
-			//
-			String nameFilter = filters[i].getAttribute(ATT_CLASS);
-			if (nameFilter != null) {
-				nameFilter = nameFilter.intern();
-			}
-			names[i] = nameFilter;
-		}
-		return names;
-	}
-
-	/**
-	 * Given an IConfigurationElement from plugin.xml, if it has any filter tags, construct the
-	 * appropriate ValidatorFilters to represent those tags; else return null.
-	 * 
-	 * A filter can be specified in plugin.xml to filter out certain resources.
-	 */
-	private ValidatorFilter[] getFilters(IConfigurationElement element) {
-		IConfigurationElement[] filters = element.getChildren(TAG_FILTER);
-		if (filters.length == 0)
-			return null;
-
-		ValidatorFilter[] vf = new ValidatorFilter[filters.length];
-		for (int i = 0; i < filters.length; i++) {
-			vf[i] = new ValidatorFilter(IRESOURCE);
-
-			// In order to speed up our String comparisons, load these
-			// names into Java's constants space. This way, we'll be able to
-			// use pointer comparison instead of the traditional
-			// character-by-character comparison. Since these names should
-			// never be set by anyone other than this class, and this class
-			// sets them only once, it is safe to declare these Strings
-			// constants.
-			//
-			// To load a String into the constants space, call intern() on the String.
-			//
-			String nameFilter = filters[i].getAttribute(ATT_NAME_FILTER);
-			if (nameFilter != null) {
-				nameFilter = nameFilter.intern();
-			}
-			String isCaseSensitive = filters[i].getAttribute(ATT_CASE_SENSITIVE);
-			vf[i].setNameFilter(nameFilter, isCaseSensitive);
-
-			String objectClass = filters[i].getAttribute(ATT_OBJECT_CLASS);
-			if (objectClass != null) {
-				objectClass = objectClass.intern();
-			}
-			vf[i].setTypeFilter(objectClass);
-
-			String actionFilter = filters[i].getAttribute(ATT_ACTION_FILTER);
-			if (actionFilter != null) {
-				actionFilter = actionFilter.intern();
-			}
-			vf[i].setActionFilter(actionFilter);
-		}
-		return vf;
-	}
-
-	public boolean getDependentValidatorValue(IConfigurationElement element) {
-		IConfigurationElement[] depValidatorElement = element.getChildren(DEP_VALIDATOR);
-		if (depValidatorElement.length == 0)
-			return false;
-		String depValue = depValidatorElement[0].getAttribute(DEP_VAL_VALUE);
-		boolean depBoolValue = (new Boolean(depValue)).booleanValue();
-		return depBoolValue;
-	}
-
-	/**
-	 * Return the name of the marker ID associated with the IValidator.
-	 */
-	public String getMarkerIdValue(IConfigurationElement element) {
-		IConfigurationElement[] markerId = element.getChildren(MARKER_ID);
-		if (markerId.length == 0)
-			return null;
-		return markerId[0].getAttribute(MARKER_ID_VALUE);
-	}
-
-	/**
-	 * Return the name of the helper class associated with the IValidator.
-	 */
-	private String getHelperName(IConfigurationElement element) {
-		IConfigurationElement[] helpers = element.getChildren(TAG_HELPER_CLASS);
-		if (helpers.length == 0)
-			return null;
-
-		return helpers[0].getAttribute(ATT_CLASS);
-	}
-
-	/* package */static IWorkbenchContext createHelper(IConfigurationElement element, String helperClassName) {
-		IWorkbenchContext wh = null;
-		try {
-			wh = (IWorkbenchContext) element.createExecutableExtension(TAG_HELPER_CLASS);
-		} catch (Throwable exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("ValidationRegistryReader.createHelper(IConfigurationElement, String)"); //$NON-NLS-1$
-				entry.setMessageTypeIdentifier(ResourceConstants.VBF_EXC_SYNTAX_NO_HELPER_THROWABLE);
-				entry.setTargetException(exc);
-				String result = MessageFormat.format(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_SYNTAX_NO_HELPER_THROWABLE), new String[]{helperClassName});
-				entry.setText(result);				
-				//entry.setTokens(new String[]{helperClassName});
-				logger.write(Level.SEVERE, entry);
-			}
-			return null;
-		}
-		return wh;
-	}
-
-	/* package */static IValidator createValidator(IConfigurationElement element, String validatorClassName) {
-		IValidator validator = null;
-		try {
-			validator = (IValidator) element.createExecutableExtension(TAG_RUN_CLASS);
-		} catch (Throwable exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("ValidationRegistryReader.createValidator(IConfigurationElement, String, String)"); //$NON-NLS-1$
-				entry.setMessageTypeID(ResourceConstants.VBF_EXC_SYNTAX_NO_VAL_THROWABLE);
-				//entry.setTokens(new String[]{validatorClassName});
-				String result = MessageFormat.format(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_SYNTAX_NO_VAL_THROWABLE), new String[]{validatorClassName});
-				entry.setText(result);				
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-		}
-
-		if (validator == null) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.FINE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("ValidationRegistryReader.createValidator(IConfigurationElement, String)"); //$NON-NLS-1$
-				entry.setMessageTypeID(ResourceConstants.VBF_EXC_SYNTAX_NO_VAL_NULL);
-				entry.setTokens(new String[]{validatorClassName});
-				logger.write(Level.FINE, entry);
-			}
-			return null;
-		}
-
-		return validator;
-	}
-
-	/**
-	 * Given an IConfigurationElement from plugin.xml, return whether or not the validator is
-	 * enabled by default.
-	 * 
-	 * If no enabled attribute is specified, the default, true (i.e., enabled) is returned.
-	 */
-	private boolean getEnabledByDefault(IConfigurationElement element) {
-		IConfigurationElement[] runChildren = element.getChildren(TAG_RUN_CLASS);
-		// Don't need to check if runChildren is null or empty, because that was checked in the
-		// initializeValidator method.
-
-		String inc = runChildren[0].getAttribute(ATT_ENABLED);
-		if (inc == null) {
-			return RegistryConstants.ATT_ENABLED_DEFAULT;
-		}
-
-		return Boolean.valueOf(inc.trim().toLowerCase()).booleanValue(); // this will return true
-		// if, and only if, the
-		// attribute value is
-		// "true". For example,
-		// "yes" will be considered
-		// "false".
-	}
-
-	/**
-	 * Given an IConfigurationElement from plugin.xml, return whether or not the validator supports
-	 * incremental validation.
-	 * 
-	 * If no incremental attribute is specified, the default, true (i.e., incremental is supported)
-	 * is returned.
-	 */
-	private boolean getIncremental(IConfigurationElement element) {
-		IConfigurationElement[] runChildren = element.getChildren(TAG_RUN_CLASS);
-		// Don't need to check if runChildren is null or empty, because that was checked in the
-		// initializeValidator method.
-
-		String inc = runChildren[0].getAttribute(ATT_INCREMENTAL);
-		if (inc == null) {
-			return RegistryConstants.ATT_INCREMENTAL_DEFAULT;
-		}
-
-		return Boolean.valueOf(inc.trim().toLowerCase()).booleanValue(); // this will return true
-		// if, and only if, the
-		// attribute value is
-		// "true". For example,
-		// "yes" will be considered
-		// "false".
-	}
-
-	/**
-	 * Given an IConfigurationElement from plugin.xml, return whether or not the validator supports
-	 * full build validation.
-	 * 
-	 * If no incremental attribute is specified, the default, true (i.e., incremental is supported)
-	 * is returned.
-	 */
-	private boolean getFullBuild(IConfigurationElement element) {
-		IConfigurationElement[] runChildren = element.getChildren(TAG_RUN_CLASS);
-		// Don't need to check if runChildren is null or empty, because that was checked in the
-		// initializeValidator method.
-
-		String fb = runChildren[0].getAttribute(ATT_FULLBUILD);
-		if (fb == null) {
-			return RegistryConstants.ATT_FULLBUILD_DEFAULT;
-		}
-
-		return Boolean.valueOf(fb.trim().toLowerCase()).booleanValue(); // this will return true if,
-		// and only if, the
-		// attribute value is
-		// "true". For example,
-		// "yes" will be considered
-		// "false".
-	}
-
-	/**
-	 * Given an IConfigurationElement from plugin.xml, return whether or not the validator supports
-	 * asynchronous validation.
-	 * 
-	 * If no async attribute is specified, the default, true (i.e., the validator is thread-safe) is
-	 * returned.
-	 */
-	private boolean getAsync(IConfigurationElement element) {
-		IConfigurationElement[] runChildren = element.getChildren(TAG_RUN_CLASS);
-		// Don't need to check if runChildren is null or empty, because that was checked in the
-		// initializeValidator method.
-
-		String async = runChildren[0].getAttribute(ATT_ASYNC);
-		if (async == null) {
-			return RegistryConstants.ATT_ASYNC_DEFAULT;
-		}
-
-		return Boolean.valueOf(async.trim().toLowerCase()).booleanValue(); // this will return true
-		// if, and only if, the
-		// attribute value is
-		// "true". For example,
-		// "yes" will be
-		// considered "false".
-	}
-
-	/**
-	 * Given an IConfigurationElement from plugin.xml, return the types of validation passes, as
-	 * defined in IRuleGroup, that the validator performs.
-	 * 
-	 * If no pass attribute is specified, the default, IRuleGroup.PASS_FULL, is returned.
-	 */
-	private int getRuleGroup(IConfigurationElement element) {
-		IConfigurationElement[] runChildren = element.getChildren(TAG_RUN_CLASS);
-		// Don't need to check if runChildren is null or empty, because that was checked in the
-		// initializeValidator method.
-
-		String pass = runChildren[0].getAttribute(ATT_RULE_GROUP);
-		if (pass == null) {
-			return RegistryConstants.ATT_RULE_GROUP_DEFAULT;
-		}
-
-		final String COMMA = ","; //$NON-NLS-1$
-		StringTokenizer tokenizer = new StringTokenizer(pass, COMMA, false); // false means don't
-		// return the comma as
-		// part of the string
-		int result = 0; // no passes identified
-		while (tokenizer.hasMoreTokens()) {
-			String nextAction = tokenizer.nextToken().trim();
-			if (nextAction.equals(IRuleGroup.PASS_FAST_NAME)) {
-				result = result | IRuleGroup.PASS_FAST;
-			} else if (nextAction.equals(IRuleGroup.PASS_FULL_NAME)) {
-				result = result | IRuleGroup.PASS_FULL;
-			}
-		}
-
-		if (result == 0) {
-			// No recognized passes. Return the default.
-			return RegistryConstants.ATT_RULE_GROUP_DEFAULT;
-		}
-
-		return result;
-	}
-
-	private ValidatorMetaData.MigrationMetaData getMigrationMetaData(IConfigurationElement element, ValidatorMetaData vmd) {
-		IConfigurationElement[] runChildren = element.getChildren(TAG_MIGRATE);
-		if ((runChildren == null) || (runChildren.length == 0)) {
-			return null;
-		}
-
-		// Only supposed to be one "migrate" section in a validator, so ignore the rest
-		IConfigurationElement migrate = runChildren[0];
-
-		// Now look for the "validator" elements. Zero or more can be specified.
-		IConfigurationElement[] migrateChildren = migrate.getChildren(TAG_VALIDATOR);
-		if ((migrateChildren == null) || (migrateChildren.length == 0)) {
-			return null;
-		}
-
-		ValidatorMetaData.MigrationMetaData mmd = vmd.new MigrationMetaData();
-		for (int i = 0; i < migrateChildren.length; i++) {
-			IConfigurationElement migrateChild = migrateChildren[i];
-			String from = migrateChild.getAttribute(ATT_FROM);
-			if (from == null) {
-				continue;
-			}
-
-			String to = migrateChild.getAttribute(ATT_TO);
-			if (to == null) {
-				continue;
-			}
-			mmd.addId(from, to);
-		}
-		return mmd;
-	}
-
-	/**
-	 * Given an IConfigurationElement, if it has a project nature(s) specified, return the
-	 * ValidatorNameFilters which represent those natures. Otherwise return null.
-	 * 
-	 * A project nature can be specified in plugin.xml to indicate what types of IProjects a
-	 * validator can run on.
-	 */
-	private ValidatorNameFilter[] getProjectNatureFilters(IConfigurationElement element) {
-		IConfigurationElement[] filters = element.getChildren(TAG_PROJECT_NATURE);
-		if (filters.length == 0) {
-			return null;
-		}
-
-		ValidatorNameFilter[] vf = new ValidatorNameFilter[filters.length];
-		for (int i = 0; i < filters.length; i++) {
-			vf[i] = new ValidatorNameFilter();
-			// In order to speed up our String comparisons, load these
-			// names into Java's constants space. This way, we'll be able to
-			// use pointer comparison instead of the traditional
-			// character-by-character comparison. Since these names should
-			// never be set by anyone other than this class, and this class
-			// sets them only once, it is safe to declare these Strings
-			// constants.
-			//
-			// To load a String into the constants space, call intern() on the String.
-			//
-			String nameFilter = filters[i].getAttribute(ATT_ID);
-			if (nameFilter != null) {
-				nameFilter = nameFilter.intern();
-			}
-			vf[i].setNameFilter(nameFilter);
-
-			String include = filters[i].getAttribute(ATT_INCLUDE);
-			vf[i].setInclude(include);
-		}
-		return vf;
-	}
-
-	/**
-	 * Returns the singleton ValidationRegistryReader.
-	 */
-	public static ValidationRegistryReader getReader() {
-		if (inst == null) {
-			inst = new ValidationRegistryReader();
-
-			EventManager.getManager().setActive(true);
-		}
-		return inst;
-	}
-
-	public static boolean isActivated() {
-		// Whether the registry has been read or not is kept in the EventManager
-		// class instead of this class in order to work around a shutdown problem.
-		// See the comment in the isActive() method of the EventManager class
-		// for details.
-		return EventManager.getManager().isActive();
-	}
-
-	/**
-	 * Returns the Validator extension point
-	 */
-	private IExtensionPoint getValidatorExtensionPoint() {
-		IExtensionRegistry registry = Platform.getExtensionRegistry();
-		IExtensionPoint extensionPoint = registry.getExtensionPoint(PLUGIN_ID, VALIDATOR_EXT_PT_ID);
-		if (extensionPoint == null) {
-			// If this happens it means that someone removed the "validator" extension point
-			// declaration
-			// from our plugin.xml file.
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.FINE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("ValidationRegistryReader.getValidatorExtensionPoint()"); //$NON-NLS-1$
-				entry.setMessageTypeID(ResourceConstants.VBF_EXC_MISSING_VALIDATOR_EP);
-				//entry.setTokens(new String[]{ValidationPlugin.PLUGIN_ID + "." + VALIDATOR_EXT_PT_ID}); //$NON-NLS-1$
-				String result = MessageFormat.format(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_MISSING_VALIDATOR_EP),
-						new String[]{ValidationPlugin.PLUGIN_ID + "." + VALIDATOR_EXT_PT_ID});
-				entry.setText(result);		
-				logger.write(Level.FINE, entry);
-			}
-		}
-		return extensionPoint;
-	}
-
-	/**
-	 * It's okay to return a handle to the ValidatorMetaData because the vmd can't be modified by
-	 * any code not in this package.
-	 */
-	public ValidatorMetaData getValidatorMetaData(IValidator validator) {
-		// retrieval will be in log(n) time
-		if (validator == null) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("ValidationRegistryReader.getValidatorMetaData(IValidator)"); //$NON-NLS-1$
-				entry.setText(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_ORPHAN_IVALIDATOR, new String[]{"null"})); //$NON-NLS-1$
-				logger.write(Level.SEVERE, entry);
-			}
-			return null;
-		}
-
-		String validatorClassName = validator.getClass().getName();
-		ValidatorMetaData vmd = getValidatorMetaData(validatorClassName);
-		if (vmd != null) {
-			return vmd;
-		}
-
-		// If we got here, then vmd is neither a root nor an aggregate validator,
-		// yet the IValidator exists. Internal error.
-		Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-		if (logger.isLoggingLevel(Level.SEVERE)) {
-			LogEntry entry = ValidationPlugin.getLogEntry();
-			entry.setSourceID("ValidationRegistryReader.getValidatorMetaData(IValidator)"); //$NON-NLS-1$
-			entry.setText(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_ORPHAN_IVALIDATOR, new String[]{validatorClassName}));
-			logger.write(Level.SEVERE, entry);
-		}
-		return null;
-	}
-
-	public Set getValidatorMetaData(IWorkspaceRoot root) {
-		// Every validator on the Preferences page must be returned
-		Set copy = new HashSet();
-		clone(_indexedValidators.values(), copy);
-		return copy;
-	}
-
-	/**
-	 * Return a collection of Validators configured on a certain type of IProject (e.g. EJB Project
-	 * vs. Web Project).
-	 * 
-	 * This is a long-running process. If you can, cache the result.
-	 */
-	public Set getValidatorMetaData(IProject project) {
-		Set copy = new HashSet();
-		getValidatorMetaData(project, copy);
-		return copy;
-	}
-
-	/**
-	 * Copy the set of configured validator metadata into the Set.
-	 */
-	public void getValidatorMetaData(IProject project, Set vmds) {
-		if (vmds == null) {
-			return;
-		}
-		vmds.clear();
-		int executionMap = 0x0;
-		Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-		try {
-			if (logger.isLoggingLevel(Level.FINEST)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("ValidationRegistryReader.getValidatorMetaData(IProject)"); //$NON-NLS-1$
-				entry.setText("IProject is " + String.valueOf(project)); //$NON-NLS-1$
-				logger.write(Level.FINEST, entry);
-			}
-
-			if (project == null) {
-				executionMap |= 0x1;
-				// vmds is already clear
-				return;
-			}
-
-			String[] projectNatures = null;
-			try {
-				projectNatures = project.getDescription().getNatureIds();
-			} catch (CoreException exc) {
-				executionMap |= 0x2;
-				// vmds is already clear
-				if (logger.isLoggingLevel(Level.SEVERE)) {
-					LogEntry entry = ValidationPlugin.getLogEntry();
-					entry.setSourceID("ValidationRegistryReader.getValidatorMetaData(" + project.getName() + ")"); //$NON-NLS-1$  //$NON-NLS-2$
-					entry.setTargetException(exc);
-					entry.setExecutionMap(executionMap);
-					logger.write(Level.SEVERE, entry);
-				}
-				return;
-			}
-
-			// If there are no project natures on a particular project,
-			// or if this project nature has no validators configured
-			// on it, return the validators which are configured on all
-			// projects.
-			Set projVmds = null;
-			if ((projectNatures == null) || (projectNatures.length == 0)) {
-				executionMap |= 0x4;
-				clone(getValidatorMetaDataUnknownProject(), vmds);
-			} else {
-				executionMap |= 0x8;
-				if (logger.isLoggingLevel(Level.FINEST)) {
-					LogEntry entry = ValidationPlugin.getLogEntry();
-					entry.setSourceID("ValidationRegistryReader.getValidatorMetaData(IProject)"); //$NON-NLS-1$
-					//entry.setTokens(projectNatures);
-					entry.setText(projectNatures.toString());
-					logger.write(Level.FINEST, entry);
-				}
-
-				for (int i = 0; i < projectNatures.length; i++) {
-					String projectNatureId = projectNatures[i];
-					projVmds = (Set) _validators.get(projectNatureId);
-
-					if (projVmds == null) {
-						// no validators registered for that type of project id
-						executionMap |= 0x10;
-						continue;
-					}
-
-					Iterator iterator = projVmds.iterator();
-					while (iterator.hasNext()) {
-						ValidatorMetaData vmd = (ValidatorMetaData) iterator.next();
-						if (!vmds.contains(vmd)) {
-							vmds.add(vmd);
-						}
-					}
-				}
-
-				// Now filter out the validators which must not run on this project
-				removeExcludedProjects(project, vmds);
-
-				if (vmds.size() == 0) {
-					executionMap |= 0x20;
-					clone(getValidatorMetaDataUnknownProject(), vmds);
-				}
-			}
-		} finally {
-			if (logger.isLoggingLevel(Level.FINER)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("ValidationRegistryReader.getValidatorMetaData(IProject)"); //$NON-NLS-1$
-				entry.setExecutionMap(executionMap);
-
-				StringBuffer buffer = new StringBuffer();
-				Iterator iterator = vmds.iterator();
-				while (iterator.hasNext()) {
-					ValidatorMetaData vmd = (ValidatorMetaData) iterator.next();
-					buffer.append(vmd.getValidatorUniqueName());
-					buffer.append("\n"); //$NON-NLS-1$
-				}
-				entry.setText(buffer.toString());
-				logger.write(Level.FINER, entry);
-			}
-		}
-	}
-
-	/*
-	 * If one project nature on the project includes a particular validator, but another project
-	 * nature excludes that validator, then the validator needs to be removed from the vmd set.
-	 * 
-	 * For example, if AValidator can run on any java project but not on a J2EE project, which is an
-	 * instance of a java project, then the AValidator is included by the java nature and excluded
-	 * by the J2EE nature. The AValidator would have to be removed from the set.
-	 */
-	private void removeExcludedProjects(IProject project, Set vmds) {
-		Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-		if (logger.isLoggingLevel(Level.FINEST)) {
-			LogEntry entry = ValidationPlugin.getLogEntry();
-			entry.setSourceID("ValidationRegistryReader.removeExcludedProjects"); //$NON-NLS-1$
-
-			StringBuffer buffer = new StringBuffer("\nBefore:\n"); //$NON-NLS-1$
-			Iterator viterator = vmds.iterator();
-			while (viterator.hasNext()) {
-				ValidatorMetaData vmd = (ValidatorMetaData) viterator.next();
-				buffer.append(vmd.getValidatorUniqueName());
-				buffer.append("\n"); //$NON-NLS-1$
-			}
-			entry.setText(buffer.toString());
-			logger.write(Level.FINEST, entry);
-		}
-
-		String[] projectNatures = null;
-		try {
-			projectNatures = project.getDescription().getNatureIds();
-		} catch (CoreException exc) {
-			// if there's no natures, there's no list.
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("ValidationRegistryReader.getValidatorMetaData(" + project.getName() + ")"); //$NON-NLS-1$  //$NON-NLS-2$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-			return;
-		}
-		if ((projectNatures == null) || (projectNatures.length == 0)) {
-			// nothing needs to be removed from the list
-			return;
-		}
-
-		// First of all, clone the Set because we need to remove entries
-		// from it, and we can't alter the set while we're iterating over
-		// it.
-		List tempList = getTempList();
-		clone(vmds, tempList);
-
-		for (int i = 0; i < projectNatures.length; i++) {
-			String nature = projectNatures[i];
-			Iterator iterator = tempList.iterator();
-			while (iterator.hasNext()) {
-				ValidatorMetaData vmd = (ValidatorMetaData) iterator.next();
-				ValidatorNameFilter[] natureFilters = vmd.getProjectNatureFilters();
-				if (natureFilters == null) {
-					// Can run on any project
-					continue;
-				}
-
-				for (int j = 0; j < natureFilters.length; j++) {
-					ValidatorNameFilter pn = natureFilters[j];
-					if (nature.equals(pn.getNameFilter()) && !pn.isInclude()) {
-						vmds.remove(vmd);
-					}
-				}
-			}
-		}
-
-		if (logger.isLoggingLevel(Level.FINEST)) {
-			LogEntry entry = ValidationPlugin.getLogEntry();
-			entry.setSourceID("ValidationRegistryReader.removeExcludedProjects"); //$NON-NLS-1$
-
-			StringBuffer buffer = new StringBuffer("\nAfter:\n"); //$NON-NLS-1$
-			Iterator viterator = vmds.iterator();
-			while (viterator.hasNext()) {
-				ValidatorMetaData vmd = (ValidatorMetaData) viterator.next();
-				buffer.append(vmd.getValidatorUniqueName());
-				buffer.append("\n"); //$NON-NLS-1$
-			}
-			entry.setText(buffer.toString());
-			logger.write(Level.FINEST, entry);
-		}
-	}
-
-	private Collection clone(Collection input, Collection copy) {
-		if (input == null) {
-			return null;
-		}
-
-		if (copy == null) {
-			return null;
-		}
-		copy.clear();
-		copy.addAll(input);
-		return copy;
-	}
-
-	public String debug() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("Project nature => validators configured"); //$NON-NLS-1$
-		buffer.append("\n"); //$NON-NLS-1$
-		Iterator viterator = _validators.keySet().iterator();
-		while (viterator.hasNext()) {
-			String projId = (String) viterator.next();
-			buffer.append("projId: "); //$NON-NLS-1$
-			buffer.append(projId);
-			buffer.append("\n"); //$NON-NLS-1$
-			Set validators = (Set) _validators.get(projId);
-			Iterator innerIterator = validators.iterator();
-			while (innerIterator.hasNext()) {
-				ValidatorMetaData vmd = (ValidatorMetaData) innerIterator.next();
-				buffer.append("\t"); //$NON-NLS-1$
-				buffer.append(vmd.getValidatorUniqueName());
-				buffer.append("\n"); //$NON-NLS-1$
-			}
-		}
-		buffer.append("\n"); //$NON-NLS-1$
-
-		buffer.append("Enable/disable validator by default"); //$NON-NLS-1$
-		buffer.append("\n"); //$NON-NLS-1$
-		viterator = _indexedValidators.values().iterator();
-		while (viterator.hasNext()) {
-			ValidatorMetaData vmd = (ValidatorMetaData) viterator.next();
-			buffer.append(vmd.getValidatorUniqueName());
-			buffer.append(" enabled? "); //$NON-NLS-1$
-			buffer.append(vmd.isEnabledByDefault());
-			buffer.append("\n"); //$NON-NLS-1$
-		}
-
-		return buffer.toString();
-	}
-
-	public boolean isConfiguredOnProject(ValidatorMetaData vmd, IProject project) {
-		if (projectValidationMetaData == null)
-			projectValidationMetaData = new HashMap();
-
-		Object vmds = projectValidationMetaData.get(project);
-		if (vmds != null) {
-			Set pvmds = (Set) vmds;
-			return pvmds.contains(vmd);
-		} else {
-			Set prjVmds = getValidatorMetaData(project);
-			if (prjVmds == null) {
-				return false;
-			}
-
-			if (prjVmds.size() == 0) {
-				return false;
-			}
-			projectValidationMetaData.put(project, prjVmds);
-			return prjVmds.contains(vmd);
-		}
-	}
-
-	/**
-	 * Return a set of ValidatorMetaData which are configured on all projects or which run on any
-	 * projects except certain project types.
-	 * 
-	 * Unlike other get methods, because this method is private it doesn't return a clone.
-	 * 
-	 * @see addExcludedRemainder()
-	 */
-	private Set getValidatorMetaDataUnknownProject() {
-		Set projVmds = (Set) _validators.get(UNKNOWN_PROJECT);
-		if (projVmds == null) {
-			projVmds = Collections.EMPTY_SET;
-		}
-		return projVmds;
-	}
-
-	/**
-	 * Return a set of ValidatorMetaData which are enabled by default.
-	 */
-	public Set getValidatorMetaDataEnabledByDefault() {
-		Set copy = new HashSet();
-		clone(_defaultEnabledValidators, copy);
-		return copy;
-	}
-
-	public ValidatorMetaData[] getValidatorMetaDataArrayEnabledByDefault() {
-		ValidatorMetaData[] result = new ValidatorMetaData[_defaultEnabledValidators.size()];
-		_defaultEnabledValidators.toArray(result);
-		return result;
-	}
-
-	/**
-	 * This method should be called ONLY by the validation framework, UI, or TVT plugin. In general,
-	 * only the validation framework and the validation TVT should handle ValidatorMetaData objects.
-	 * 
-	 * Given a string which identifies a fully-qualified class name of a validator, return the
-	 * ValidatorMetaData that uses a validator of that name, if it exists.
-	 * 
-	 * It's okay to return a handle to the ValidatorMetaData because the vmd can't be modified by
-	 * any code not in this package.
-	 */
-	public ValidatorMetaData getValidatorMetaData(String validatorClassName) {
-		if (validatorClassName == null) {
-			return null;
-		}
-
-		ValidatorMetaData vmd = (ValidatorMetaData) _indexedValidators.get(validatorClassName);
-		if (vmd != null) {
-			return vmd;
-		}
-
-		// Check for an aggregate validator
-		Iterator iterator = _indexedValidators.values().iterator();
-		while (iterator.hasNext()) {
-			vmd = (ValidatorMetaData) iterator.next();
-			if (vmd == null) {
-				continue;
-			}
-
-			if (vmd.getValidatorUniqueName().equals(validatorClassName)) {
-				return vmd;
-			}
-
-			String[] aggregateNames = vmd.getAggregatedValidatorNames();
-			if (aggregateNames != null) {
-				for (int i = 0; i < aggregateNames.length; i++) {
-					String aggregateName = aggregateNames[i];
-					if (validatorClassName.equals(aggregateName)) {
-						return vmd;
-					}
-				}
-			}
-
-			// Current name of validator doesn't match; has this validator been
-			// migrated from another package?
-			ValidatorMetaData.MigrationMetaData mmd = vmd.getMigrationMetaData();
-			if (mmd == null) {
-				// Validator class name hasn't been migrated
-				continue;
-			}
-
-			Set idList = mmd.getIds();
-			if (idList == null) {
-				// Invalid <migrate> element.
-				continue;
-			}
-
-			Iterator idIterator = idList.iterator();
-			while (idIterator.hasNext()) {
-				String[] ids = (String[]) idIterator.next();
-				if (ids.length != 2) {
-					// log
-					continue;
-				}
-
-				String from = ids[0];
-				if (from == null) {
-					// log
-					continue;
-				}
-
-				if (from.equals(validatorClassName)) {
-					return vmd;
-				}
-			}
-		}
-
-		// If we got to this point, no validator using that class name is loaded.
-		return null;
-	}
-
-	/**
-	 * Return true if the named validator is installed, otherwise false.
-	 */
-	public boolean isExistingValidator(String validatorClassName) {
-		return (getValidatorMetaData(validatorClassName) != null);
-	}
-
-	/**
-	 * Initialize the validator with the static metadata (runtime metadata is initialized in the
-	 * ValidationOperation class).
-	 */
-	private ValidatorMetaData initializeValidator(IConfigurationElement element, String validatorName, String pluginId) {
-		IConfigurationElement[] runChildren = element.getChildren(TAG_RUN_CLASS);
-		if ((runChildren == null) || (runChildren.length < 1)) {
-			// How can an IValidatorImpl be created when there no class name to
-			// instantiate?
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.FINE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("ValidationRegistryReader.initializeValidator(IConfigurationElement, String, String)"); //$NON-NLS-1$
-				entry.setMessageTypeID(ResourceConstants.VBF_EXC_SYNTAX_NO_VAL_RUN);
-				//entry.setTokens(new String[]{validatorName});
-				String result = MessageFormat.format(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_SYNTAX_NO_VAL_RUN),
-						new String[]{validatorName});
-				entry.setText(result);
-				
-				logger.write(Level.FINE, entry);
-			}
-			return null;
-		}
-
-		//WTP Bugzilla defect: 82338
-		//Using the Unique Identifier give the flexibility of the same validator class used by other validator extentions without writing a new validation class
-		//Reverting the fix back as the class name defined in the ext is unique to this validator and has to be used for the unique id in the validation metadata
-		String validatorImplName = runChildren[0].getAttribute(ATT_CLASS);
-		
-		if (validatorImplName == null) {
-			// Same as before; how can we instantiate when...
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.FINE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("ValidationRegistryReader.initializeValidator(IConfigurationElement, String, String)"); //$NON-NLS-1$
-				entry.setMessageTypeID(ResourceConstants.VBF_EXC_SYNTAX_NO_VAL_CLASS);
-				entry.setTokens(new String[]{validatorName});
-				logger.write(Level.FINE, entry);
-			}
-			return null;
-		}
-
-		String helperImplName = getHelperName(element);
-		if (helperImplName == null) {
-			// Same as before; how can we instantiate when...
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.FINE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("ValidationRegistryReader.initializeValidator(IConfigurationElement, String, String)"); //$NON-NLS-1$
-				entry.setMessageTypeID(ResourceConstants.VBF_EXC_SYNTAX_NO_VAL_RUN);
-				entry.setTokens(new String[]{validatorImplName});
-				logger.write(Level.FINE, entry);
-			}
-			return null;
-		}
-
-		// In order to speed up our String comparisons, load these
-		// names into Java's constants space. This way, we'll be able to
-		// use pointer comparison instead of the traditional
-		// character-by-character comparison. Since these names should
-		// never be set by anyone other than this class, and this class
-		// sets them only once, it is safe to declare these Strings
-		// constants.
-		//
-		// To load a String into the constants space, call intern() on the String.
-		//
-		ValidatorMetaData vmd = new ValidatorMetaData();
-		vmd.addFilters(getFilters(element)); // validator may, or may not, have filters
-		vmd.addProjectNatureFilters(getProjectNatureFilters(element)); // validator may, or may not,
-		// specify a project nature
-		vmd.addAggregatedValidatorNames(getAggregateValidatorsNames(element)); // if a validator
-		// aggregated another
-		// validator, it
-		// should identify
-		// the
-		// sub-validator(s)'
-		// class name
-		vmd.setValidatorDisplayName(validatorName.intern()); // validator must have a display name.
-		vmd.setValidatorUniqueName(validatorImplName.intern());
-		vmd.setPluginId(pluginId);
-		vmd.setIncremental(getIncremental(element));
-		vmd.setFullBuild(getFullBuild(element));
-		vmd.setAsync(getAsync(element));
-		vmd.setRuleGroup(getRuleGroup(element));
-		vmd.setEnabledByDefault(getEnabledByDefault(element));
-		vmd.setMigrationMetaData(getMigrationMetaData(element, vmd));
-		vmd.setHelperClass(element, helperImplName);
-		vmd.setValidatorClass(element); // associate the above attributes with the validator
-		vmd.addDependentValidator(getDependentValidatorValue(element));
-		String customMarkerId = getMarkerIdValue(element);
-		if(customMarkerId != null)
-		    vmd.setMarkerId(pluginId+"."+customMarkerId); //$NON-NLS-1$
-
-		Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-		if (logger.isLoggingLevel(Level.FINEST)) {
-			LogEntry entry = ValidationPlugin.getLogEntry();
-			entry.setSourceID("ValidationRegistryReader.initializeValidator(IConfigurationElement, String, String)"); //$NON-NLS-1$
-			entry.setText("validator loaded: " + validatorImplName); //$NON-NLS-1$
-			logger.write(Level.FINEST, entry);
-		}
-
-		return vmd;
-	}
-
-	private List getTempList() {
-		// Return a list for temporary use
-		if (_tempList == null) {
-			_tempList = new ArrayList();
-		} else {
-			// Prepare list for use
-			_tempList.clear();
-		}
-
-		return _tempList;
-	}
-
-	/**
-	 * This method should be called ONLY BY THE VALIDATION FRAMEWORK! The value from this method is
-	 * used to populate the validation preference page.
-	 */
-	public Collection getAllValidators() {
-		Set validators = new HashSet();
-		clone(_indexedValidators.values(), validators);
-		return validators;
-	}
-
-	public int numberOfValidators() {
-		return _indexedValidators.size();
-	}
-
-	/**
-	 * Reads one extension by looping through its configuration elements.
-	 */
-	private void readExtension(IExtension extension) {
-		IConfigurationElement[] elements = extension.getConfigurationElements();
-
-		for (int i = 0; i < elements.length; i++) {
-			IConfigurationElement element = elements[i];
-
-			String label = extension.getLabel();
-			if (label == null || label.equals("")) { //$NON-NLS-1$
-				Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-				if (logger.isLoggingLevel(Level.FINE)) {
-					String[] msgParm = {extension.getUniqueIdentifier()};
-					LogEntry entry = ValidationPlugin.getLogEntry();
-					entry.setSourceID("ValidationRegistryReader.readExtension(IExtension)"); //$NON-NLS-1$
-					entry.setMessageTypeID(ResourceConstants.VBF_EXC_VALIDATORNAME_IS_NULL);
-					//entry.setTokens(msgParm);
-					String result = MessageFormat.format(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_VALIDATORNAME_IS_NULL),
-							msgParm);
-					entry.setText(result);					
-					logger.write(Level.FINE, entry);
-				}
-			} else {
-				// If getLabel() returns an empty string, this is an illegal validator.
-				// The PropertyPage, and other status messages, need to have a displayable name for
-				// the validator.
-				String pluginId = extension.getNamespace();
-				ValidatorMetaData vmd = initializeValidator(element, label, pluginId);
-
-				if (vmd != null) {
-					// Add this validator to the list of validators; if vmd is null, the validator
-					// couldn't be created.
-					add(vmd);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Reads the registry to find the Validators which have been implemented.
-	 */
-	private void readRegistry() {
-		_validators.clear();
-
-		// Get the extensions that have been registered.
-		IExtensionPoint validatorEP = getValidatorExtensionPoint();
-		if (validatorEP == null) {
-			return;
-		}
-		IExtension[] extensions = validatorEP.getExtensions();
-
-		// find all runtime implementations
-		for (int i = 0; i < extensions.length; i++) {
-			readExtension(extensions[i]);
-		}
-	}
-
-	public IValidator getValidator(String validatorClassName) throws InstantiationException {
-		ValidatorMetaData vmd = (ValidatorMetaData) _indexedValidators.get(validatorClassName);
-		if(vmd != null)
-			return vmd.getValidator();
-		return null;
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidationSelectionHandlerRegistryReader.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidationSelectionHandlerRegistryReader.java
deleted file mode 100644
index 3876c4e..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidationSelectionHandlerRegistryReader.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Created on Nov 23, 2004
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Style - Code Templates
- */
-package org.eclipse.wst.validation.internal;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jem.util.RegistryReader;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-public class ValidationSelectionHandlerRegistryReader extends RegistryReader {
-
-	public static final String VALIDATION_SELECTION_HANDLER = "validationSelectionHandler"; //$NON-NLS-1$
-	static final String ATT_ID = "id"; //$NON-NLS-1$ 
-	static final String ATT_HANDLER_CLASS = "handlerClass"; //$NON-NLS-1$
-	static final String ATT_SELECTION_TYPE = "selectionType"; //$NON-NLS-1$
-	private static ValidationSelectionHandlerRegistryReader INSTANCE = null;
-	private List validationSelectionHandlers = null;
-	
-	/**
-	 * Default constructor
-	 */
-	public ValidationSelectionHandlerRegistryReader() {
-		super(ValidationPlugin.PLUGIN_ID, VALIDATION_SELECTION_HANDLER);
-	}
-	
-	public static ValidationSelectionHandlerRegistryReader getInstance() {
-		if (INSTANCE == null) {
-			INSTANCE = new ValidationSelectionHandlerRegistryReader();
-			INSTANCE.readRegistry();
-		}
-		return INSTANCE;
-	}
-
-	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jem.util.RegistryReader#readElement(org.eclipse.core.runtime.IConfigurationElement)
-	 */
-	public boolean readElement(IConfigurationElement element) {
-		if (!element.getName().equals(VALIDATION_SELECTION_HANDLER))
-			return false;
-		
-//		String handlerClass = element.getAttribute(ATT_HANDLER_CLASS);
-		String selectionType = element.getAttribute(ATT_SELECTION_TYPE); 
-		
-		IValidationSelectionHandler handler = null;
-		try {
-			handler = (IValidationSelectionHandler) element.createExecutableExtension(ATT_HANDLER_CLASS);
-			handler.setValidationTypeString(selectionType);
-			getValidationSelectionHandlers().add(handler);
-			return true;
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	   return false;
-	}
-	
-	private List getValidationSelectionHandlers() {
-		if (validationSelectionHandlers == null)
-			validationSelectionHandlers = new ArrayList();
-		return validationSelectionHandlers;
-	}
-	
-	public Object getExtendedType(Object selection) {
-		Object result = null;
-		for (int i=0; i<getValidationSelectionHandlers().size(); i++ ) {
-			IValidationSelectionHandler handler = (IValidationSelectionHandler) getValidationSelectionHandlers().get(i);
-			result = handler.getBaseValidationType(selection);
-			if (result != null)
-				break;
-		}
-		return result;
-	}
-}
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidatorActionFilter.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidatorActionFilter.java
deleted file mode 100644
index ee241be..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidatorActionFilter.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal;
-
-
-import java.util.StringTokenizer;
-
-import org.eclipse.core.resources.IResourceDelta;
-
-/**
- * This class stores the value of the "action" attribute in the validator's plugin.xml contribution.
- */
-public class ValidatorActionFilter {
-	public static final String ADD = "add"; //$NON-NLS-1$ // if the resource delta is an addition; this value is used in plugin.xml
-	public static final String CHANGE = "change"; //$NON-NLS-1$ // if the resource delta is a change; this value is used in plugin.xml
-	public static final String DELETE = "delete"; //$NON-NLS-1$ // if the resource delta is a removal; this value is used in plugin.xml
-	public static final int ALL_ACTIONS = (IResourceDelta.ADDED | IResourceDelta.CHANGED | IResourceDelta.REMOVED);
-
-	private int _actionType = 0; // Default to 0, so that if an invalid filter is specified, then no
-
-	// matter what the IResourceDelta is, the delta & _actionType will
-	// always == 0. (i.e., the resource will never be filtered in)
-
-	public ValidatorActionFilter() {
-		super();
-	}
-
-	/**
-	 * Return the hexadecimal number which represents the type(s) of actions which this filter
-	 * allows in.
-	 */
-	public int getActionType() {
-		// Since IResourceDelta's constants are hexadecimal numbers,
-		// it's nicer to return a corresponding hexadecimal, for bitwise OR,
-		// than it is to have three boolean methods on this class, i.e.,
-		// isAdd, isChange, isDelete.
-		return _actionType;
-	}
-
-	/**
-	 * <p>
-	 * Parse the incoming string, which is extracted from the plugin.xml file, to determine the
-	 * value of the actionType.
-	 * <p>
-	 * The string can contain one, two, or three constants. If there is more than one constant, the
-	 * constants should be separated by a comma.
-	 * <p>
-	 * These are the three constants: add, change, delete. The order that the constants are
-	 * specified in does not matter. The constants are case-sensitive; i.e., ADD is not considered
-	 * the same as add.
-	 * <p>
-	 * If the action attribute is not defined, the default behaviour is to filter in all types of
-	 * actions: add, change, delete. (i.e., the same behaviour can be achieved by specifying "add,
-	 * change, delete" as the action attribute's value.
-	 * <p>
-	 * If the action attribute is defined, and none of the constants are defined, then the filter is
-	 * invalid, and will be ignored by the Validation Framework. (If none of the actions should be
-	 * filtered in, then the filter itself should not exist.)
-	 * <p>
-	 * If the action attribute is defined, and one of the constants is defined, then the form of the
-	 * action should be like this: <br>
-	 * &nbsp;&nbsp;&nbsp;&lt;filter ... action="add"/>
-	 * <p>
-	 * If the action attribute is defined, and more than one constant is defined, then the form of
-	 * the action should be like this: <br>
-	 * &nbsp;&nbsp;&nbsp;&lt;filter ... action="add, delete"/>
-	 * <p>
-	 * If the action attribute is defined, and an unknown constant is defined, then the unknown
-	 * constant will be ignored. For example, <br>
-	 * &nbsp;&nbsp;&nbsp;&lt;filter ... action="ADD, delete"/> <br>
-	 * is the same as specifying <br>
-	 * &nbsp;&nbsp;&nbsp;&lt;filter ... action="delete"/> <br>
-	 * and if all of the constants are unknown, the filter is invalid, and will be ignored by the
-	 * Validation Framework. e.g., <br>
-	 * &nbsp;&nbsp;&nbsp;&lt;filter ... action="ADD, DELETE"/> <br>
-	 * is the same as not specifying a filter.
-	 * <p>
-	 * If the action attribute is defined, and a constant is defined more than once, the extra
-	 * constant is ignored. For example, <br>
-	 * &nbsp;&nbsp;&nbsp;&lt;filter ... action="add, change, add"/> <br>
-	 * is the same as specifying <br>
-	 * &nbsp;&nbsp;&nbsp;&lt;filter ... action="add, change"/>
-	 */
-	public void setActionTypes(String actions) {
-		if (actions == null) {
-			// user has not defined the "action" element, so default to everything
-			_actionType = ALL_ACTIONS;
-			return;
-		}
-
-		final String COMMA = ","; //$NON-NLS-1$
-		StringTokenizer tokenizer = new StringTokenizer(actions, COMMA, false); // false means don't
-		// return the comma
-		// as part of the
-		// string
-		int isAdd = 0;
-		int isChange = 0;
-		int isDelete = 0;
-		while (tokenizer.hasMoreTokens()) {
-			String nextAction = tokenizer.nextToken().trim();
-			if (nextAction.equals(ADD)) {
-				isAdd = IResourceDelta.ADDED;
-			} else if (nextAction.equals(CHANGE)) {
-				isChange = IResourceDelta.CHANGED;
-			} else if (nextAction.equals(DELETE)) {
-				isDelete = IResourceDelta.REMOVED;
-			}
-		}
-		_actionType = isAdd | isChange | isDelete;
-	}
-
-	public String toString() {
-		final String ON = "on"; //$NON-NLS-1$
-		final String OFF = "off"; //$NON-NLS-1$
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("     ActionFilter:"); //$NON-NLS-1$
-		buffer.append("          add: " + (((getActionType() & IResourceDelta.ADDED) != 0) ? ON : OFF)); //$NON-NLS-1$
-		buffer.append("          change: " + (((getActionType() & IResourceDelta.CHANGED) != 0) ? ON : OFF)); //$NON-NLS-1$
-		buffer.append("          delete: " + (((getActionType() & IResourceDelta.REMOVED) != 0) ? ON : OFF)); //$NON-NLS-1$
-		return buffer.toString();
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidatorFilter.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidatorFilter.java
deleted file mode 100644
index 8035a0c..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidatorFilter.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal;
-
-import org.eclipse.core.resources.IResource;
-
-
-
-/**
- * This class represents the plugin.xml tags, for a validator, for both name filters and type
- * filters. i.e., if an object has name filter and type filter specified, the filter filters out
- * objects which are not both of that type and named like the filter.
- */
-public class ValidatorFilter {
-	private ValidatorNameFilter _nameFilter = null;
-	private ValidatorTypeFilter _typeFilter = null;
-	private ValidatorActionFilter _actionFilter = null;
-
-	/* package */ValidatorFilter() {
-		super();
-		_nameFilter = new ValidatorNameFilter();
-		_typeFilter = new ValidatorTypeFilter();
-		_actionFilter = new ValidatorActionFilter();
-	}
-
-	/* package */ValidatorFilter(String mustImplementClass) {
-		this();
-		_nameFilter = new ValidatorNameFilter();
-		_typeFilter.setMustImplementClass(mustImplementClass);
-		_actionFilter = new ValidatorActionFilter();
-	}
-
-	public boolean isApplicableAction(int resourceDelta) {
-		return ((resourceDelta & _actionFilter.getActionType()) != 0);
-	}
-
-	/**
-	 * Returns true if the given resource's name matches the name filter.
-	 * 
-	 * e.g. if the name filter is "*.java", and this resource is "readme.txt", this method will
-	 * return false. If the resource is named "readme.java", this method will return true.
-	 */
-	/* package */boolean isApplicableName(IResource resource) {
-		return _nameFilter.isApplicableName(resource);
-	}
-
-	/**
-	 * Returns true if the given resource's type matches the type filter.
-	 * 
-	 * e.g. if the type filter is "IFile", and this resource is "IProject", this method will return
-	 * false. If the resource is an IFile, this method will return true.
-	 */
-	/* package */boolean isApplicableType(IResource resource) {
-		return _typeFilter.isApplicableType(resource);
-	}
-
-	public void setActionFilter(String actions) {
-		_actionFilter.setActionTypes(actions);
-	}
-
-	/**
-	 * Sets the name filter.
-	 */
-	/* package */void setNameFilter(String filter, String isCaseSensitiveString) {
-		_nameFilter.setNameFilter(filter);
-		if(filter != null)
-			  _nameFilter.setNameFilterExtension(getFilterExt(filter));
-		_nameFilter.setCaseSensitive(isCaseSensitiveString);
-	}
-	
-	private String getFilterExt(String filter) {
-		return filter.substring(filter.indexOf(".") + 1);
-	}
-	
-
-	/**
-	 * Sets the type filter.
-	 */
-	/* package */void setTypeFilter(String filter) {
-		_typeFilter.setTypeFilter(filter);
-	}
-
-	public String toString() {
-		final String lineSep = System.getProperty("line.separator"); //$NON-NLS-1$
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("ValidatorFilter:"); //$NON-NLS-1$
-		buffer.append(lineSep);
-		buffer.append("     nameFilter = " + _nameFilter); //$NON-NLS-1$
-		buffer.append(lineSep);
-		buffer.append("     typeFilter = " + _typeFilter); //$NON-NLS-1$
-		buffer.append(lineSep);
-		buffer.append("     actionFilter = " + _actionFilter); //$NON-NLS-1$
-		buffer.append(lineSep);
-		return buffer.toString();
-	}
-
-	/**
-	 * @return Returns the _nameFilter.
-	 */
-	public ValidatorNameFilter get_nameFilter() {
-		return _nameFilter;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidatorMetaData.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidatorMetaData.java
deleted file mode 100644
index 9c231ae..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidatorMetaData.java
+++ /dev/null
@@ -1,510 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal;
-
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.validation.internal.operations.IWorkbenchContext;
-import org.eclipse.wst.validation.internal.operations.WorkbenchContext;
-import org.eclipse.wst.validation.internal.plugin.ValidationHelperRegistryReader;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-import org.eclipse.wst.validation.internal.provisional.core.IValidator;
-import org.osgi.framework.Bundle;
-
-/**
- * This class stores information, as specified by a validator's plugin.xml tags. There is one
- * ValidatorMetaData for each Validator. No Validator should attempt to access its
- * ValidatorMetaData; it is for use by the base framework only.
- */
-public class ValidatorMetaData {
-	private ValidatorFilter[] _filters = null;
-	private ValidatorNameFilter[] _projectNatureFilters = null;
-	private IValidator _validator = null;
-	private IWorkbenchContext _helper = null;
-	private String _validatorDisplayName = null;
-	private String _validatorUniqueName = null;
-	private String[] _aggregatedValidators = null;
-	private String[] _validatorNames = null;
-	private String _pluginId = null;
-	private boolean _supportsIncremental = RegistryConstants.ATT_INCREMENTAL_DEFAULT;
-	private boolean _supportsFullBuild = RegistryConstants.ATT_FULLBUILD_DEFAULT;
-	private Logger _logger = null;
-	private boolean _isEnabledByDefault = RegistryConstants.ATT_ENABLED_DEFAULT;
-	private MigrationMetaData _migrationMetaData = null;
-	private int _ruleGroup = RegistryConstants.ATT_RULE_GROUP_DEFAULT;
-	private boolean _async = RegistryConstants.ATT_ASYNC_DEFAULT;
-	private boolean dependentValidator = RegistryConstants.DEP_VAL_VALUE_DEFAULT;
-	private String markerId = null;
-	private String _helperClassName = null;
-	private IConfigurationElement _helperClassElement = null;
-	private IConfigurationElement _validatorClassElement = null;
-	private boolean _cannotLoad = false;
-
-	/* package */ValidatorMetaData() {
-		//default
-	}
-
-	/**
-	 * Add to the list of class names of every validator which this validator aggregates. For
-	 * example, if the EJB Validator instantiated another validator, and started its validate
-	 * method, then that instantiated class' name should be in this list.
-	 */
-	/* package */void addAggregatedValidatorNames(String[] val) {
-		_aggregatedValidators = val;
-	}
-
-	/**
-	 * Add the name/type filter pair(s).
-	 */
-	/* package */void addFilters(ValidatorFilter[] filters) {
-		_filters = filters;
-	}
-
-	/**
-	 * Add the project nature filter(s).
-	 */
-	/* package */void addProjectNatureFilters(ValidatorNameFilter[] filters) {
-		_projectNatureFilters = filters;
-	}
-
-	public List getNameFilters() {
-		List nameFilters = new ArrayList();
-		if (_filters != null && _filters.length > 0) {
-			for (int i = 0; i < _filters.length; i++) {
-				ValidatorFilter filter = _filters[i];
-				ValidatorNameFilter nameFilter = filter.get_nameFilter();
-				if (nameFilter != null) {
-					nameFilters.add(nameFilter.getNameFilter());
-				}
-
-			}
-		}
-		return nameFilters;
-	}
-
-	/**
-	 * Return the list of class names of the primary validator and its aggregates.
-	 */
-	public String[] getValidatorNames() {
-		if (_validatorNames == null) {
-			int aLength = (_aggregatedValidators == null) ? 0 : _aggregatedValidators.length;
-			_validatorNames = new String[aLength + 1]; // add 1 for the primary validator name
-			_validatorNames[0] = getValidatorUniqueName();
-			if (_aggregatedValidators != null) {
-				System.arraycopy(_aggregatedValidators, 0, _validatorNames, 1, aLength);
-			}
-		}
-		return _validatorNames;
-	}
-
-	/**
-	 * Return the list of class names of every validator which this validator aggregates. For
-	 * example, if the EJB Validator instantiated another validator, and started its validate
-	 * method, then that instantiated class' name should be in this list.
-	 */
-	public String[] getAggregatedValidatorNames() {
-		return _aggregatedValidators;
-	}
-
-	/**
-	 * Return the name/type filter pairs.
-	 */
-	public ValidatorFilter[] getFilters() {
-		return _filters;
-	}
-
-	/**
-	 * Return true if this vmd's helper and validator have been instantiated, and also if this
-	 * validator's plugin is active.
-	 */
-	public boolean isActive() {
-		if (_helperClassElement != null) {
-			return false;
-		}
-
-		if (_validatorClassElement != null) {
-			return false;
-		}
-
-		Bundle bundle = Platform.getBundle(_pluginId);
-		if (bundle != null)
-			return bundle.getState() == Bundle.ACTIVE;
-
-		return false;
-	}
-
-	/**
-	 * This method will throw an InstantiationException if the helper cannot be instantiated, e.g.,
-	 * if the helper's plugin is disabled for some reason. Before the InstantiationException is
-	 * thrown, this validator will be disabled.
-	 * 
-	 * The IWorkbenchContext must ALWAYS have its project set before it is used; but it can't be
-	 * created with the IProject. So, before using the single instance, always initialize that
-	 * instance with the IProject.
-	 * 
-	 * If this validator supports asynchronous validation, then instead of maintaining a single the
-	 * helper instance, create a new IWorkbenchContext instance every time that the helper is needed.
-	 * This feature is provided because several validation Runnables may be queued to run, and if
-	 * those Runnables's project is different from the current validation's project, then the
-	 * current validation will suddenly start validating another project.
-	 */
-	//TODO just want to remember to figure out the many-temporary-objects problem if this method
-	// continues to new an IValidationContext every time - Ruth
-	public IWorkbenchContext getHelper(IProject project) throws InstantiationException {
-		if (isAsync()) {
-			IWorkbenchContext helper = ValidationRegistryReader.createHelper(_helperClassElement, _helperClassName);
-			if (helper == null) {
-				helper = new WorkbenchContext();
-				//setCannotLoad();
-				//throw new InstantiationException(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_DISABLEH, new String[]{_helperClassName, getValidatorUniqueName()}));
-			}
-			helper.setProject(project);
-			return helper;
-		}
-		if (_helper == null) {
-			_helper = ValidationRegistryReader.createHelper(_helperClassElement, _helperClassName);
-			if (_helper == null) {
-				_helper = new WorkbenchContext();
-				//setCannotLoad();
-				//throw new InstantiationException(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_DISABLEH, new String[]{_helperClassName, getValidatorUniqueName()}));
-			}
-			// Won't be using the element & name again, so clear them.
-			_helperClassElement = null;
-			_helperClassName = null;
-		}
-		if ((_helper.getProject() == null) || !(_helper.getProject().equals(project))) {
-			// Initialize helper with the new project
-			_helper.setProject(project);
-		}
-		return _helper;
-	}
-
-	/**
-	 * cannotLoad is false if both the IValidator and IWorkbenchContext instance can be instantiated.
-	 * This method should be called only by the validation framework, and only if an
-	 * InstantiationException was thrown.
-	 * 
-	 * @param can
-	 */
-	private void setCannotLoad() {
-		_cannotLoad = true;
-	}
-
-	/**
-	 * Return false if both the IValidator and IWorkbenchContext instance can be instantiated.
-	 * 
-	 * @return boolean
-	 */
-	public boolean cannotLoad() {
-		return _cannotLoad;
-	}
-
-	/**
-	 * This method must not be called until the unique id of the validator has been initialized.
-	 */
-	public Logger getMsgLogger() {
-		if (_logger == null) {
-			_logger = ValidationPlugin.getPlugin().getMsgLogger();
-			/*
-			 * // Decided against having a logger for each validator because each validator // would
-			 * need to contribute an extension in their plugins for it to be recognized // by the
-			 * logging preference page. For now, just use the validation framework's logger. _logger =
-			 * (MsgLogger)MsgLogger.getFactory().getLogger(getValidatorUniqueName());
-			 * _logger.write(Level.CONFIG, getValidatorDisplayName());
-			 */
-		}
-		return _logger;
-	}
-
-	public MigrationMetaData getMigrationMetaData() {
-		return _migrationMetaData;
-	}
-
-	/**
-	 * Return the IRuleGroup integer indicating which groups of rules this validator recognizes.
-	 */
-	public int getRuleGroup() {
-		return _ruleGroup;
-	}
-
-	/**
-	 * Return the filters which identify which project(s) this validator may run on.
-	 */
-	/* package */ValidatorNameFilter[] getProjectNatureFilters() {
-		return _projectNatureFilters;
-	}
-
-	/**
-	 * This method returns the validator if it can be loaded; if the validator cannot be loaded,
-	 * e.g., if its plugin is disabled for some reason, then this method throws an
-	 * InstantiationException. Before the CoreException is thrown, this validator is disabled.
-	 * 
-	 * @return IValidator
-	 * @throws InstantiationException
-	 */
-	public IValidator getValidator() throws InstantiationException {
-		if (_validator == null) {
-			_validator = ValidationRegistryReader.createValidator(_validatorClassElement, getValidatorUniqueName());
-
-			// Since the element won't be used any more, clear it.
-			_validatorClassElement = null;
-
-			if (_validator == null) {
-				setCannotLoad();
-				throw new InstantiationException(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_DISABLEV, new String[]{getValidatorUniqueName()}));
-			}
-		}
-		return _validator;
-	}
-
-	public String getValidatorDisplayName() {
-		return _validatorDisplayName;
-	}
-
-	public String getValidatorUniqueName() {
-		return _validatorUniqueName;
-	}
-
-	/**
-	 * If the resource is applicable to the Validator which this ValidatorMetaData is associated
-	 * with, return true; else return false.
-	 * 
-	 * A resource is applicable if it passes the name/type filters. This method is called if there
-	 * is no resource delta (i.e., a full validation).
-	 */
-	public boolean isApplicableTo(IResource resource) {
-		return isApplicableTo(resource, ValidatorActionFilter.ALL_ACTIONS);
-	}
-
-	/**
-	 * If the resource is applicable to the Validator which this ValidatorMetaData is associated
-	 * with, return true; else return false.
-	 * 
-	 * A resource is applicable if it passes the name/type filters.
-	 */
-	public boolean isApplicableTo(IResource resource, int resourceDelta) {
-		// If no filters are specified, then every type of resource should be validated/trigger a
-		// rebuild of the model cache
-		if (_filters == null)
-			return true;
-
-		return isApplicableTo(resource, resourceDelta, _filters);
-	}
-
-	/**
-	 * Return true if the resource passes the name/type filters for this validator.
-	 */
-	/* package */boolean isApplicableTo(IResource resource, int resourceDelta, ValidatorFilter[] filters) {
-		// Are any of the filters satisfied? (i.e., OR them, not AND them.)
-		for (int i = 0; i < filters.length; i++) {
-			ValidatorFilter filter = filters[i];
-			if (checkIfValidSourceFile(resource) && filter.isApplicableType(resource) && filter.isApplicableName(resource) && filter.isApplicableAction(resourceDelta)) {
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	private boolean checkIfValidSourceFile(IResource file) {
-		if (file.getType() == IResource.FILE) {
-			IProjectValidationHelper helper = ValidationHelperRegistryReader.getInstance().getValidationHelper();
-			IProject project = file.getProject();
-			if (helper == null || project == null)
-				return true;
-			IContainer[] outputContainers = helper.getOutputContainers(project);
-			IContainer[] sourceContainers = helper.getSourceContainers(project);
-			for (int i=0; i<outputContainers.length; i++) {
-				String outputPath = outputContainers[i].getProjectRelativePath().makeAbsolute().toString();
-				for (int j=0; j<sourceContainers.length; j++) {
-					String sourceContainerPath = sourceContainers[j].getProjectRelativePath().makeAbsolute().toString();
-					if (outputPath.equals(sourceContainerPath))
-						continue;
-				}
-				String filePath = file.getProjectRelativePath().makeAbsolute().toString();
-				if (filePath.startsWith(outputPath))
-					return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * If this validator recognizes the project nature, whether included or excluded, return the
-	 * name filter which describes the nature. Otherwise return null.
-	 */
-	ValidatorNameFilter findProjectNature(String projId) {
-		if (projId == null) {
-			return null;
-		}
-
-		if (_projectNatureFilters == null) {
-			// If no tag is specified, this validator is configured on all IProjects
-			return null;
-		}
-
-		for (int i = 0; i < _projectNatureFilters.length; i++) {
-			ValidatorNameFilter filter = _projectNatureFilters[i];
-			// In this case, we're not checking if the project is an instance of the filter class,
-			// but if it has the Nature specified in the filter class.
-			String projectNatureID = filter.getNameFilter();
-			if (projId.equals(projectNatureID)) {
-				return filter;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Convenience method. Rather than store the is-this-vmd-configured-on-this-IProject algorithm
-	 * in two places, refer back to the reader's cache.
-	 */
-	public boolean isConfiguredOnProject(IProject project) {
-		return ValidationRegistryReader.getReader().isConfiguredOnProject(this, project);
-	}
-
-	public boolean isEnabledByDefault() {
-		return _isEnabledByDefault;
-	}
-
-	public boolean isIncremental() {
-		return _supportsIncremental;
-	}
-
-	public boolean isFullBuild() {
-		return _supportsFullBuild;
-	}
-
-	/**
-	 * Return true if the validator is thread-safe and can be run asynchronously.
-	 */
-	public boolean isAsync() {
-		return _async;
-	}
-
-	/* package */void setHelperClass(IConfigurationElement element, String helperClassName) {
-		_helperClassElement = element;
-		_helperClassName = helperClassName;
-	}
-
-	/* package */void setEnabledByDefault(boolean enabledByDefault) {
-		_isEnabledByDefault = enabledByDefault;
-	}
-
-	/* package */void setIncremental(boolean isIncremental) {
-		_supportsIncremental = isIncremental;
-	}
-
-	/* package */void setFullBuild(boolean fullBuild) {
-		_supportsFullBuild = fullBuild;
-	}
-
-	/* package */void setAsync(boolean isAsync) {
-		_async = isAsync;
-	}
-
-	/* package */void setMigrationMetaData(MigrationMetaData mmd) {
-		_migrationMetaData = mmd;
-	}
-
-	/* package */void setRuleGroup(int ruleGroup) {
-		_ruleGroup = ruleGroup;
-	}
-
-	/* package */void setValidatorClass(IConfigurationElement element) {
-		_validatorClassElement = element;
-		// validator class name == validatorUniqueName
-	}
-
-	/* package */void setValidatorDisplayName(String validatorName) {
-		_validatorDisplayName = validatorName;
-	}
-
-	/* package */void setValidatorUniqueName(String validatorUniqueName) {
-		_validatorUniqueName = validatorUniqueName;
-	}
-
-	/* package */void setPluginId(String validatorPluginId) {
-		_pluginId = validatorPluginId;
-	}
-
-	public String toString() {
-		return getValidatorUniqueName();
-	}
-
-	public class MigrationMetaData {
-		private Set _ids = null;
-
-		public MigrationMetaData() {
-			//default
-		}
-
-		public void addId(String oldId, String newId) {
-			if (oldId == null) {
-				// log
-				return;
-			}
-
-			if (newId == null) {
-				// log
-				return;
-			}
-
-			String[] ids = new String[]{oldId, newId};
-			getIds().add(ids);
-		}
-
-		public Set getIds() {
-			if (_ids == null) {
-				_ids = new HashSet();
-			}
-			return _ids;
-		}
-	}
-
-	/**
-	 * @param b
-	 */
-	public void addDependentValidator(boolean b) {
-		dependentValidator = b;
-	}
-
-	/**
-	 * @param b
-	 */
-	public boolean isDependentValidator() {
-		return dependentValidator;
-	}
-
-	/**
-	 * @return Returns the markerId.
-	 */
-	public String getMarkerId() {
-		return markerId;
-	}
-
-	/**
-	 * @param markerId
-	 *            The markerId to set.
-	 */
-	public void setMarkerId(String markerId) {
-		this.markerId = markerId;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidatorNameFilter.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidatorNameFilter.java
deleted file mode 100644
index 75d857a..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidatorNameFilter.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal;
-
-
-import java.util.StringTokenizer;
-
-import org.eclipse.core.resources.IResource;
-
-/**
- * Represents a name filter tag in a validator's plugin.xml file. e.g. &lt;filter name="*.*"> Then
- * this class would store the "*.*", and provide the wildcard matching functionality.
- */
-public class ValidatorNameFilter {
-	private String _nameFilter = null;
-	private String nameFilterExtension = null;
-	private boolean _include = true; // by default, filter in the IFile specified
-	private final static String WILDCARD = "*"; //$NON-NLS-1$
-	private boolean _isCaseSensitive = true; // by default, the filter name is case-sensitive
-
-	/**
-	 * Insert the method's description here. Creation date: (12/4/00 11:08:41 AM)
-	 */
-	/* package */ValidatorNameFilter() {
-		//default
-	}
-
-	/**
-	 * Get the filter, as specified in plugin.xml
-	 */
-	/* package */String getNameFilter() {
-		return _nameFilter;
-	}
-
-	/* package */boolean isCaseSensitive() {
-		return _isCaseSensitive;
-	}
-
-	/* package */boolean isInclude() {
-		return _include;
-	}
-
-	/**
-	 * Return true if the given resource is both applicable and include="true".
-	 */
-	/* package */boolean isApplicableTo(IResource resource) {
-		return (isApplicableName(resource) && isInclude());
-	}
-	
-	protected void setNameFilterExtension(String filterExt) {
-		nameFilterExtension = filterExt;
-	}
-
-	/**
-	 * Returns true if the name of the resource matches the filter, or if there is no filter
-	 * specified.
-	 */
-	public boolean isApplicableName(IResource resource) {
-		// If name filter is null, means filter out no names.
-		// Otherwise, return true only if the given name matches
-		// the name filter.
-		if (_nameFilter == null)
-			return true;
-		
-		String name = resource.getName();
-//		return true if the file name is exact match of the _nameFilter
-		if (name.equalsIgnoreCase(_nameFilter))
-			return true;
-
-		int indexOfStarDot = _nameFilter.indexOf("*.");
-
-		//return value if the fileter name extension matches the extension
-		//of the resource 
-		if (indexOfStarDot != -1) {
-			String nameExtension = name.substring(name.indexOf(".") + 1);
-			return nameFilterExtension.equalsIgnoreCase(nameExtension);
-		}
-
-		if (!isCaseSensitive()) {
-			name = name.toLowerCase();
-		}
-
-		return verifyNameMatch(_nameFilter, name);
-	}
-
-	/* package */void setInclude(String includeValue) {
-		if (includeValue != null) {
-			setInclude(Boolean.valueOf(includeValue).booleanValue());
-		}
-	}
-
-	void setInclude(boolean includeBool) {
-		_include = includeBool;
-	}
-
-	/**
-	 * Set the filter, as specified in plugin.xml
-	 */
-	/* package */void setNameFilter(String filter) {
-		_nameFilter = filter;
-	}
-
-	/* package */void setCaseSensitive(String isCaseSensitiveString) {
-		if (isCaseSensitiveString != null) {
-			// only change the value from the default if the case-sensitive attribute is defined
-			_isCaseSensitive = Boolean.valueOf(isCaseSensitiveString).booleanValue();
-		}
-	}
-
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("NameFilter:\n\tnameFilter = "); //$NON-NLS-1$
-		buffer.append(_nameFilter);
-		return buffer.toString();
-	}
-
-	/**
-	 * Return true if the given name matches the given filter.
-	 * 
-	 * The only filter wildcard allowed is '*'.
-	 */
-	/* package */static boolean verifyNameMatch(final String filter, String name) {
-		/*
-		 * There are eight possible wildcard combinations, given that a wildcard may, if present, be
-		 * at the beginning, middle, or end of a name; or any combination of those positions. i.e.,
-		 * 
-		 * beginning middle end 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1
-		 *  
-		 */
-		StringTokenizer tokenizer = new StringTokenizer(filter, WILDCARD, true);
-		boolean wildcardFlag = false;
-		while (tokenizer.hasMoreTokens()) {
-			String token = tokenizer.nextToken();
-			if (token.equals(WILDCARD)) {
-				wildcardFlag = true;
-			} else {
-				if (wildcardFlag) {
-					int tokenIndex = name.indexOf(token);
-					if (tokenIndex >= 0) {
-						name = name.substring(tokenIndex + token.length());
-					} else {
-						return false;
-					}
-				} else {
-					if (name.startsWith(token)) {
-						int tokenIndex = token.length();
-						name = name.substring(tokenIndex);
-					} else {
-						return false;
-					}
-				}
-				wildcardFlag = false;
-			}
-		}
-		if (!name.equals("")) { //$NON-NLS-1$
-			if (!wildcardFlag) {
-				return false;
-			}
-		}
-		return true;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidatorTypeFilter.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidatorTypeFilter.java
deleted file mode 100644
index 0f00ce3..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidatorTypeFilter.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal;
-
-import java.text.MessageFormat;
-import java.util.logging.Level;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-
-/**
- * Represents a type filter tag in a validator's plugin.xml file. e.g. &lt;filter
- * objectClass="com.ibm.foo.MyClass"> Then this class would store the "com.ibm.foo.MyClass", and
- * provide the "instanceof" matching functionality.
- */
-public class ValidatorTypeFilter {
-	private Class _typeFilterClass = null;
-	private String _mustImplementClass = null; // the type set in setTypeFilter must implement the
-
-	// class/interface identified by this fully-qualified
-	// Java string.
-
-	/* package */ValidatorTypeFilter() {
-		//default
-	}
-
-	/* package */ValidatorTypeFilter(String mustImplementClass) {
-		setMustImplementClass(mustImplementClass);
-	}
-
-	/**
-	 * Type filters are allowed only for certain types of classes. This method returns the name of
-	 * the class which this type must implement before it can be a filter.
-	 */
-	/* package */String getMustImplementClass() {
-		return _mustImplementClass;
-	}
-
-	/**
-	 * Return the type filter as a java.lang.Class object.
-	 */
-	/* package */Class getTypeFilterClass() {
-		return _typeFilterClass;
-	}
-
-	/**
-	 * Returns true if the resource passed in either an instance of the type filter class, or if
-	 * there is no type filter class defined in plugin.xml.
-	 */
-	public boolean isApplicableType(IResource resource) {
-		// If type filter is null, means filter out no types.
-		// Otherwise, return true only if the given type is an instance of
-		// the type filter.
-		if (_typeFilterClass == null)
-			return true;
-
-		// If the resource is an instance of the type filter class.
-		return isInstance(resource.getClass(), _typeFilterClass);
-	}
-
-	/**
-	 * Checks if filterClass is a parent (interface or superclass) of objectClass.
-	 */
-	/* package */boolean isInstance(Class objectClass, Class filterClass) {
-		// The java.lang.Class.isInstance call doesn't check interfaces fully.
-		// i.e., if I have two interfaces, A and B, and B extends A but
-		// doesn't implement A, then the isInstance call will return false.
-		//
-		// So, instead of using Class.isInstance, do the checking myself.
-		for (Class cl = objectClass; cl != null; cl = cl.getSuperclass()) {
-			if (cl.getName().equals(filterClass.getName())) {
-				return true;
-			}
-			Class[] clInterfaces = cl.getInterfaces();
-			for (int i = 0; i < clInterfaces.length; i++) {
-				if (clInterfaces[i].getName().equals(filterClass.getName())) {
-					return true;
-				}
-				return isInstance(clInterfaces[i], filterClass);
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Type filters are allowed only for certain types of classes. This method sets the name of the
-	 * class which this type must implement before it can be a filter.
-	 */
-	/* package */void setMustImplementClass(String className) {
-		_mustImplementClass = className;
-	}
-
-	/**
-	 * If the filter implements the mustImplementClass (in ValidatorFilter's case, IResource), then
-	 * this is a valid filter, and store the filter value.
-	 */
-	/* package */void setTypeFilter(String filter) {
-		Class filterClass = null;
-		Class mustImplementClass = null;
-
-		if (filter == null) {
-			_typeFilterClass = null;
-			return;
-		}
-
-		try {
-			filterClass = Class.forName(filter);
-			if (getMustImplementClass() != null) {
-				mustImplementClass = Class.forName(getMustImplementClass());
-
-				// If the filter class is not an instance of mustImplementClass
-				if (!isInstance(filterClass, mustImplementClass)) {
-					_typeFilterClass = null;
-					Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-					if (logger.isLoggingLevel(Level.FINE)) {
-						LogEntry entry = ValidationPlugin.getLogEntry();
-						entry.setSourceID("ValidatorTypeFilter.setTypeFilter(String)"); //$NON-NLS-1$
-						entry.setMessageTypeID(ResourceConstants.VBF_EXC_INVALID_TYPE_FILTER);
-						String result = MessageFormat.format(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INVALID_TYPE_FILTER), new String[]{filter, getMustImplementClass()});
-						entry.setText(result);						
-						//entry.setTokens(new String[]{filter, getMustImplementClass()});
-						logger.write(Level.FINE, entry);
-					}
-				}
-			}
-		} catch (ClassNotFoundException exc) {
-			_typeFilterClass = null;
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.FINE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("ValidatorTypeFilter.setTypeFilter(String)"); //$NON-NLS-1$
-				entry.setText("The class named " + filter + " cannot be instantiated because it does not exist. Check the spelling of the name, in the validator's plugin.xml contribution, and try restarting eclipse again."); //$NON-NLS-1$  //$NON-NLS-2$
-				logger.write(Level.FINE, entry);
-			}
-			return;
-		}
-		_typeFilterClass = filterClass;
-	}
-
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("TypeFilter:"); //$NON-NLS-1$
-		buffer.append("     _typeFilterClass = " + _typeFilterClass.getName()); //$NON-NLS-1$
-		buffer.append("     _mustImplementClass = " + _mustImplementClass); //$NON-NLS-1$
-		return buffer.toString();
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/AllValidatorsOperation.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/AllValidatorsOperation.java
deleted file mode 100644
index f32ae59..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/AllValidatorsOperation.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.operations;
-
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.logging.Level;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.validation.internal.ConfigurationManager;
-import org.eclipse.wst.validation.internal.InternalValidatorManager;
-import org.eclipse.wst.validation.internal.ProjectConfiguration;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-
-/**
- * Implemented Validators must not be called directly by anyone other than instances of
- * ValidationOperation, because some initialization of the validator, and handling of error
- * conditions, is done in the operation. The initialization is separated because some of the
- * information needed to initialize the validator (i.e., the project) isn't known until runtime.
- * 
- * This operation runs all validators: enabled validators, disabled validators, incremental
- * validators, full validators.
- * 
- * This operation is not intended to be subclassed outside of the validation framework.
- */
-public class AllValidatorsOperation extends ValidatorSubsetOperation {
-	/**
-	 * @deprecated Will be removed in Milestone 3. Use AllValidatorsOperation(IProject, boolean)
-	 */
-	public AllValidatorsOperation(IProject project) {
-		this(project, DEFAULT_ASYNC);
-	}
-
-	/**
-	 * Run all configured validators on the project, regardless of whether the validator is enabled
-	 * or disabled by the user.
-	 * 
-	 * If async is true, the validation will run all thread-safe validators in a background thread.
-	 * If async is false, no validators will run in a background thread.
-	 */
-	public AllValidatorsOperation(IProject project, boolean async) {
-		super(project, true, async);// always force validation to run
-		try {
-			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-			setEnabledValidators(InternalValidatorManager.wrapInSet(prjp.getValidators()));
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("EventManager::closing(" + project.getName() + ")"); //$NON-NLS-1$ //$NON-NLS-2$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, exc);
-
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, exc);
-				}
-			}
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/DefaultResourceUtil.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/DefaultResourceUtil.java
deleted file mode 100644
index 39231d4..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/DefaultResourceUtil.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.operations;
-
-/**
- * The default line number calculator (always returns "0").
- */
-public class DefaultResourceUtil implements IResourceUtil {
-
-	/**
-	 * @see org.eclipse.wst.validation.internal.operations.IResourceUtil#getLineNo(Object)
-	 */
-	public int getLineNo(Object obj) {
-		return 0;
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/EnabledIncrementalValidatorsOperation.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/EnabledIncrementalValidatorsOperation.java
deleted file mode 100644
index 7fcd3f4..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/EnabledIncrementalValidatorsOperation.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.operations;
-
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.Set;
-import java.util.logging.Level;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.validation.internal.ConfigurationManager;
-import org.eclipse.wst.validation.internal.FilterUtil;
-import org.eclipse.wst.validation.internal.InternalValidatorManager;
-import org.eclipse.wst.validation.internal.ProjectConfiguration;
-import org.eclipse.wst.validation.internal.RegistryConstants;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-
-/**
- * Implemented Validators must not be called directly by anyone other than instances of
- * ValidationOperation, because some initialization of the validator, and handling of error
- * conditions, is done in the operation. The initialization is separated because some of the
- * information needed to initialize the validator (i.e., the project) isn't known until runtime.
- * 
- * Instances of this operation load the project's configured validators, and run the validators if
- * they are both enabled and incremental.
- * 
- * This operation is not intended to be subclassed outside of the validation framework.
- */
-public class EnabledIncrementalValidatorsOperation extends EnabledValidatorsOperation {
-	/**
-	 * @deprecated Will be removed in Milestone 3. Use
-	 *             EnabledIncrementalValidatorsOperation(IProject, IResourceDelta, boolean)
-	 */
-	public EnabledIncrementalValidatorsOperation(IProject project, IResourceDelta delta) {
-		this(project, delta, DEFAULT_ASYNC);
-	}
-
-	/**
-	 * @deprecated Will be removed in Milestone 3. Use
-	 *             EnabledIncrementalValidatorsOperation(IProject, IResourceDelta, int, boolean)
-	 */
-	public EnabledIncrementalValidatorsOperation(IProject project, IResourceDelta delta, int ruleGroup) {
-		this(project, delta, ruleGroup, DEFAULT_ASYNC);
-	}
-
-	/**
-	 * @deprecated Will be removed in Milestone 3. Use
-	 *             EnabledIncrementalValidatorsOperation(IProject, IResourceDelta, int, boolean)
-	 *             instead.
-	 */
-	public EnabledIncrementalValidatorsOperation(IProject project, Set validators, IResourceDelta delta, int ruleGroup) {
-		this(project, delta, ruleGroup, DEFAULT_ASYNC);
-		setEnabledValidators(validators);
-	}
-
-	/**
-	 * IProject must exist and be open.
-	 * 
-	 * If delta is null, a full validation of the project using only the incremental validators is
-	 * performed. If delta is not null, all enabled incremental validators that validate resources
-	 * in the delta will validate those resources.
-	 * 
-	 * If async is true, all thread-safe validators will run in the background validation thread,
-	 * and all other validators will run in the main thread. If async is false, all validators will
-	 * run in the main thread.
-	 */
-	public EnabledIncrementalValidatorsOperation(IProject project, IResourceDelta delta, boolean async) {
-		this(project, delta, RegistryConstants.ATT_RULE_GROUP_DEFAULT, async);
-	}
-	
-	/**
-	 * IProject must exist and be open.
-	 * 
-	 * If delta is null, a full validation of the project using only the incremental validators is
-	 * performed. If delta is not null, all enabled incremental validators that validate resources
-	 * in the delta will validate those resources.
-	 * 
-	 * If async is true, all thread-safe validators will run in the background validation thread,
-	 * and all other validators will run in the main thread. If async is false, all validators will
-	 * run in the main thread.
-	 */
-	public EnabledIncrementalValidatorsOperation(IProject project, IWorkbenchContext context, IResourceDelta delta, boolean async) {
-		this(project,context, delta, RegistryConstants.ATT_RULE_GROUP_DEFAULT, async);
-	}
-	
-	/**
-	 * IProject must exist and be open.
-	 * 
-	 * If delta is null, a full validation of the project using only the incremental validators is
-	 * performed. If delta is not null, all enabled incremental validators that validate resources
-	 * in the delta will validate those resources.
-	 * 
-	 * If async is true, all thread-safe validators will run in the background validation thread,
-	 * and all other validators will run in the main thread. If async is false, all validators will
-	 * run in the main thread.
-	 */
-	public EnabledIncrementalValidatorsOperation(IProject project,IWorkbenchContext context, IResourceDelta delta, int ruleGroup, boolean async) {
-		super(project, ruleGroup, shouldForce(delta), async);
-		try {
-			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-			setEnabledValidators(InternalValidatorManager.wrapInSet(prjp.getEnabledIncrementalValidators(true)));
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("EnabledIncrementalVAlidatorsOperation(IProject<" + project.getName() + ">, IResourceDelta, int, boolean)"); //$NON-NLS-1$  //$NON-NLS-2$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, exc);
-
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, exc);
-				}
-			}
-		}
-		setDelta(delta);
-		setContext(context);
-	}
-
-	/**
-	 * IProject must exist and be open.
-	 * 
-	 * If delta is null, a full validation of the project using only the incremental validators is
-	 * performed. If delta is not null, all enabled incremental validators that validate resources
-	 * in the delta will validate those resources.
-	 * 
-	 * If async is true, all thread-safe validators will run in the background validation thread,
-	 * and all other validators will run in the main thread. If async is false, all validators will
-	 * run in the main thread.
-	 */
-	public EnabledIncrementalValidatorsOperation(IProject project, IResourceDelta delta, int ruleGroup, boolean async) {
-		super(project, ruleGroup, shouldForce(delta), async);
-		try {
-			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-			setEnabledValidators(InternalValidatorManager.wrapInSet(prjp.getEnabledIncrementalValidators(true)));
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("EnabledIncrementalVAlidatorsOperation(IProject<" + project.getName() + ">, IResourceDelta, int, boolean)"); //$NON-NLS-1$  //$NON-NLS-2$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, exc);
-
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, exc);
-				}
-			}
-		}
-		setDelta(delta);
-	}
-
-	/**
-	 * IProject must exist, be open, and contain all of the resources in changedResources. If some
-	 * of the resources in changedResources belong to different projects, the result is undefined.
-	 * 
-	 * If changedResources is null, a full validation of the project using only the incremental
-	 * validators is performed. If changedResources is not null, all enabled incremental validators
-	 * that validate resources in the changedResources array will validate those resources.
-	 * 
-	 * If async is true, all thread-safe validators will run in the background validation thread,
-	 * and all other validators will run in the main thread. If async is false, all validators will
-	 * run in the main thread.
-	 */
-	public EnabledIncrementalValidatorsOperation(IResource[] changedResources,IWorkbenchContext aWorkbenchContext, IProject project, boolean async) {
-		super(project, RegistryConstants.ATT_RULE_GROUP_DEFAULT, shouldForce(changedResources), async);
-		try {
-			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-			setEnabledValidators(InternalValidatorManager.wrapInSet(prjp.getEnabledIncrementalValidators(true)));
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("EnabledIncrementalValidatorsOperation(IResource[], IProject<" + project.getName() + ">, boolean)"); //$NON-NLS-1$  //$NON-NLS-2$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, exc);
-
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-		}
-		//construct an array of IFileDelta[] to wrap the Object[]; one IFileDelta for each Object in the array
-		setFileDeltas(FilterUtil.getFileDeltas(getEnabledValidators(), changedResources, false));
-		setContext(aWorkbenchContext);
-	}
-	
-	/**
-	 * IProject must exist, be open, and contain all of the resources in changedResources. If some
-	 * of the resources in changedResources belong to different projects, the result is undefined.
-	 * 
-	 * If changedResources is null, a full validation of the project using only the incremental
-	 * validators is performed. If changedResources is not null, all enabled incremental validators
-	 * that validate resources in the changedResources array will validate those resources.
-	 * 
-	 * If async is true, all thread-safe validators will run in the background validation thread,
-	 * and all other validators will run in the main thread. If async is false, all validators will
-	 * run in the main thread.
-	 */
-	public EnabledIncrementalValidatorsOperation(IResource[] changedResources,IProject project, boolean async) {
-		super(project, RegistryConstants.ATT_RULE_GROUP_DEFAULT, shouldForce(changedResources), async);
-		try {
-			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-			setEnabledValidators(InternalValidatorManager.wrapInSet(prjp.getEnabledIncrementalValidators(true)));
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("EnabledIncrementalValidatorsOperation(IResource[], IProject<" + project.getName() + ">, boolean)"); //$NON-NLS-1$  //$NON-NLS-2$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, exc);
-
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-		}
-		//construct an array of IFileDelta[] to wrap the Object[]; one IFileDelta for each Object in the array
-		setFileDeltas(FilterUtil.getFileDeltas(getEnabledValidators(), changedResources, false));
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/EnabledValidatorsOperation.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/EnabledValidatorsOperation.java
deleted file mode 100644
index a4e3cfd..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/EnabledValidatorsOperation.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.operations;
-
-
-import java.util.Set;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.wst.validation.internal.RegistryConstants;
-
-
-/**
- * Implemented Validators must not be called directly by anyone other than instances of
- * ValidationOperation, because some initialization of the validator, and handling of error
- * conditions, is done in the operation. The initialization is separated because some of the
- * information needed to initialize the validator (i.e., the project) isn't known until runtime.
- * 
- * Instances of this operation run every enabled validator (both full and incremental) on the
- * project.
- * 
- * This operation is not intended to be subclassed outside of the validation framework.
- */
-public class EnabledValidatorsOperation extends ValidatorSubsetOperation {
-	
-
-	/**
-	 * @deprecated Will be removed in Milestone 3. Use EnabledValidatorsOperation(IProject, boolean)
-	 */
-	public EnabledValidatorsOperation(IProject project) {
-		this(project, DEFAULT_ASYNC);
-	}
-
-	/**
-	 * @deprecated Will be removed in Milestone 3. Use EnabledValidatorsOperation(IProject, int,
-	 *             boolean, boolean)
-	 */
-	public EnabledValidatorsOperation(IProject project, int ruleGroup) {
-		this(project, ruleGroup, DEFAULT_FORCE, DEFAULT_ASYNC);
-	}
-
-	/**
-	 * @deprecated Will be removed in Milestone 3. Use EnabledValidatorsOperation(IProject, int,
-	 *             boolean, boolean)
-	 */
-	public EnabledValidatorsOperation(IProject project, int ruleGroup, boolean force) {
-		this(project, ruleGroup, force, DEFAULT_ASYNC);
-	}
-
-	/**
-	 * Run all enabled validators on the project.
-	 * 
-	 * IProject must exist and be open.
-	 * 
-	 * If async is true, the validation will run all thread-safe validators in the background
-	 * validation thread, and all other validators in the main thread. If async is false, all
-	 * validators will run in in the main thread.
-	 */
-	public EnabledValidatorsOperation(IProject project, boolean async) {
-		this(project, RegistryConstants.ATT_RULE_GROUP_DEFAULT, DEFAULT_FORCE, async);
-	}
-	
-	/**
-	 * Run all enabled validators on the project.
-	 * 
-	 * IProject must exist and be open.
-	 * 
-	 * If async is true, the validation will run all thread-safe validators in the background
-	 * validation thread, and all other validators in the main thread. If async is false, all
-	 * validators will run in in the main thread.
-	 */
-	public EnabledValidatorsOperation(IProject project, IWorkbenchContext aWorkbenchContext, boolean async) {
-		this(project, aWorkbenchContext, RegistryConstants.ATT_RULE_GROUP_DEFAULT, DEFAULT_FORCE, async);
-	}
-	
-	/**
-	 * Run all enabled validators on the project with the identified ruleGroup.
-	 * 
-	 * IProject must exist and be open.
-	 * 
-	 * If async is true, the validation will run all thread-safe validators in the background
-	 * validation thread, and all other validators in the main thread. If async is false, all
-	 * validators will run in in the main thread.
-	 */
-	public EnabledValidatorsOperation(IProject project, IWorkbenchContext aWorkbenchContext, int ruleGroup, boolean force, boolean async) {
-		this(project, aWorkbenchContext, ValidatorManager.getManager().getEnabledValidators(project), ruleGroup, force, async);
-	}
-	
-
-	/**
-	 * Run all enabled validators on the project with the identified ruleGroup.
-	 * 
-	 * IProject must exist and be open.
-	 * 
-	 * If async is true, the validation will run all thread-safe validators in the background
-	 * validation thread, and all other validators in the main thread. If async is false, all
-	 * validators will run in in the main thread.
-	 */
-	public EnabledValidatorsOperation(IProject project, int ruleGroup, boolean force, boolean async) {
-		this(project, ValidatorManager.getManager().getEnabledValidators(project), ruleGroup, force, async);
-	}
-
-	/**
-	 * Run the identified validators on the project.
-	 * 
-	 * IProject must exist and be open.
-	 * 
-	 * If async is true, the validation will run all thread-safe validators in the background
-	 * validation thread, and all other validators in the main thread. If async is false, all
-	 * validators will run in in the main thread.
-	 */
-	protected EnabledValidatorsOperation(IProject project, Set enabledValidators, boolean async) {
-		this(project, enabledValidators, RegistryConstants.ATT_RULE_GROUP_DEFAULT, DEFAULT_FORCE, async); 
-		// true = force validation to run whether or not auto-validate is on
-	}
-	
-	/**
-	 * Run the identified validators on the project.
-	 * 
-	 * IProject must exist and be open.
-	 * 
-	 * If async is true, the validation will run all thread-safe validators in the background
-	 * validation thread, and all other validators in the main thread. If async is false, all
-	 * validators will run in in the main thread.
-	 */
-	protected EnabledValidatorsOperation(IProject project,IWorkbenchContext aWorkbenchContext, Set enabledValidators, boolean async) {
-		this(project,aWorkbenchContext, enabledValidators, RegistryConstants.ATT_RULE_GROUP_DEFAULT, DEFAULT_FORCE, async); 
-		// true = force validation to run whether or not auto-validate is on
-	}
-
-	/**
-	 * Run the identified validators on the project with the ruleGroup.
-	 * 
-	 * IProject must exist and be open.
-	 * 
-	 * If async is true, the validation will run all thread-safe validators in the background
-	 * validation thread, and all other validators in the main thread. If async is false, all
-	 * validators will run in in the main thread.
-	 */
-	protected EnabledValidatorsOperation(IProject project, Set enabledValidators, int ruleGroup, boolean force, boolean async) {
-		super(project, force, ruleGroup, async);
-		setEnabledValidators(enabledValidators);
-	}
-	
-	/**
-	 * Run the identified validators on the project with the ruleGroup.
-	 * 
-	 * IProject must exist and be open.
-	 * 
-	 * If async is true, the validation will run all thread-safe validators in the background
-	 * validation thread, and all other validators in the main thread. If async is false, all
-	 * validators will run in in the main thread.
-	 */
-	protected EnabledValidatorsOperation(IProject project, IWorkbenchContext aWorkbenchContext, Set enabledValidators, int ruleGroup, boolean force, boolean async) {
-		super(project,aWorkbenchContext,force, ruleGroup, async);
-		setEnabledValidators(enabledValidators);
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/IResourceUtil.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/IResourceUtil.java
deleted file mode 100644
index d0a34bf..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/IResourceUtil.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.operations;
-
-
-/**
- * This type is not intended to be extended by clients.
- */
-public interface IResourceUtil {
-	/**
-	 * Return the line number where the Object is located.
-	 */
-	public int getLineNo(Object obj);
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/IRuleGroup.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/IRuleGroup.java
deleted file mode 100644
index dabcee8..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/IRuleGroup.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.operations;
-
-/**
- * This type represents a group of rules which a validator checks. For now, the only grouping is by
- * speed: if a set of rules can be checked quickly, it will be included in the PASS_FAST group,
- * otherwise, it is grouped in the PASS_FULL group.
- * 
- * In future, this could be extended to include severities. To be able to group by severity helps
- * with the MessageLimitException. A validator should report errors first, and then warnings, and
- * then infos, in order to avoid the message limit being reached before the most severe problems are
- * reported.
- */
-public interface IRuleGroup {
-	// The following filters are used to identify a group of validation checks.
-
-	// retrieves the type of pass, from the IValidationContext, which the validator should execute
-	public static final String PASS_LEVEL = "PASS_LEVEL"; //$NON-NLS-1$
-
-	// On the FAST_PASS, the validator should check the rules which do not
-	// take much time to check, and exclude the rules which are valid only
-	// before some action (e.g. exporting or deploying).
-	// 
-	// The severity of the messages is irrelevant.
-	public static final int PASS_FAST = 0x1;
-	public static final String PASS_FAST_NAME = "fast"; //$NON-NLS-1$ // In plugin.xml, identify this pass by this constant
-
-	// On the FULL_PASS, the validator should check everything. This is the default.
-	public static final int PASS_FULL = 0x2 | PASS_FAST;
-	public static final String PASS_FULL_NAME = "full"; //$NON-NLS-1$ // In plugin.xml, identify this pass by this constant
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/IWorkbenchContext.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/IWorkbenchContext.java
deleted file mode 100644
index 49d677f..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/IWorkbenchContext.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.operations;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
-
-
-
-
-/**
- * In the eclipse environment, not only does the IValidationContext need to be able to load the MOF model, it
- * also needs to load items from the eclipse workbench. This interface should be extended by
- * workbench IHelpers, so that items can be added to, and from, the task list.
- */
-public interface IWorkbenchContext extends IValidationContext {
-	/**
-	 * When the validation is complete, this method will be called so that the IWorkbenchContext can
-	 * clean up any resources it allocated during the validation.
-	 * 
-	 * If the cleanup is a long-running operation, subtask messages should be sent to the IReporter.
-	 */
-	public void cleanup(WorkbenchReporter reporter);
-
-	/**
-	 * When the IProject is closing, perform any cleanup that needs to be done. When this method is
-	 * called, if the helper has cached any resources from the IProject, it should release those
-	 * resources. If you do not allocate resources in your helper, then this method should be a
-	 * no-op.
-	 */
-	public void closing();
-
-	/**
-	 * When the IProject is being deleted, perform any cleanup that needs to be done. When this
-	 * method is called, if the helper has cached any resources from the IProject, it should release
-	 * those resources. If you do not allocate resources in your helper, then this method should be
-	 * a no-op.
-	 */
-	public void deleting();
-
-	/**
-	 * Given an Object, if the object has a corresponding IFile in the workbench, return the IFile.
-	 * Otherwise return null.
-	 * 
-	 * This method is used by the WorkbenchReporter. In eclipse, in order to add or remove a task
-	 * list entry, the IResource, to which the entry applies, must be identified. The IReporter
-	 * interface passes in an Object in these methods:
-	 * 
-	 * addValidationMessage(IValidator, IMessage) // Object is a part of IMessage
-	 * 
-	 * removeAllMessages(IValidator, Object),
-	 * 
-	 * Thus, the WorkbenchReporter needs to know how, given the Object, which IFile that the Object
-	 * represents in the workbench, in order to be able to add the task list entry.
-	 * 
-	 * If this method returns null, then the WorkbenchReporter will add the message to the IProject
-	 * instead of an IFile.
-	 * 
-	 * @deprecated Implement getResource(Object) instead.
-	 */
-	public IFile getFile(Object object);
-
-	/**
-	 * Given an Object, if the object has a corresponding IResource in the workbench, return the
-	 * IResourcee. Otherwise return null.
-	 * 
-	 * This method is used by the WorkbenchReporter. In eclipse, in order to add or remove a task
-	 * list entry, the IResource, to which the entry applies, must be identified. The IReporter
-	 * interface passes in an Object in these methods:
-	 * 
-	 * addValidationMessage(IValidator, IMessage) // Object is a part of IMessage
-	 * 
-	 * removeAllMessages(IValidator, Object),
-	 * 
-	 * Thus, the WorkbenchReporter needs to know how, given the Object, which IFile that the Object
-	 * represents in the workbench, in order to be able to add the task list entry.
-	 * 
-	 * If this method returns null, then the WorkbenchReporter will add the message to the IProject
-	 * instead of an IResource.
-	 */
-	public IResource getResource(Object object);
-
-	/**
-	 * Given an IMessage's target object, return the line number, of the IFile, which the target
-	 * object represents, if possible. If the object is null, or if access to line numbers is not
-	 * possible, return a text description of the location.
-	 * 
-	 * This method will be called whether or not the IResource is an IFile, IFolder, or IProject.
-	 * Line numbers are valid only for IFile types; if the resource is not an IFile, then a text
-	 * description of the location must be returned.
-	 */
-	public String getLocation(Object object);
-
-	/**
-	 * Return the name of the resource, without the project-specific information in front.
-	 * 
-	 * This method is used by ValidationOperation to calculate the non-environment specific names of
-	 * the files. Only the IWorkbenchContext implementation knows how much information to strip off
-	 * of the IResource name. For example, if there is an EJB Project named "MyEJBProject", and it
-	 * uses the default names for the source and output folders, "source" and "ejbModule",
-	 * respectively, then the current implementation of EJB Helper knows how much of that structure
-	 * is eclipse-specific.
-	 * 
-	 * Since the "source" folder contains Java source files, a portable name would be the
-	 * fully-qualified name of the Java class, without the eclipse-specific project and folder names
-	 * in front of the file name. The EJBHelper knows that everything up to the "source" folder, for
-	 * example, can be removed, because, according to the definition of the EJB Project, everything
-	 * contained in the source folder is java source code. So if there is an IResource in an EJB
-	 * Project named "/MyEJBProject/source/com/ibm/myclasses/MyJavaFile.java", this method would
-	 * make this name portable by stripping off the "/MyEJBProject/source", and returning
-	 * "com/ibm/myclasses/MyJavaFile.java".
-	 * 
-	 * The output of this method is used by the ValidationOperation, when it is calculating the list
-	 * of added/changed/deleted file names for incremental validation. If getPortableName(IResource)
-	 * returns null, that means that the IWorkbenchContext's implementation does not support that
-	 * particular type of resource, and the resource should not be included in the array of
-	 * IFileDelta objects in the IValidator's "validate" method.
-	 */
-	public String getPortableName(IResource resource);
-
-	/**
-	 * Return the IProject which is about to be validated. Each IWorkbenchContext knows how to
-	 * traverse a certain type of IProject, for example, an EJB project or a web project.
-	 */
-	public IProject getProject();
-
-	/**
-	 * When an IValidator associates a target object with an IMessage, the WorkbenchReporter
-	 * eventually resolves that target object with an IResource. Sometimes more than one target
-	 * object resolves to the same IResource (usually the IProject, which is the default IResource
-	 * when an IFile cannot be found). This method is called, by the WorkbenchReporter, so that the
-	 * WorkbenchReporter can distinguish between the IMessages which are on the same IResource, but
-	 * refer to different target objects. This is needed for the removeAllMessages(IValidator,
-	 * Object) method, so that when one target object removes all of its messages, that it doesn't
-	 * remove another target object's messages.
-	 * 
-	 * This method may return null only if object is null. Otherwise, an id which can uniquely
-	 * identify a particular object must be returned. The id needs to be unique only within one
-	 * particular IValidator.
-	 */
-	public String getTargetObjectName(Object object);
-
-	/**
-	 * Whether full or incremental validation is running, this method will be called, by the
-	 * Validation Framework, for every IResource which is filtered in by the IValidator, so that the
-	 * IValidationContext can receive notification that one of the resources, which validation will run on, is
-	 * being filtered in.
-	 */
-	public void registerResource(IResource resource);
-
-	/**
-	 * This method is called by the Validation Framework, to initialize the IWorkbenchContext so that
-	 * it can gather information from the current project.
-	 */
-	public void setProject(IProject project);
-
-	/**
-	 * Notifies this IWorkbenchContext that the Validation Framework is shutting down. There will be
-	 * calls to closing(IProject) and possibly deleting(IProject) following this call, but the
-	 * resources may already be closed by the time that those methods are called, so EVERYTHING
-	 * should be cleaned up in this method. The parameter passed in is the project which is about to
-	 * shut down. This method will be called once for every IProject in the workbench. The IProject
-	 * may, or may not, be closed.
-	 */
-	public void shutdown();
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/LocalizedMessage.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/LocalizedMessage.java
deleted file mode 100644
index 2472f76..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/LocalizedMessage.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.operations;
-
-import java.util.Locale;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.wst.validation.internal.core.Message;
-
-
-/**
- * This class is provided for validators which run only in UI and whose messages, because they
- * come from another tool, are already localized. LocalizedMessage cannot be used by any validator
- * which needs to run in both WebSphere and WSAD.
- */
-public class LocalizedMessage extends Message {
-	private String _message = null;
-
-	public LocalizedMessage(int severity, String messageText) {
-		this(severity, messageText, null);
-	}
-
-	public LocalizedMessage(int severity, String messageText, IResource targetObject) {
-		this(severity, messageText, (Object) targetObject);
-	}
-
-	public LocalizedMessage(int severity, String messageText, Object targetObject) {
-		super(null, severity, null);
-		setLocalizedMessage(messageText);
-		setTargetObject(targetObject);
-	}
-
-	public void setLocalizedMessage(String message) {
-		_message = message;
-	}
-
-	public String getLocalizedMessage() {
-		return _message;
-	}
-
-	public String getText() {
-		return getLocalizedMessage();
-	}
-
-	public String getText(ClassLoader cl) {
-		return getLocalizedMessage();
-	}
-
-	public String getText(Locale l) {
-		return getLocalizedMessage();
-	}
-
-	public String getText(Locale l, ClassLoader cl) {
-		return getLocalizedMessage();
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/OneValidatorOperation.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/OneValidatorOperation.java
deleted file mode 100644
index c11ec1d..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/OneValidatorOperation.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.operations;
-
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.wst.validation.internal.RegistryConstants;
-import org.eclipse.wst.validation.internal.ValidationRegistryReader;
-import org.eclipse.wst.validation.internal.ValidatorMetaData;
-
-
-/**
- * Implemented Validators must not be called directly by anyone other than instances of
- * ValidationOperation, because some initialization of the validator, and handling of error
- * conditions, is done in the operation. The initialization is separated because some of the
- * information needed to initialize the validator (i.e., the project) isn't known until runtime.
- * 
- * This operation runs a single validator on a project.
- * 
- * This operation is not intended to be subclassed outside of the validation framework.
- */
-public class OneValidatorOperation extends ValidatorSubsetOperation {
-	/**
-	 * @deprecated Will be removed in Milestone 3. Use OneValidatorOperation(project, validatorId,
-	 *             boolean, boolean)
-	 */
-	public OneValidatorOperation(IProject project, String validatorId) throws IllegalArgumentException {
-		this(project, validatorId, DEFAULT_FORCE, DEFAULT_ASYNC);
-	}
-
-	/**
-	 * @deprecated Will be removed in Milestone 3. Use OneValidatorOperation(project, validatorId,
-	 *             boolean, boolean)
-	 */
-	public OneValidatorOperation(IProject project, String validatorId, boolean force) throws IllegalArgumentException {
-		this(project, validatorId, force, DEFAULT_ASYNC);
-	}
-
-	/**
-	 * @deprecated Will be removed in Milestone 3. Use OneValidatorOperation(IProject, String,
-	 *             boolean, int, boolean)
-	 */
-	public OneValidatorOperation(IProject project, String validatorId, boolean force, int ruleGroup) throws IllegalArgumentException {
-		this(project, validatorId, force, ruleGroup, DEFAULT_ASYNC);
-	}
-
-	/**
-	 * @param validatorId
-	 *            The plugin id of the validator which you wish to run.
-	 * @param force
-	 *            If the value is "true", the validator should be run regardless of what the
-	 *            environment settings are; if the value is "false", this operation should be run
-	 *            only if the validation builder will not run the validator.
-	 * 
-	 * IllegalArgumentException will be thrown if the named validator is not configured on the
-	 * project.
-	 * 
-	 * IProject must exist and be open.
-	 * 
-	 * If async is true, the validation will run all thread-safe validators in the background
-	 * validation thread, and all other validators in the main thread. If async is false, all
-	 * validators will run in in the main thread.
-	 */
-	public OneValidatorOperation(IProject project, String validatorId, boolean force, boolean async) throws IllegalArgumentException {
-		this(project, validatorId, force, RegistryConstants.ATT_RULE_GROUP_DEFAULT, async);
-	}
-
-	/**
-	 * OneValidatorOperation constructor comment.
-	 * 
-	 * @param project
-	 *            org.eclipse.core.resources.IProject
-	 * @param validatorId
-	 *            The plugin id of the validator which you wish to run.
-	 * @param force
-	 *            If the value is "true", the validator should be run regardless of what the
-	 *            environment settings are; if the value is "false", this operation should be run
-	 *            only if the validation builder will not run the validator.
-	 * @param ruleGroup
-	 *            Whether a FULL or FAST pass should be invoked.
-	 * 
-	 * IllegalArgumentException will be thrown if the named validator is not configured on the
-	 * project.
-	 * 
-	 * IProject must exist and be open.
-	 * 
-	 * If async is true, the validation will run all thread-safe validators in the background
-	 * validation thread, and all other validators in the main thread. If async is false, all
-	 * validators will run in in the main thread.
-	 */
-	public OneValidatorOperation(IProject project, String validatorId, boolean force, int ruleGroup, boolean async) throws IllegalArgumentException {
-		super(project, force, ruleGroup, async);
-
-		ValidatorMetaData vmd = ValidationRegistryReader.getReader().getValidatorMetaData(validatorId);
-		if (vmd == null) {
-			// No validator, with that plugin id, can be run on that project.
-			// Either the validator isn't installed, or the IProject passed in
-			// doesn't have the necessary nature.
-			throw new IllegalArgumentException(validatorId);
-		}
-
-		if (!vmd.isConfiguredOnProject(project)) {
-			// No validator, with that plugin id, can be run on that project.
-			// Either the validator isn't installed, or the IProject passed in
-			// doesn't have the necessary nature.
-			throw new IllegalArgumentException(validatorId);
-		}
-
-		Set enabled = new HashSet();
-		enabled.add(vmd);
-		setEnabledValidators(enabled);
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ReferencialFileValidator.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ReferencialFileValidator.java
deleted file mode 100644
index a2e1fcc..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ReferencialFileValidator.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on May 3, 2004
- *
- * To change the template for this generated file go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-package org.eclipse.wst.validation.internal.operations;
-
-import java.util.List;
-
-/**
- * @author vijayb
- * 
- * To change the template for this generated type comment go to Window - Preferences - Java - Code
- * Generation - Code and Comments
- */
-public interface ReferencialFileValidator {
-	public List getReferencedFile(List inputFiles);
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ReferencialFileValidatorHelper.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ReferencialFileValidatorHelper.java
deleted file mode 100644
index 1dbe0bd..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ReferencialFileValidatorHelper.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on May 4, 2004
- *
- * To change the template for this generated file go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-package org.eclipse.wst.validation.internal.operations;
-
-import java.util.ArrayList;
-import java.util.List;
-
-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;
-
-/**
- * @author vijayb
- * 
- * To change the template for this generated type comment go to Window - Preferences - Java - Code
- * Generation - Code and Comments
- */
-public class ReferencialFileValidatorHelper {
-	/**
-	 *  
-	 */
-	public ReferencialFileValidatorHelper() {
-		super();
-	}
-
-	/**
-	 * return a list of all files contained in project to infinite depth
-	 */
-	public static List getAllProjectFiles(IProject project) {
-		List result = new ArrayList();
-		if (project == null)
-			return result;
-		try {
-			result = collectFiles(project.members(), result);
-		} catch (CoreException e) {
-			//Ignore
-		}
-		return result;
-	}
-
-	private static List collectFiles(IResource[] members, List result) throws CoreException {
-		// recursively collect files for the given members
-		for (int i = 0; i < members.length; i++) {
-			IResource res = members[i];
-			if (res instanceof IFolder) {
-				collectFiles(((IFolder) res).members(), result);
-			} else if (res instanceof IFile) {
-				result.add(res);
-			}
-		}
-		return result;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ResourceHandler.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ResourceHandler.java
deleted file mode 100644
index fe47c03..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ResourceHandler.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.operations;
-
-
-/**
- * @deprecated For use by the validation framework only. This class retrieves the Strings from the
- *             .properties file appropriate for the machine's Locale.
- */
-public final class ResourceHandler extends org.eclipse.wst.validation.internal.ResourceHandler {
-	//Default
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/TaskListHelper.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/TaskListHelper.java
deleted file mode 100644
index 8532dc1..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/TaskListHelper.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.operations;
-
-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.wst.validation.internal.TaskListUtility;
-
-
-
-/**
- * @deprecated This class is intended to be used only by the validation framework. The
- *             TaskListHelper class will be removed in Milestone 4.
- */
-public class TaskListHelper {
-	private static TaskListHelper _taskListHelper = null;
-
-	public static TaskListHelper getTaskList() {
-		if (_taskListHelper == null) {
-			_taskListHelper = new TaskListHelper();
-		}
-		return _taskListHelper;
-	}
-
-	/**
-	 * This method adds a message to a resource in the task list.
-	 */
-	public void addTask(String pluginId, IResource resource, String location, String messageId, String message, int markerType, String targetObjectName, String groupName, int offset, int length) throws CoreException {
-		TaskListUtility.addTask(pluginId, resource, location, messageId, message, markerType, targetObjectName, groupName, offset, length);
-	}
-
-
-	public IMarker[] getValidationTasks(int severity, IProject project) {
-		return TaskListUtility.getValidationTasks(severity, project);
-	}
-
-	public IMarker[] getValidationTasks(IResource resource, int severity) {
-		return TaskListUtility.getValidationTasks(resource, severity);
-	}
-
-	public IMarker[] getValidationTasks(IResource resource, String messageOwner) {
-		return TaskListUtility.getValidationTasks(resource, messageOwner);
-	}
-
-	public IMarker[] getValidationTasks(IResource resource, String[] messageOwners) {
-		return TaskListUtility.getValidationTasks(resource, messageOwners);
-	}
-
-	/**
-	 * Remove all validation messages from the resource and its children.
-	 */
-	public void removeAllTasks(IResource resource) {
-		TaskListUtility.removeAllTasks(resource);
-	}
-
-	/**
-	 * This method removes all tasks from the resource. If the resource is an IProject, all tasks
-	 * are also removed from the project's children.
-	 */
-	public void removeAllTasks(IResource resource, String[] owners) throws CoreException {
-		TaskListUtility.removeAllTasks(resource, owners);
-	}
-
-	/**
-	 * This method removes all messages from a resource in the task list.
-	 */
-	public void removeAllTasks(IResource resource, String owner, String objectName) throws CoreException {
-		TaskListUtility.removeAllTasks(resource, owner, objectName);
-	}
-
-	public void removeAllTasks(IResource resource, String[] owners, String objectName) throws CoreException {
-		TaskListUtility.removeAllTasks(resource, owners, objectName);
-	}
-
-	/**
-	 * This method removes a subset of tasks from the project, including child tasks. Every task
-	 * which belongs to the group, identified by groupName, will be removed.
-	 */
-	public void removeTaskSubset(IResource resource, String[] owners, String objectName, String groupName) throws CoreException {
-		TaskListUtility.removeTaskSubset(resource, owners, objectName, groupName);
-	}
-
-	/**
-	 * This method changes all validator markers which are owned by "from" to make their owner "to".
-	 */
-	public void updateOwner(String from, String to) throws CoreException {
-		TaskListUtility.updateOwner(from, to);
-	}
-
-	/**
-	 * This method changes all validator markers on the IResource and its children. All markers
-	 * owned by "from" have their owner reassigned to "to".
-	 */
-	public void updateOwner(String from, String to, IResource resource) throws CoreException {
-		TaskListUtility.updateOwner(from, to, resource);
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidationBuilder.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidationBuilder.java
deleted file mode 100644
index cf2ea0a..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidationBuilder.java
+++ /dev/null
@@ -1,300 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.operations;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.logging.Level;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.validation.internal.ConfigurationManager;
-import org.eclipse.wst.validation.internal.InternalValidatorManager;
-import org.eclipse.wst.validation.internal.ProjectConfiguration;
-import org.eclipse.wst.validation.internal.ResourceConstants;
-import org.eclipse.wst.validation.internal.ResourceHandler;
-import org.eclipse.wst.validation.internal.TimeEntry;
-import org.eclipse.wst.validation.internal.ValidatorMetaData;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-
-/**
- * Validation Framework Builder.
- * 
- * This builder is configured on J2EE IProjects automatically, can be added to other types of
- * projects through the Properties page, and launches validation on the project if the project has
- * build validation enabled.
- */
-public class ValidationBuilder extends IncrementalProjectBuilder {
-	public static final int NO_DELTA_CHANGE = -1; // Since IResourceConstants
-	protected List referencedProjects;
-	protected IWorkbenchContext workbenchContext = null;
-
-	// doesn't have a "no delta"
-	// flag, let this constant be
-	// the flag.
-	public ValidationBuilder() {
-		super();
-	}
-
-	private IProject[] getAllReferencedProjects(IProject project, Set visitedProjects) {
-		if (visitedProjects == null)
-			visitedProjects = new HashSet();
-		else if (visitedProjects.contains(project))
-			return getReferencedProjects();
-		else
-			visitedProjects.add(project);
-		if (referencedProjects == null)
-			referencedProjects = new ArrayList();
-		try {
-			if (project.isAccessible()) {
-				IProject[] refProjArray = project.getReferencedProjects();
-				collectReferecedProject(refProjArray);
-				for (int i = 0; i < refProjArray.length; i++) {
-					IProject refProject = refProjArray[i];
-					getAllReferencedProjects(refProject, visitedProjects);
-				}
-			}
-			return getReferencedProjects();
-		} catch (CoreException core) {
-			return null;
-		}
-	}
-	
-	public IWorkbenchContext getWorkbenchContext() {
-		if(workbenchContext == null) {
-			workbenchContext = new WorkbenchContext();
-			workbenchContext.setProject(getProject());
-		}
-		return workbenchContext;
-	}
-
-
-	/**
-	 * @param referencedProjects2
-	 * @param refProjArray
-	 */
-	private void collectReferecedProject(IProject[] refProjArray) {
-		for (int i = 0; i < refProjArray.length; i++) {
-			IProject project = refProjArray[i];
-			if (!referencedProjects.contains(project))
-				referencedProjects.add(project);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.resources.IncrementalProjectBuilder#clean(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	protected void clean(IProgressMonitor monitor) throws CoreException {
-		IProject currentProject = getProject();
-		if (currentProject == null || !currentProject.isAccessible())
-			return;
-		try {
-			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(currentProject);
-			ValidatorMetaData[] vmds = prjp.getValidators();
-			for (int i = 0; i < vmds.length; i++) {
-				ValidatorMetaData vmd = vmds[i];
-				// For validators who aren't going to run, clear their messages from the task list.
-				// Don't need to check for duplicate entries because each Validator must be unique.
-				// The uniqueness of each Validator is checked by the plugin registry.
-				WorkbenchReporter.removeAllMessages(currentProject, vmd.getValidatorNames(), null);
-			}
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("ValidatorManager.updateTaskList(" + currentProject.getName() + ")"); //$NON-NLS-1$  //$NON-NLS-2$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-		}
-
-	}
-
-	/**
-	 * @param referencedProjects
-	 * @return
-	 */
-	private IProject[] getReferencedProjects() {
-		IProject[] refProjArray = new IProject[referencedProjects.size()];
-		for (int i = 0; i < referencedProjects.size(); i++) {
-			refProjArray[i] = (IProject) referencedProjects.get(i);
-		}
-		return refProjArray;
-	}
-
-	public IProject[] build(int kind, Map parameters, IProgressMonitor monitor) {
-		long start = System.currentTimeMillis();
-		int executionMap = 0x0;
-		Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-		IResourceDelta delta = null;
-		IProject project = getProject();
-		IProject[] referenced = getAllReferencedProjects(project, null);
-		try {
-			if (ValidatorManager.getManager().isSuspended(project)) {
-				// Do not perform validation on this project
-				executionMap |= 0x1;
-				return referenced;
-			}
-			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-			delta = getDelta(project);
-			boolean doFullBuild = (kind == FULL_BUILD);
-			boolean doAutoBuild = ((delta != null) && (kind == AUTO_BUILD));
-			boolean doIncrementalBuild = ((delta != null) && (kind == INCREMENTAL_BUILD));
-			if ((doFullBuild || doIncrementalBuild) && !prjp.isBuildValidate()) {
-				// Is a build validation about to be invoked? If so, does the
-				// user want build validation to run?
-				executionMap |= 0x2;
-				return referenced;
-			}
-			// It is possible for kind to == AUTO_BUILD while delta is null
-			// (saw this
-			// when creating a project by copying another project.)
-			// However, a "Rebuild Project" will invoke this builder with
-			// kind==FULL_BUILD
-			// and a null delta, and validation should run in that case.
-			if (!doFullBuild && delta == null) {
-				if (isReferencedProjectInDelta(referenced)) {
-					performFullBuildForReferencedProjectChanged(monitor, prjp);
-				} else {
-					String[] msgParms = new String[]{project.getName()};
-					monitor.subTask(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_NULL_DELTA, msgParms));
-					// A null delta means that a full build must be performed,
-					// but this builder was invoked with an incremental or
-					// automatic
-					// build kind. Return without doing anything so that the
-					// user
-					// doesn't have to wait forever.
-					executionMap |= 0x4;
-				}
-				return referenced;
-			}
-			if (doFullBuild) {
-				performFullBuild(monitor, prjp);
-			} else {
-				if (doAutoBuild && !prjp.isAutoValidate()) {
-					executionMap |= 0x8;
-					return referenced;
-				}
-				if (delta.getAffectedChildren().length == 0) {
-					if (isReferencedProjectInDelta(referenced))
-						performFullBuildForReferencedProjectChanged(monitor, prjp);
-					else
-						executionMap |= 0x10;
-					return referenced;
-				}
-				EnabledIncrementalValidatorsOperation operation = new EnabledIncrementalValidatorsOperation(project, delta, prjp.runAsync());
-				operation.run(monitor);
-			}
-			return referenced;
-		} catch (InvocationTargetException exc) {
-			logInvocationTargetException(logger, exc);
-			executionMap |= 0x20;
-			return referenced;
-		} catch (Throwable exc) {
-			logBuildError(logger, exc);
-			executionMap |= 0x40;
-			return referenced;
-		} finally {
-			referencedProjects = null;
-			// The builder's time needs to be FINE because the builder is
-			// called often.
-			if (logger.isLoggingLevel(Level.FINE)) {
-				logBuilderTimeEntry(start, executionMap, logger, delta);
-			}
-		}
-	}
-
-	/**
-	 * @param referenced
-	 * @return
-	 */
-	private boolean isReferencedProjectInDelta(IProject[] referenced) {
-		IProject p = null;
-		for (int i = 0; i < referenced.length; i++) {
-			p = referenced[i];
-			IResourceDelta delta = getDelta(p);
-			if (delta != null && delta.getAffectedChildren().length > 0)
-				return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @param monitor
-	 * @param prjp
-	 */
-	private void performFullBuildForReferencedProjectChanged(IProgressMonitor monitor, ProjectConfiguration prjp) throws InvocationTargetException {
-		performFullBuild(monitor, prjp, true);
-	}
-
-	private void performFullBuild(IProgressMonitor monitor, ProjectConfiguration prjp) throws InvocationTargetException {
-		performFullBuild(monitor, prjp, false);
-	}
-
-	private void performFullBuild(IProgressMonitor monitor, ProjectConfiguration prjp, boolean onlyDependentValidators) throws InvocationTargetException {
-		ValidatorMetaData[] enabledValidators = prjp.getEnabledFullBuildValidators(true, onlyDependentValidators);
-		if ((enabledValidators != null) && (enabledValidators.length > 0)) {
-			Set enabledValidatorsSet = InternalValidatorManager.wrapInSet(enabledValidators);
-			EnabledValidatorsOperation op = new EnabledValidatorsOperation(getProject(), enabledValidatorsSet, prjp.runAsync());
-			op.run(monitor);
-		}
-	}
-
-	private void logInvocationTargetException(Logger logger, InvocationTargetException exc) {
-		if (logger.isLoggingLevel(Level.SEVERE)) {
-			LogEntry entry = ValidationPlugin.getLogEntry();
-			entry.setSourceID("ValidationBuilder::build"); //$NON-NLS-1$
-			entry.setTargetException(exc);
-			logger.write(Level.SEVERE, entry);
-			if (exc.getTargetException() != null) {
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-		}
-	}
-
-	private void logBuildError(Logger logger, Throwable exc) {
-		if (logger.isLoggingLevel(Level.SEVERE)) {
-			LogEntry entry = ValidationPlugin.getLogEntry();
-			entry.setSourceID("ValidationBuilder.build(int, Map, IProgressMonitor)"); //$NON-NLS-1$
-			entry.setTargetException(exc);
-			logger.write(Level.SEVERE, entry);
-		}
-	}
-
-	private void logBuilderTimeEntry(long start, int executionMap, Logger logger, IResourceDelta delta) {
-		TimeEntry entry = ValidationPlugin.getTimeEntry();
-		entry.setSourceID("ValidationBuilder.build(int, Map, IProgressMonitor)"); //$NON-NLS-1$
-		entry.setProjectName(getProject().getName()); //$NON-NLS-1$  //$NON-NLS-2$
-		entry.setExecutionMap(executionMap);
-		entry.setElapsedTime(System.currentTimeMillis() - start);
-		if (delta == null) {
-			entry.setDetails("delta == null"); //$NON-NLS-1$
-		}
-		entry.setToolName("ValidationBuilder"); //$NON-NLS-1$
-		logger.write(Level.FINE, entry);
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidationConstants.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidationConstants.java
deleted file mode 100644
index 1e37524..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidationConstants.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.operations;
-
-
-import org.eclipse.wst.validation.internal.ResourceConstants;
-
-/**
- * @deprecated For use by the validation framework only.
- * 
- * Constants used to access the string resources associated with the plugin.
- * 
- * See the plugin.properties file, in the plugin's directory, for the contents of the strings.
- */
-public interface ValidationConstants extends ResourceConstants {
-	//Default
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidationOperation.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidationOperation.java
deleted file mode 100644
index 04c9bad..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidationOperation.java
+++ /dev/null
@@ -1,1480 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.operations;
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.logging.Level;
-
-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.IResourceDelta;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.frameworks.internal.operations.IHeadlessRunnableWithProgress;
-import org.eclipse.wst.validation.internal.FilterUtil;
-import org.eclipse.wst.validation.internal.IProjectValidationHelper;
-import org.eclipse.wst.validation.internal.InternalValidatorManager;
-import org.eclipse.wst.validation.internal.ReferencialFileValidatorRegistryReader;
-import org.eclipse.wst.validation.internal.RegistryConstants;
-import org.eclipse.wst.validation.internal.ResourceConstants;
-import org.eclipse.wst.validation.internal.ResourceHandler;
-import org.eclipse.wst.validation.internal.TimeEntry;
-import org.eclipse.wst.validation.internal.VThreadManager;
-import org.eclipse.wst.validation.internal.ValidationRegistryReader;
-import org.eclipse.wst.validation.internal.ValidatorMetaData;
-import org.eclipse.wst.validation.internal.core.IFileDelta;
-import org.eclipse.wst.validation.internal.core.Message;
-import org.eclipse.wst.validation.internal.core.ValidationException;
-import org.eclipse.wst.validation.internal.core.ValidatorLauncher;
-import org.eclipse.wst.validation.internal.plugin.ValidationHelperRegistryReader;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-import org.eclipse.wst.validation.internal.provisional.core.IReporter;
-import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
-import org.eclipse.wst.validation.internal.provisional.core.IValidator;
-import org.eclipse.wst.validation.internal.provisional.core.MessageLimitException;
-
-/**
- * Implemented Validators methods must not be called directly by anyone other than this class, since
- * some initialization of the validator is done here (via the getProject() method). The
- * initialization is separated because the IProject isn't known until runtime.
- * 
- * This operation is not intended to be subclassed outside of the validation framework.
- */
-public abstract class ValidationOperation implements IWorkspaceRunnable, IHeadlessRunnableWithProgress {
-	public static final int NO_DELTA_CHANGE = -1; // Since IResourceConstants
-	// doesn't have a "no delta"
-	// flag, let this constant be
-	// the flag.
-	private static final String DELTA_AS_STRING = "IFileDelta[{0}] '{'{1}'}'"; //$NON-NLS-1$
-	private static final String COMMA = ", "; //$NON-NLS-1$
-	protected static final boolean DEFAULT_ASYNC = false; // For the deprecated
-	// constructors, by
-	// default the
-	// operation will not
-	// fork.
-	protected static final boolean DEFAULT_FORCE = true; // By default, run the
-	// operation whether
-	// or not it needs to
-	/**
-	 * @deprecated Will be removed in Milestone 3. Use DEFAULT_ASYNC
-	 */
-	protected static final boolean DEFAULT_FORK = false; // @deprecated
-	private IProject _project = null; // project to be validated
-	private int _ruleGroup = RegistryConstants.ATT_RULE_GROUP_DEFAULT; // which
-	// pass
-	// should
-	// the
-	// validation
-	// invoke
-	private boolean _fork = DEFAULT_ASYNC; // do not fork the validation into a
-	// different thread by default
-	private Map _fileDeltas = null; // To reduce object creation,
-	private IResourceDelta _delta = null;
-	// the resource delta tree to be processed, or null if a full build/menu
-	// option was triggered. This value is cached so that validation can be run
-	// either from a builder, or from a menu item. (The Operation interface
-	// doesn't allow any parameter on execute except the IProgressMonitor.)
-	private Set _enabledValidators = null;
-	private boolean _force = DEFAULT_FORCE; // force this operation to run even
-	// if it doesn't need to?
-	private boolean _isFullValidate = false; // Run a full validation or an
-	// incremental? (true = full)
-	private Boolean _isAutoBuild = null; // Is the global auto-build preference
-	// enabled?
-	private Set _launchedValidators = null; // A list of the validators that
-	
-	protected IWorkbenchContext context;
-
-	// are enabled and were launched
-	// (i.e., that have input to
-	// validate). For internal
-	// validation framework use only;
-	// it's needed for the automatic
-	// tests.
-	/**
-	 * This method is used for FINEST logging, to report exactly what deltas were about to be
-	 * validated.
-	 */
-	private static final String getDeltaAsString(IFileDelta[] delta) {
-		String args = ""; //$NON-NLS-1$
-		int numArgs = 0;
-		if (delta != null) {
-			numArgs = delta.length;
-			StringBuffer buffer = new StringBuffer();
-			for (int i = 0; i < delta.length; i++) {
-				buffer.append(COMMA);
-				buffer.append(delta[i].toString());
-			}
-			buffer.replace(0, 1, ""); //$NON-NLS-1$ // magic numbers 0 and 1 => Remove first COMMA from the list (hence index 0); length of COMMA is 2, hence index 0, 1.
-			args = buffer.toString();
-		}
-		return MessageFormat.format(DELTA_AS_STRING, new String[]{String.valueOf(numArgs), args});
-	}
-
-	protected static void checkCanceled(WorkbenchReporter reporter) throws OperationCanceledException {
-		if (reporter == null) {
-			return;
-		} else if (reporter.getProgressMonitor().isCanceled()) {
-			throw new OperationCanceledException(""); //$NON-NLS-1$
-		}
-	}
-
-	protected static boolean shouldForce(IResourceDelta delta) {
-		return ((delta == null) ? DEFAULT_FORCE : false);
-	}
-
-	protected static boolean shouldForce(Object[] changedResources) {
-		return (((changedResources == null) || (changedResources.length == 0)) ? DEFAULT_FORCE : false);
-	}
-
-	/**
-	 * @deprecated. Will be removed in Milestone 3. Use ValidationOperation(project, boolean)
-	 */
-	public ValidationOperation(IProject project) {
-		this(project, DEFAULT_ASYNC, DEFAULT_FORCE);
-	}
-
-	/**
-	 * Internal.
-	 */
-	public ValidationOperation(IProject project, boolean force, boolean async) {
-		this(project, null, null, RegistryConstants.ATT_RULE_GROUP_DEFAULT, force, async);
-	}
-
-	/**
-	 * @deprecated. Will be removed in Milestone 3. Use ValidationOperation(project, int, boolean)
-	 */
-	public ValidationOperation(IProject project, int ruleGroup) {
-		this(project, null, null, ruleGroup, DEFAULT_FORCE, DEFAULT_ASYNC);
-	}
-
-	/**
-	 * @deprecated. Will be removed in Milestone 3. Use ValidationOperation(IProject,
-	 *              IResourceDelta, Boolean, int, boolean, boolean)
-	 */
-	public ValidationOperation(IProject project, IResourceDelta delta, boolean isAutoBuild, int ruleGroup, boolean force, boolean fork) {
-		this(project, delta, ((isAutoBuild) ? Boolean.TRUE : Boolean.FALSE), ruleGroup, fork, force);
-	}
-
-	/**
-	 * Internal.
-	 */
-	protected ValidationOperation(IProject project, IResourceDelta delta, Boolean isAutoBuild, int ruleGroup, boolean force, boolean fork) {
-		super();
-		_project = project;
-		_delta = delta;
-		_isAutoBuild = isAutoBuild;
-		_ruleGroup = ruleGroup;
-		_fork = fork;
-		_force = force;
-		_enabledValidators = new HashSet();
-	}
-	
-	/**
-	 * Internal.
-	 */
-	protected ValidationOperation(IProject project, IWorkbenchContext aContext, IResourceDelta delta, Boolean isAutoBuild, int ruleGroup, boolean force, boolean fork) {
-		super();
-		_project = project;
-		_delta = delta;
-		_isAutoBuild = isAutoBuild;
-		_ruleGroup = ruleGroup;
-		_fork = fork;
-		_force = force;
-		_enabledValidators = new HashSet();
-		context = aContext;
-	}
-
-	/**
-	 * @deprecated Will be removed in Milestone 3.
-	 */
-	protected void terminateCleanup(WorkbenchReporter reporter) {
-		Set enabledValidators = getEnabledValidators();
-		Iterator iterator = enabledValidators.iterator();
-		ValidatorMetaData vmd = null;
-		try {
-			while (iterator.hasNext()) {
-				vmd = (ValidatorMetaData) iterator.next();
-				reporter.displaySubtask(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_VALIDATOR_CLEANUP, new String[]{vmd.getValidatorDisplayName()}));
-				try {
-					reporter.removeAllMessages(vmd.getValidator());
-				} catch (InstantiationException exc) {
-					// Remove the vmd from the reader's list
-					ValidationRegistryReader.getReader().disableValidator(vmd);
-					// Log the reason for the disabled validator
-					final Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-					if (logger.isLoggingLevel(Level.SEVERE)) {
-						LogEntry entry = ValidationPlugin.getLogEntry();
-						entry.setSourceID("ValidationOperation::terminateCleanup"); //$NON-NLS-1$
-						entry.setTargetException(exc);
-						logger.write(Level.SEVERE, entry);
-					}
-					continue;
-				}
-				addCancelTask(vmd);
-				reporter.displaySubtask(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_VALIDATOR_TERMINATED, new String[]{getProject().getName(), vmd.getValidatorDisplayName()}));
-			}
-		} catch (MessageLimitException e) {
-			ValidatorManager.getManager().addMessageLimitExceeded(getProject());
-		}
-	}
-
-	/**
-	 * @param vmd
-	 * @param delta
-	 * @param logger
-	 * @param start
-	 */
-//	private void logValidationInfo(ValidatorMetaData vmd, IFileDelta[] delta, Logger logger, long start) {
-//		long finish = System.currentTimeMillis();
-//		TimeEntry entry = ValidationPlugin.getTimeEntry();
-//		entry.setSourceID("ValidationOperation.launchValidator"); //$NON-NLS-1$
-//		entry.setProjectName(getProject().getName());
-//		entry.setToolName(vmd.getValidatorUniqueName());
-//		entry.setElapsedTime(finish - start);
-//		if (logger.isLoggingLevel(Level.FINE)) {
-//			StringBuffer buffer = new StringBuffer();
-//			if (isFullValidate()) {
-//				buffer.append("EVERYTHING"); //$NON-NLS-1$
-//			} else {
-//				if (delta.length == 0) {
-//					buffer.append("NOTHING"); //$NON-NLS-1$
-//				} else {
-//					buffer.append(getDeltaAsString(delta));
-//				}
-//			}
-//			entry.setDetails(buffer.toString());
-//		}
-//		logger.write(Level.INFO, entry);
-//	}
-
-	/**
-	 * @param reporter
-	 * @param vmd
-	 * @param logger
-	 * @param exc
-	 */
-//	private void handleThrowables(WorkbenchReporter reporter, ValidatorMetaData vmd, Logger logger, Throwable exc) {
-//		// If a runtime exception has occured, e.g. NullPointer or ClassCast,
-//		// display it with the "A runtime exception has occurred " messsage.
-//		// This will provide more information to the user when he/she calls IBM
-//		// Service.
-//		if (logger.isLoggingLevel(Level.SEVERE)) {
-//			LogEntry entry = ValidationPlugin.getLogEntry();
-//			entry.setSourceID("ValidationOperation::launchValidator"); //$NON-NLS-1$
-//			entry.setTargetException(exc);
-//			logger.write(Level.SEVERE, entry);
-//		}
-//		String[] msgParm = {exc.getClass().getName(), vmd.getValidatorDisplayName(), (exc.getMessage() == null ? "" : exc.getMessage())}; //$NON-NLS-1$
-//		Message message = ValidationPlugin.getMessage();
-//		message.setSeverity(IMessage.NORMAL_SEVERITY);
-//		message.setId(ResourceConstants.VBF_EXC_RUNTIME);
-//		message.setParams(msgParm);
-//		try {
-//			reporter.addMessage(vmd.getValidator(), message);
-//		} catch (InstantiationException exc2) {
-//			handleInstantiationException(vmd, logger, exc2);
-//		} catch (MessageLimitException e) {
-//			throw e;
-//		}
-//		return;
-//	}
-
-	/**
-	 * @param vmd
-	 * @param logger
-	 * @param exc2
-	 */
-//	private void handleInstantiationException(ValidatorMetaData vmd, Logger logger, InstantiationException exc2) {
-//		// Remove the vmd from the reader's list
-//		ValidationRegistryReader.getReader().disableValidator(vmd);
-//		// Log the reason for the disabled validator
-//		if (logger.isLoggingLevel(Level.SEVERE)) {
-//			LogEntry entry = ValidationPlugin.getLogEntry();
-//			entry.setSourceID("ValidationOperation::launchValidator (deprecated)"); //$NON-NLS-1$
-//			entry.setTargetException(exc2);
-//			logger.write(Level.SEVERE, entry);
-//		}
-//	}
-
-	/**
-	 * @param reporter
-	 * @param vmd
-	 * @param logger
-	 * @param exc
-	 */
-//	private void handleValidationExceptions(WorkbenchReporter reporter, ValidatorMetaData vmd, Logger logger, ValidationException exc) {
-//		// First, see if a validator just caught all Throwables and
-//		// accidentally wrapped a MessageLimitException instead of propagating
-//		// it.
-//		if (exc.getAssociatedException() != null) {
-//			if (exc.getAssociatedException() instanceof MessageLimitException) {
-//				MessageLimitException mssgExc = (MessageLimitException) exc.getAssociatedException();
-//				throw mssgExc;
-//			} else if (exc.getAssociatedException() instanceof ValidationException) {
-//				try {
-//					ValidationException vexc = (ValidationException) exc.getAssociatedException();
-//					vexc.setClassLoader(vmd.getValidator().getClass().getClassLoader()); // first,
-//					// set the class loader,so that the exception's getMessage() method can retrieve
-//					// the resource bundle
-//				} catch (InstantiationException exc2) {
-//					handleInstantiationException(vmd, logger, exc2);
-//				}
-//			}
-//		}
-//		// If there is a problem with this particular validator, log the error
-//		// and continue
-//		// with the next validator.
-//		try {
-//			exc.setClassLoader(vmd.getValidator().getClass().getClassLoader()); // first,
-//			// set the class loader,so that the exception's getMessage() method can retrieve the
-//			// resource bundle
-//		} catch (InstantiationException exc2) {
-//			handleInstantiationException(vmd, logger, exc2);
-//		}
-//		if (logger.isLoggingLevel(Level.SEVERE)) {
-//			LogEntry entry = ValidationPlugin.getLogEntry();
-//			entry.setSourceID("ValidationOperation.validate(WorkbenchMonitor)"); //$NON-NLS-1$
-//			entry.setTargetException(exc);
-//			logger.write(Level.SEVERE, entry);
-//			if (exc.getAssociatedException() != null) {
-//				entry.setTargetException(exc.getAssociatedException());
-//				logger.write(Level.SEVERE, entry);
-//			}
-//		}
-//		String message = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_ENDING_VALIDATION_ABNORMALLY, new String[]{getProject().getName(), vmd.getValidatorDisplayName()});
-//		reporter.displaySubtask(message);
-//		if (exc.getAssociatedMessage() != null) {
-//			try {
-//				reporter.addMessage(vmd.getValidator(), exc.getAssociatedMessage());
-//			} catch (InstantiationException exc2) {
-//				handleInstantiationException(vmd, logger, exc2);
-//			}
-//		}
-//	}
-
-	/**
-	 * @param reporter
-	 * @param vmd
-	 * @param logger
-	 * @param exc
-	 */
-//	private void handleHelperCleanupExceptions(WorkbenchReporter reporter, ValidatorMetaData vmd, Logger logger, Throwable exc) {
-//		// If a runtime exception has occured, e.g. NullPointer or ClassCast,
-//		// display it with the "A runtime exception has occurred " messsage.
-//		// This will provide more information to the user when he/she calls IBM
-//		// Service.
-//		if (logger.isLoggingLevel(Level.SEVERE)) {
-//			LogEntry entry = ValidationPlugin.getLogEntry();
-//			entry.setSourceID("ValidationOperation::launchValidator"); //$NON-NLS-1$
-//			entry.setTargetException(exc);
-//			logger.write(Level.SEVERE, entry);
-//		}
-//		String[] msgParm = {exc.getClass().getName(), vmd.getValidatorDisplayName(), (exc.getMessage() == null ? "" : exc.getMessage())}; //$NON-NLS-1$
-//		Message message = ValidationPlugin.getMessage();
-//		message.setSeverity(IMessage.NORMAL_SEVERITY);
-//		message.setId(ResourceConstants.VBF_EXC_RUNTIME);
-//		message.setParams(msgParm);
-//		try {
-//			reporter.addMessage(vmd.getValidator(), message);
-//		} catch (InstantiationException exc2) {
-//			handleInstantiationException(vmd, logger, exc2);
-//		} catch (MessageLimitException e) {
-//			throw e;
-//		}
-//		return;
-//	}
-
-	public boolean isFork() {
-		return _fork;
-	}
-
-	public boolean isForce() {
-		return _force;
-	}
-
-	public void setForce(boolean force) {
-		_force = force;
-	}
-
-	/**
-	 * If the code that invoked this operation suspended auto-build before invoking this operation,
-	 * the user's auto-build setting is stored in the following methods.
-	 */
-	public boolean isAutoBuild() {
-		if (_isAutoBuild == null) {
-			return ValidatorManager.getManager().isGlobalAutoBuildEnabled();
-		}
-		return _isAutoBuild.booleanValue();
-	}
-
-	protected void setAutoBuild(boolean autoOn) {
-		_isAutoBuild = ((autoOn) ? Boolean.TRUE : Boolean.FALSE);
-	}
-
-	protected boolean isFullValidate() {
-		return _isFullValidate;
-	}
-
-	private void setFullValidate(boolean b) {
-		_isFullValidate = b;
-	}
-
-	protected int getRuleGroup() {
-		return _ruleGroup;
-	}
-
-	/**
-	 * Return true if the given validator must run (i.e., it has changes to validate, and it was not
-	 * run automatically.)
-	 */
-	private boolean isValidationNecessary(ValidatorMetaData vmd, IFileDelta[] delta) {
-		// Validation is not necessary if:
-		//    1. auto-validation has run and the validator is incremental,
-		//    2. There are no files for the validator to validate.
-		// There are files to validate if this is a full validation or if the
-		// validator filtered in some of the deltas.
-		boolean autoValidateRan = false;
-		if (_isAutoBuild != null) {
-			// User set the autoBuild default, so check if validation is
-			// necessary or not.
-			autoValidateRan = ValidatorManager.getManager().isAutoValidate(getProject(), _isAutoBuild.booleanValue()) && vmd.isIncremental();
-		}
-		boolean hasFiles = (isFullValidate() || (delta.length > 0));
-		return (!autoValidateRan && hasFiles);
-	}
-
-	/**
-	 * Return true if, given the enabled validators and file deltas, there is work for this
-	 * operation to do.
-	 */
-	public boolean isNecessary(IProgressMonitor monitor) throws CoreException, OperationCanceledException {
-		Set enabledValidators = getEnabledValidators();
-		if ((enabledValidators == null) || (enabledValidators.size() == 0)) {
-			return false;
-		}
-		if (isFullValidate()) {
-			return true;
-		}
-		Iterator iterator = enabledValidators.iterator();
-		while (iterator.hasNext()) {
-			ValidatorMetaData vmd = (ValidatorMetaData) iterator.next();
-			if (isValidationNecessary(vmd, getFileDeltas(monitor, vmd))) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	private Map getFileDeltas(IProgressMonitor monitor) throws CoreException {
-		if (_fileDeltas == null) {
-			loadFileDeltas(monitor);
-		}
-		return _fileDeltas;
-	}
-
-	private IFileDelta[] getFileDeltas(IProgressMonitor monitor, ValidatorMetaData vmd) throws CoreException {
-		Set result = (Set) getFileDeltas(monitor).get(vmd);
-		if (result == null) {
-			return new IFileDelta[0];
-		}
-		IFileDelta[] temp = new IFileDelta[result.size()];
-		result.toArray(temp);
-		return temp;
-	}
-
-	/**
-	 * Store the file deltas (VMD <=>Set[IFileDelta]) if the file deltas haven't been loaded. If the
-	 * deltas have already been loaded, return without doing anything.
-	 */
-	private void loadFileDeltas(IProgressMonitor monitor) throws CoreException {
-		// Although, for a full build, we don't build up a list of changed
-		// files, we do need to notify each IWorkbenchContext that an
-		// IResource has been filtered in.
-		// It's a full validation if the IResourceDelta is null and the
-		// Object[] (or IResource[]) is also null.
-		// i.e., it's a full validation if no incremental input has been set.
-		setFullValidate((getDelta() == null) && (_fileDeltas == null));
-		if (isFullValidate()) {
-			_fileDeltas = FilterUtil.loadDeltas(monitor, getEnabledValidators(), getProject());
-		} else {
-			_fileDeltas = FilterUtil.loadDeltas(monitor, getEnabledValidators(), getDelta()); // traverse,
-			// and process, each resource in the delta tree
-		}
-	}
-
-	protected void setFileDeltas(Map deltas) {
-		_fileDeltas = deltas;
-	}
-
-	protected IResourceDelta getDelta() {
-		return _delta;
-	}
-
-	protected void setDelta(IResourceDelta delta) {
-		_delta = delta;
-	}
-
-	protected boolean areValidatorsEnabled() {
-		return (getEnabledValidators().size() != 0);
-	}
-
-	/**
-	 * Return the validators which are both configured on this type of project, (as stored in
-	 * getProject()), and enabled by the user on this project.
-	 */
-	public Set getEnabledValidators() {
-		return _enabledValidators;
-	}
-
-	/**
-	 * This is an internal method, subject to change without notice. It is provided only for the
-	 * automated validation framework tests.
-	 */
-	public Set getLaunchedValidators() {
-		if (_launchedValidators == null) {
-			_launchedValidators = new HashSet();
-		}
-		return _launchedValidators;
-	}
-
-	protected void setEnabledValidators(Set evmds) {
-		// Check that every VMD in the set is configured on this project.
-		// Necessary because the user can manually choose which validators
-		// to launch, and the validator may not be installed.
-		_enabledValidators.clear();
-		Iterator iterator = evmds.iterator();
-		while (iterator.hasNext()) {
-			ValidatorMetaData vmd = (ValidatorMetaData) iterator.next();
-			if (ValidationRegistryReader.getReader().isConfiguredOnProject(vmd, getProject())) {
-				_enabledValidators.add(vmd);
-			}
-		}
-	}
-
-	/**
-	 * This method returns the IProject that this ValidationOperation was created with.
-	 */
-	public IProject getProject() {
-		return _project;
-	}
-
-	protected int getUnitsOfWork() {
-		/*
-		 * // Let one unit of work equal one resource. number of enabled validators // i.e., each
-		 * enabled validator must process (at most) each resource in the project; count each process
-		 * as one unit of work // Note that this is a ceiling number, because if we're doing an
-		 * incremental validation, not all resources will // be validated.
-		 * setNumResources(countResources(getProject())); getEnabledValidators().size();
-		 */
-		// Until the validators can report units-of-work complete,
-		// initialize the monitor with an unknown amount of work.
-		// (So the user will see movement in the progress bar, even
-		// if the movement doesn't indicate the amount of work done.)
-		return IProgressMonitor.UNKNOWN;
-	}
-
-	/**
-	 * If the user is cancelling validation on the current project/resource, Add an information task
-	 * to the task list informing the user that validation has not been run on the current project.
-	 */
-	protected void addCancelTask(ValidatorMetaData vmd) {
-		InternalValidatorManager.getManager().addOperationTask(getProject(), vmd, ResourceConstants.VBF_STATUS_VALIDATOR_TERMINATED, new String[]{getProject().getName(), vmd.getValidatorDisplayName()});
-	}
-
-	/**
-	 * This method starts the validation of each configured enabled validator on the current
-	 * project.
-	 * 
-	 * The IProgressMonitor passed in must not be null.
-	 */
-	public void run(IProgressMonitor progressMonitor) throws OperationCanceledException {
-		long start = System.currentTimeMillis();
-		final Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-		try {
-			// In order to check whether or not the monitor has been cancelled,
-			// the monitor must not be null.
-			if (progressMonitor == null) {
-				return;
-			}
-			if (ValidatorManager.getManager().isSuspended(getProject())) {
-				return;
-			}
-			if (!areValidatorsEnabled()) {
-				// save some processing time...
-				return;
-			}
-			if (ValidatorManager.getManager().getMaximumMessagesAllowed(getProject()) == 0) {
-				// save some processing time
-				return;
-			}
-			final WorkbenchReporter reporter = new WorkbenchReporter(getProject(), progressMonitor);
-
-			try {
-				// Periodically check if the user has cancelled the operation
-				checkCanceled(reporter);
-				preValidate(reporter);
-				validate(reporter);
-				validateReferencialFiles(reporter);
-			} catch (CoreException exc) {
-				if (logger.isLoggingLevel(Level.SEVERE)) {
-					LogEntry entry = ValidationPlugin.getLogEntry();
-					entry.setSourceID("ValidationOperation.run"); //$NON-NLS-1$
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-		} finally {
-			if (logger.isLoggingLevel(Level.FINE)) {
-				long finish = System.currentTimeMillis();
-				TimeEntry entry = ValidationPlugin.getTimeEntry();
-				entry.setSourceID("ValidationOperation.run(WorkbenchMonitor)"); //$NON-NLS-1$
-				entry.setProjectName(getProject().getName());
-				entry.setToolName("ValidationOperation"); //$NON-NLS-1$
-				entry.setElapsedTime(finish - start);
-				logger.write(Level.FINE, entry);
-			}
-		}
-	}
-
-	/**
-	 * @param reporter
-	 */
-	private void validateReferencialFiles(WorkbenchReporter reporter) {
-		ReferencialFileValidatorRegistryReader reader = ReferencialFileValidatorRegistryReader.getInstance();
-		if (reader != null) {
-			reader.readRegistry();
-			ReferencialFileValidator refFileValidator = reader.getReferencialFileValidator();
-			if (refFileValidator != null) {
-				if (_delta != null) {
-					refFileValidateFileDelta(reporter, refFileValidator);
-				} else if (_project != null) {
-					postValidateProject(reporter, refFileValidator);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param reporter
-	 * @param referencialFileValidator
-	 */
-	private void refFileValidateFileDelta(WorkbenchReporter reporter, ReferencialFileValidator refFileValidator) {
-		IResourceDelta[] resourceDelta = _delta.getAffectedChildren(IResourceDelta.ADDED | IResourceDelta.CHANGED | IResourceDelta.REMOVED);
-		List inputFiles = new ArrayList();
-		List referencingFiles = new ArrayList();
-		if (resourceDelta != null && resourceDelta.length > 0) {
-			for (int i = 0; i < resourceDelta.length; i++) {
-				IResource resource = resourceDelta[i].getResource();
-				if (resource instanceof IFolder) {
-					getFileResourceDeltaInFolder(resourceDelta[i], inputFiles);
-				} else if (resource instanceof IFile)
-					inputFiles.add(resource);
-			}
-			List rFilesToValidate = refFileValidator.getReferencedFile(inputFiles);
-			if (rFilesToValidate != null && !rFilesToValidate.isEmpty())
-				referencingFiles.addAll(rFilesToValidate);
-			try {
-				if (!referencingFiles.isEmpty())
-					validateReferencingFiles(reporter, referencingFiles);
-			} catch (Exception e) {
-				Logger.getLogger().log(e);
-			}
-		}
-	}
-
-	/**
-	 * @param delta
-	 * @return
-	 */
-	private void getFileResourceDeltaInFolder(IResourceDelta delta, List inputFiles) {
-		IResourceDelta[] resourceDelta = delta.getAffectedChildren();
-		for (int i = 0; i < resourceDelta.length; i++) {
-			IResource resource = resourceDelta[i].getResource();
-			if (resource instanceof IFile) {
-				inputFiles.add(resource);
-			} else if (resource instanceof IFolder)
-				getFileResourceDeltaInFolder(resourceDelta[i], inputFiles);
-		}
-	}
-
-	/**
-	 * @param reporter
-	 * @param referencialFileValidator
-	 */
-	private void postValidateProject(WorkbenchReporter reporter, ReferencialFileValidator refFileValidator) {
-		Set set = ValidationRegistryReader.getReader().getValidatorMetaData(_project);
-		Iterator it = set.iterator();
-		while (it.hasNext()) {
-			ValidatorMetaData data = (ValidatorMetaData) it.next();
-			List filters = data.getNameFilters();
-			List files = getAllFilesForFilter(filters);
-			if (!files.isEmpty()) {
-				List fileForValidation = refFileValidator.getReferencedFile(files);
-				try {
-					validateReferencingFiles(reporter, fileForValidation);
-				} catch (Exception e) {
-					Logger.getLogger().log(e);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param filters
-	 * @return
-	 */
-	private List getAllFilesForFilter(List filters) {
-		if (!filters.isEmpty()) {
-			List allProjectFiles = ReferencialFileValidatorHelper.getAllProjectFiles(_project);
-			List filterFiles = new ArrayList();
-			for (int i = 0; i < filters.size(); i++) {
-				String fileName = (String) filters.get(i);
-				if (fileName == null)
-					continue;
-				for (int j = 0; j < allProjectFiles.size(); j++) {
-					IFile projectFile = (IFile) allProjectFiles.get(j);
-					if (fileName.charAt(0) == '*') {
-						String extName = fileName.substring(2, fileName.length());
-						String ext = projectFile.getFileExtension();
-						if (ext != null && ext.equals(extName))
-							filterFiles.add(projectFile);
-					} else if (fileName.equals(projectFile.getName()))
-						filterFiles.add(projectFile);
-				}
-
-			}
-			return filterFiles;
-		}
-		return Collections.EMPTY_LIST;
-	}
-
-	private void validateReferencingFiles(IReporter reporter, List referencingFiles) throws Exception {
-		HashSet validatedFiles = new HashSet();
-		for (int i = 0; i < referencingFiles.size(); i++) {
-			IFile refFile = (IFile) referencingFiles.get(i);
-			if (!validatedFiles.contains(refFile)) {
-				IResource resource = refFile.getParent();
-				IProject project = null;
-				if (resource != null && !(resource instanceof IProject))
-					project = getProjectContainer(resource);
-				else
-					project = (IProject) resource;
-				if (project != null) {
-					Set set = ValidationRegistryReader.getReader().getValidatorMetaData(project);
-//					IFileDelta[] changedfiles = new FileDelta[]{new WorkbenchFileDelta(refFile.getProjectRelativePath().toString(), IFileDelta.CHANGED, refFile)};
-					Iterator it = set.iterator();
-					while (it.hasNext()) {
-						ValidatorMetaData data = (ValidatorMetaData) it.next();
-						if (data.isApplicableTo(refFile)) {
-							IValidator validator = data.getValidator();
-							validator.validate(data.getHelper(project),reporter);
-							validatedFiles.add(refFile);
-						}
-					}
-				}
-			}
-		}
-	}
-
-	private IProject getProjectContainer(IResource resource) {
-		IResource pResource = resource.getParent();
-		if (!(pResource instanceof IProject))
-			return getProjectContainer(pResource);
-		return (IProject) pResource;
-	}
-
-	protected void preValidate(WorkbenchReporter reporter) throws CoreException, OperationCanceledException {
-		// Load the input.
-		getFileDeltas(reporter.getProgressMonitor());
-	}
-
-	/**
-	 * Iterate over all of the enabled validators and run the thread-safe validators in a background
-	 * thread, and the not-thread-safe validators in this thread.
-	 */
-	protected void validate(WorkbenchReporter reporter) throws OperationCanceledException {
-		if (reporter == null) {
-			return;
-		}
-		checkCanceled(reporter);
-		reporter.getProgressMonitor().beginTask(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_PROGRESSMONITOR_TITLE), getUnitsOfWork());
-		IValidator validator = null;
-		ValidatorMetaData vmd = null;
-		Iterator iterator = null;
-		WorkbenchReporter nullReporter = new WorkbenchReporter(getProject(), new NullProgressMonitor());
-		final Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-		IFileDelta[] delta = null;
-		try {
-			iterator = getEnabledValidators().iterator();
-			// In order to allow validators to run, must first check if there's
-			// space for new markers.
-			// But we don't want the old markers to prevent validation from
-			// running again, so delete all
-			// of the old markers first, and then run validation.
-			while (iterator.hasNext()) {
-				vmd = (ValidatorMetaData) iterator.next();
-				// Is validation about to be run on this validator?
-				// Validation will run either if this operation forces
-				// regardless
-				// of need, or if the validator was not run automatically.
-				// If validation is not about to be run, then don't activate
-				// the plugin
-				try {
-					delta = getFileDeltas(reporter.getProgressMonitor(), vmd);
-					boolean willRun = (isForce() || isValidationNecessary(vmd, delta));
-					if (logger.isLoggingLevel(Level.FINEST)) {
-						TimeEntry entry = ValidationPlugin.getTimeEntry();
-						entry.setSourceID("ValidationOperation.validate(WorkbenchReporter)"); //$NON-NLS-1$
-						entry.setProjectName(getProject().getName());
-						entry.setToolName(vmd.getValidatorUniqueName());
-						entry.setElapsedTime(0);
-						StringBuffer buffer = new StringBuffer();
-						buffer.append("will run? "); //$NON-NLS-1$
-						buffer.append(willRun);
-						buffer.append("  "); //$NON-NLS-1$
-						buffer.append("is force? "); //$NON-NLS-1$
-						buffer.append(isForce());
-						buffer.append("  "); //$NON-NLS-1$
-						buffer.append("isAutoBuild? "); //$NON-NLS-1$
-						buffer.append(_isAutoBuild);
-						buffer.append("  "); //$NON-NLS-1$
-						buffer.append("isAutoValidate? "); //$NON-NLS-1$
-						boolean autoBuild = (_isAutoBuild == null) ? ValidatorManager.getManager().isGlobalAutoBuildEnabled() : _isAutoBuild.booleanValue();
-						buffer.append(ValidatorManager.getManager().isAutoValidate(getProject(), autoBuild));
-						buffer.append("  "); //$NON-NLS-1$
-						buffer.append("isIncremental? "); //$NON-NLS-1$
-						buffer.append(vmd.isIncremental());
-						buffer.append("  "); //$NON-NLS-1$
-						if (isFullValidate()) {
-							buffer.append("EVERYTHING"); //$NON-NLS-1$
-						} else {
-							if (delta.length == 0) {
-								buffer.append("NOTHING"); //$NON-NLS-1$
-							} else {
-								buffer.append(getDeltaAsString(delta));
-							}
-						}
-						entry.setDetails(buffer.toString());
-						logger.write(Level.FINEST, entry);
-					}
-					if (!willRun) {
-						continue;
-					}
-				} catch (CoreException exc) {
-					if (logger.isLoggingLevel(Level.SEVERE)) {
-						LogEntry entry = ValidationPlugin.getLogEntry();
-						entry.setSourceID("ValidationOperation.validate(WorkbenchReporter)"); //$NON-NLS-1$
-						entry.setTargetException(exc);
-						logger.write(Level.SEVERE, entry);
-					}
-					String mssg = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_ENDING_VALIDATION_ABNORMALLY, new String[]{getProject().getName(), vmd.getValidatorDisplayName()});
-					reporter.displaySubtask(mssg);
-					String[] msgParm = {exc.getClass().getName(), vmd.getValidatorDisplayName(), (exc.getMessage() == null ? "" : exc.getMessage())}; //$NON-NLS-1$
-					Message message = ValidationPlugin.getMessage();
-					message.setSeverity(IMessage.NORMAL_SEVERITY);
-					message.setId(ResourceConstants.VBF_EXC_RUNTIME);
-					message.setParams(msgParm);
-					reporter.addMessage(validator, message);
-					continue;
-				}
-				try {
-					context = vmd.getHelper(getProject());
-					initValidateContext(delta);
-					validator = vmd.getValidator();
-				} catch (InstantiationException exc) {
-					// Remove the vmd from the reader's list
-					ValidationRegistryReader.getReader().disableValidator(vmd);
-					// Log the reason for the disabled validator
-					if (logger.isLoggingLevel(Level.SEVERE)) {
-						LogEntry entry = ValidationPlugin.getLogEntry();
-						entry.setSourceID("ValidationOperation::validate(WorkbenchReporter)"); //$NON-NLS-1$
-						entry.setTargetException(exc);
-						logger.write(Level.SEVERE, entry);
-					}
-					continue;
-				}
-				
-				if (isFork() && vmd.isAsync()) {
-					// Don't appear to run in the foreground by sending
-					// progress to the IProgressMonitor in the
-					// WorkbenchMonitor. Suppress the status messages by
-					// changing the IProgressMonitor to a
-					// NullProgressMonitor.
-					VThreadManager.getManager().queue(wrapInRunnable(nullReporter, validator, vmd,(WorkbenchContext)getContext(),delta, iterator));
-				} else {
-					internalValidate(reporter, validator, vmd,context,delta);
-				}
-			}
-		} catch (OperationCanceledException exc) {
-			handleOperationCancelledValidateException(reporter, validator, vmd, iterator, logger, exc);
-		} finally {
-			releaseCachedMaps();
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void releaseCachedMaps() {
-		if(ValidatorManager.messageLimitProjectMap != null) {
-			ValidatorManager.messageLimitProjectMap.clear();
-			ValidatorManager.messageLimitProjectMap = null;
-		}
-		if(ValidatorManager.messageLimitMessageProjectMap != null) {
-			ValidatorManager.messageLimitMessageProjectMap.clear();
-			ValidatorManager.messageLimitMessageProjectMap = null;
-		}
-		if (ValidationRegistryReader.getReader().projectValidationMetaData != null) {
-			ValidationRegistryReader.getReader().projectValidationMetaData.clear();
-			ValidationRegistryReader.getReader().projectValidationMetaData = null;
-		}
-		IProjectValidationHelper helper = ValidationHelperRegistryReader.getInstance().getValidationHelper();
-		if (helper != null)
-			helper.disposeInstance();
-	}
-
-	private void initValidateContext(IFileDelta[] delta) {
-		 if (context instanceof WorkbenchContext) {
-			 ((WorkbenchContext)context).setValidationFileURIs(new ArrayList());
-			 for(int i = 0; i < delta.length; i++) {
-				 IFileDelta file = delta[i];
-				 if(file.getDeltaType() != IFileDelta.DELETED ) {
-					 ((WorkbenchContext)context).getValidationFileURIs().add(file.getFileName());
-				 }
-			 } 
-		}
-	}
-
-	/**
-	 * @param reporter
-	 * @param validator
-	 * @param vmd
-	 * @param iterator
-	 * @param logger
-	 * @param exc
-	 */
-	private void handleOperationCancelledValidateException(WorkbenchReporter reporter, IValidator validator, ValidatorMetaData vmd, Iterator iterator, final Logger logger, OperationCanceledException exc) {
-		/*
-		 * If the user terminates validation (i.e., presses "cancel" on the progress monitor) before
-		 * the validation completes, perform clean up on each configured enabled validator.
-		 * 
-		 * To clean up, several steps are performed: 1. call <code></code> on each configured
-		 * enabled validator, so that each validator can perform cleanup that it knows is necessary.
-		 * 2. remove all tasks that this validator has added to the task list 3. add another task to
-		 * the task list to say that validation, using this validator on this project, was
-		 * terminated.
-		 * 
-		 * Steps 2 and 3 are done so that it's clear what has, and has not, been validated. If these
-		 * steps weren't performed, validation could be done on some items in the project, but not
-		 * others; and the user could mistakenly believe that those are the only problems with the
-		 * project. Unless the user knows that a full verification needs to be done, he/she could
-		 * continue to rely on automatic verification, and never know that there are problems with a
-		 * resource which hasn't been validated.
-		 */
-		reporter.displaySubtask(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_VALIDATOR_CLEANUP, new String[]{vmd.getValidatorDisplayName()}));
-		reporter.removeAllMessages(validator);
-		addCancelTask(vmd);
-		reporter.displaySubtask(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_VALIDATOR_TERMINATED, new String[]{getProject().getName(), vmd.getValidatorDisplayName()}));
-		while (iterator.hasNext()) {
-			vmd = (ValidatorMetaData) iterator.next();
-			try {
-				validator = vmd.getValidator();
-			} catch (InstantiationException exc2) {
-				// Remove the vmd from the reader's list
-				ValidationRegistryReader.getReader().disableValidator(vmd);
-				// Log the reason for the disabled validator
-				if (logger.isLoggingLevel(Level.SEVERE)) {
-					LogEntry entry = ValidationPlugin.getLogEntry();
-					entry.setSourceID("ValidationOperation::validate(WorkbenchReporter)"); //$NON-NLS-1$
-					entry.setTargetException(exc2);
-					logger.write(Level.SEVERE, entry);
-				}
-				continue;
-			}
-			reporter.displaySubtask(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_VALIDATOR_CLEANUP, new String[]{vmd.getValidatorDisplayName()}));
-			reporter.removeAllMessages(validator);
-			addCancelTask(vmd);
-			reporter.displaySubtask(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_VALIDATOR_TERMINATED, new String[]{getProject().getName(), vmd.getValidatorDisplayName()}));
-		}
-		throw exc; // propagate the exception up to the framework so that
-		// the framework can display the correct "cancelled"
-		// message in the dialog
-
-	}
-
-	/* package */
-	void internalValidate(final WorkbenchReporter reporter, final IValidator validator, final ValidatorMetaData vmd,final IWorkbenchContext aContext, final IFileDelta[] delta) throws OperationCanceledException {
-		final Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-		try {
-			checkCanceled(reporter);
-			removeOldMessages(reporter, validator, vmd, delta);
-			// Do NOT check if the message limit is exceeded before launching
-			// the validator.
-			// Even if the limit is exceeded when the messages are removed from
-			// the delta
-			// files, it could be that the validator itself will remove
-			// messages before
-			// proceeding. Let the validator run so that it can remove messages
-			// if it
-			// needs to, and if it tries to add a message when the limit is
-			// exceeded, let
-			// the WorkbenchReporter take care of it.
-			launchValidator(reporter, validator, vmd,aContext,delta);
-		} catch (OperationCanceledException exc) {
-			// This is handled in the validate(WorkbenchReporter) method.
-			throw exc;
-		} catch (MessageLimitException exc) {
-			// Let the finally block handle this case.
-			// handleMessageLimit();
-		} catch (Throwable exc) {
-			// If there is a problem with this particular validator, log the
-			// error and continue
-			// with the next validator.
-			// If a runtime exception has occured, e.g. NullPointer or
-			// ClassCast, display it with the "A runtime exception has occurred
-			// " messsage.
-			// This will provide more information to the user when he/she calls
-			// IBM Service.
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("ValidationOperation.internalValidate"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-			String mssg = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_ENDING_VALIDATION_ABNORMALLY, new String[]{getProject().getName(), vmd.getValidatorDisplayName()});
-			reporter.displaySubtask(mssg);
-			String[] msgParm = {exc.getClass().getName(), vmd.getValidatorDisplayName(), (exc.getMessage() == null ? "" : exc.getMessage())}; //$NON-NLS-1$
-			Message message = ValidationPlugin.getMessage();
-			message.setSeverity(IMessage.NORMAL_SEVERITY);
-			message.setId(ResourceConstants.VBF_EXC_RUNTIME);
-			message.setParams(msgParm);
-			reporter.addMessage(validator, message);
-		} finally {
-			// If user fixes problem, and limit exceeded, add "exceeded"
-			// message, or
-			// if limit not exceeded any more, remove "exceeded" message.
-			ValidatorManager.getManager().checkMessageLimit(getProject(), true);
-			reporter.getProgressMonitor().done();
-		}
-	}
-
-	/**
-	 * In order to allow validators to run, must first check if there's space for new markers. But
-	 * the old markers must not prevent validation from running again (limit exceeded), so delete
-	 * all of the old markers first, and then run validation.
-	 */
-	private final void removeOldMessages(WorkbenchReporter reporter, IValidator validator, ValidatorMetaData vmd, IFileDelta[] delta) {
-		if (reporter == null) {
-			return;
-		}
-		// If the validator has been enabled, remove the "cancel" task.
-		// If the validator, on the last run, threw a Throwable, remove the
-		// "internal error" task. (For the same reasons we remove the "cancel"
-		// task.
-		InternalValidatorManager.getManager().removeOperationTasks(getProject(), vmd);
-		checkCanceled(reporter);
-		Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-		try {
-			// Check to see if a full build must be performed, or if a delta
-			// build is to be performed, if there are files to verify for that
-			// validator. (If it's delta, but there are no files, calling
-			// validate on that validator starts a full build, instead of just
-			// returning.)
-			if (isFullValidate()) {
-				String message = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_START_REMOVING_OLD_MESSAGES, new String[]{vmd.getValidatorDisplayName(), getProject().getName()});
-				reporter.displaySubtask(message);
-				reporter.removeAllMessages(validator);
-				message = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_FINISH_REMOVING_OLD_MESSAGES, new String[]{getProject().getName(), vmd.getValidatorDisplayName()});
-				reporter.displaySubtask(message);
-			} else {
-				// Don't need to check that there are deltas to validate
-				// because that's already checked in isValidationNecessary
-				String message = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_START_REMOVING_OLD_MESSAGES, new String[]{vmd.getValidatorDisplayName(), getProject().getName()});
-				reporter.displaySubtask(message);
-				for (int i = 0; i < delta.length; i++) {
-					WorkbenchFileDelta fd = (WorkbenchFileDelta) delta[i];
-					if (fd.getDeltaType() != IFileDelta.DELETED) {
-						// If the file has been deleted, eclipse erases all
-						// markers on the file.
-						// Also, when a resource doesn't exist,
-						// WorkbenchReporter's getMessageResource()
-						// returns the IProject, which means that removing the
-						// messages from this
-						// file removes all of this validator's messages on
-						// this IProject (aix defect 206157)
-						IResource resource = reporter.getMessageResource(validator, fd);
-						if (fd.getObject().equals(fd.getResource())) {
-							WorkbenchReporter.removeAllMessages(resource, validator); // remove
-							// all
-							// messages
-							// from
-							// this
-							// resource
-						} else {
-							reporter.removeAllMessages(validator, fd.getObject());
-						}
-					}
-				}
-				message = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_FINISH_REMOVING_OLD_MESSAGES, new String[]{getProject().getName(), vmd.getValidatorDisplayName()});
-				reporter.displaySubtask(message);
-			}
-		} catch (OperationCanceledException exc) {
-			throw exc;
-		} catch (Throwable exc) {
-			// If there is a problem with this particular validator, log the
-			// error and continue
-			// with the next validator.
-			// If a runtime exception has occured, e.g. NullPointer or
-			// ClassCast, display it with the "A runtime exception has occurred
-			// " messsage.
-			// This will provide more information to the user when he/she calls
-			// IBM Service.
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("ValidationOperation.validate(WorkbenchMonitor)"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-			String mssg = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_ENDING_VALIDATION_ABNORMALLY, new String[]{getProject().getName(), vmd.getValidatorDisplayName()});
-			reporter.displaySubtask(mssg);
-			String[] msgParm = {exc.getClass().getName(), vmd.getValidatorDisplayName(), (exc.getMessage() == null ? "" : exc.getMessage())}; //$NON-NLS-1$
-			Message message = ValidationPlugin.getMessage();
-			message.setSeverity(IMessage.NORMAL_SEVERITY);
-			message.setId(ResourceConstants.VBF_EXC_RUNTIME);
-			message.setParams(msgParm);
-			reporter.addMessage(validator, message);
-			return;
-		}
-	}
-
-	/**
-	 * Whether a full verification or a delta verification is in progress, both will call this
-	 * method to process the resource. This method calls the current Validator to filter the
-	 * resource (i.e., this method returns if the resource fails the filter test).
-	 * <code>process</code> also sends output to the <code>IProgressMonitor</code>, and calls
-	 * the current Validator to validate the resource.
-	 * 
-	 * To process a resource, there are several steps: 1. check if the resource is registered for
-	 * this validator (i.e., the validator has either specified it in a filter, or has not filtered
-	 * it out explicitly) 2. call <code>isValidationSource</code> on the current validator with
-	 * the current resource. This method performs further filtering by the Validator itself, in
-	 * addition to the static filtering done by the framework, based on the information in
-	 * plugin.xml. 3. If the resource passes both filters, call <code>validate</code> on the
-	 * validator, with the resource. 4. When complete (either by failing to pass a filter, or by the
-	 * completion of the <code>validate</code>), increment the IProgressMonitor's status by one
-	 * (i.e., one resource has been processed.)
-	 */
-	private final void launchValidator(WorkbenchReporter reporter, IValidator validator, ValidatorMetaData vmd, IWorkbenchContext helper, IFileDelta[] delta) {
-		if (reporter == null) {
-			return;
-		}
-		checkCanceled(reporter);
-		Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-		// Check to see if a full build must be performed, or if a delta
-		// build is to be performed, if there are files to verify for that
-		// validator. (If it's delta, but there are no files, calling
-		// validate on that validator starts a full build, instead of just
-		// returning.)
-		try {
-			// Validate the resource; this step will add errors/warnings to the
-			// task list, and remove errors/warnings from the task list.
-			if (helper instanceof WorkbenchContext) {
-				// Initialize the "loadRuleGroup" method with the group of
-				// rules
-				// which the validator should validate.
-				((WorkbenchContext) helper).setRuleGroup(getRuleGroup());
-			}
-			long start = System.currentTimeMillis();
-			String message = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_STARTING_VALIDATION, new String[]{getProject().getName(), vmd.getValidatorDisplayName()});
-			reporter.displaySubtask(message);
-			if (logger.isLoggingLevel(Level.FINEST)) {
-				// This internal "launched validators" value is used only in
-				// tests.
-				getLaunchedValidators().add(vmd);
-			}
-			//initValidateContext(delta);
-			ValidatorLauncher.getLauncher().start(helper, validator, reporter);
-			long finish = System.currentTimeMillis();
-			if (logger.isLoggingLevel(Level.INFO)) {
-				TimeEntry entry = ValidationPlugin.getTimeEntry();
-				entry.setSourceID("ValidationOperation.launchValidator"); //$NON-NLS-1$
-				entry.setProjectName(getProject().getName());
-				entry.setToolName(vmd.getValidatorUniqueName());
-				entry.setElapsedTime(finish - start);
-				if (logger.isLoggingLevel(Level.FINE)) {
-					StringBuffer buffer = new StringBuffer();
-					if (isFullValidate()) {
-						buffer.append("EVERYTHING"); //$NON-NLS-1$
-					} else {
-						if (delta.length == 0) {
-							buffer.append("NOTHING"); //$NON-NLS-1$
-						} else {
-							buffer.append(getDeltaAsString(delta));
-						}
-					}
-					entry.setDetails(buffer.toString());
-				}
-				logger.write(Level.INFO, entry);
-			}
-			message = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_ENDING_VALIDATION, new String[]{getProject().getName(), vmd.getValidatorDisplayName()});
-			reporter.displaySubtask(message);
-		} catch (MessageLimitException exc) {
-			throw exc;
-		} catch (OperationCanceledException exc) {
-			throw exc;
-		} catch (ValidationException exc) {
-			// First, see if a validator just caught all Throwables and
-			// accidentally wrapped a MessageLimitException instead of
-			// propagating it.
-			if (exc.getAssociatedException() != null) {
-				if (exc.getAssociatedException() instanceof MessageLimitException) {
-					MessageLimitException mssgExc = (MessageLimitException) exc.getAssociatedException();
-					throw mssgExc;
-				} else if (exc.getAssociatedException() instanceof ValidationException) {
-					ValidationException vexc = (ValidationException) exc.getAssociatedException();
-					vexc.setClassLoader(validator.getClass().getClassLoader()); // first,
-					// set
-					// the
-					// class
-					// loader,
-					// so
-					// that
-					// the
-					// exception's
-					// getMessage()
-					// method
-					// can
-					// retrieve
-					// the
-					// resource
-					// bundle
-				}
-			}
-			// If there is a problem with this particular validator, log the
-			// error and continue
-			// with the next validator.
-			exc.setClassLoader(validator.getClass().getClassLoader()); // first,
-			// set
-			// the
-			// class
-			// loader,
-			// so
-			// that
-			// the
-			// exception's
-			// getMessage()
-			// method
-			// can
-			// retrieve
-			// the
-			// resource
-			// bundle
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("ValidationOperation.validate(WorkbenchMonitor)"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-				if (exc.getAssociatedException() != null) {
-					entry.setTargetException(exc.getAssociatedException());
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-			String message = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_ENDING_VALIDATION_ABNORMALLY, new String[]{getProject().getName(), vmd.getValidatorDisplayName()});
-			reporter.displaySubtask(message);
-			if (exc.getAssociatedMessage() != null) {
-				reporter.addMessage(validator, exc.getAssociatedMessage());
-			}
-		} catch (Throwable exc) {
-			// If there is a problem with this particular validator, log the
-			// error and continue
-			// with the next validator.
-			// If a runtime exception has occured, e.g. NullPointer or
-			// ClassCast, display it with the "A runtime exception has occurred
-			// " messsage.
-			// This will provide more information to the user when he/she calls
-			// IBM Service.
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("ValidationOperation.validate(WorkbenchMonitor)"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-			String mssg = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_ENDING_VALIDATION_ABNORMALLY, new String[]{getProject().getName(), vmd.getValidatorDisplayName()});
-			reporter.displaySubtask(mssg);
-			String[] msgParm = {exc.getClass().getName(), vmd.getValidatorDisplayName(), (exc.getMessage() == null ? "" : exc.getMessage())}; //$NON-NLS-1$
-			Message message = ValidationPlugin.getMessage();
-			message.setSeverity(IMessage.NORMAL_SEVERITY);
-			message.setId(ResourceConstants.VBF_EXC_RUNTIME);
-			message.setParams(msgParm);
-			reporter.addMessage(validator, message);
-		} finally {
-			try {
-				validator.cleanup(reporter);
-			} catch (MessageLimitException e) {
-				throw e;
-			} catch (OperationCanceledException e) {
-				throw e;
-			} catch (Throwable exc) {
-				// If a runtime exception has occured, e.g. NullPointer or
-				// ClassCast, display it with the "A runtime exception has
-				// occurred " messsage.
-				// This will provide more information to the user when he/she
-				// calls IBM Service.
-				if (logger.isLoggingLevel(Level.SEVERE)) {
-					LogEntry entry = ValidationPlugin.getLogEntry();
-					entry.setSourceID("ValidationOperation::launchValidator"); //$NON-NLS-1$
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-				String[] msgParm = {exc.getClass().getName(), vmd.getValidatorDisplayName(), (exc.getMessage() == null ? "" : exc.getMessage())}; //$NON-NLS-1$
-				Message message = ValidationPlugin.getMessage();
-				message.setSeverity(IMessage.NORMAL_SEVERITY);
-				message.setId(ResourceConstants.VBF_EXC_RUNTIME);
-				message.setParams(msgParm);
-				try {
-					reporter.addMessage(validator, message);
-				} catch (MessageLimitException e) {
-					throw e;
-				}
-				return;
-			}
-			try {
-				helper.cleanup(reporter);
-			} catch (MessageLimitException e) {
-				throw e;
-			} catch (OperationCanceledException e) {
-				throw e;
-			} catch (Throwable exc) {
-				// If a runtime exception has occured, e.g. NullPointer or
-				// ClassCast, display it with the "A runtime exception has
-				// occurred " messsage.
-				// This will provide more information to the user when he/she
-				// calls IBM Service.
-				if (logger.isLoggingLevel(Level.SEVERE)) {
-					LogEntry entry = ValidationPlugin.getLogEntry();
-					entry.setSourceID("ValidationOperation::launchValidator"); //$NON-NLS-1$
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-				String[] msgParm = {exc.getClass().getName(), vmd.getValidatorDisplayName(), (exc.getMessage() == null ? "" : exc.getMessage())}; //$NON-NLS-1$
-				Message message = ValidationPlugin.getMessage();
-				message.setSeverity(IMessage.NORMAL_SEVERITY);
-				message.setId(ResourceConstants.VBF_EXC_RUNTIME);
-				message.setParams(msgParm);
-				try {
-					reporter.addMessage(validator, message);
-				} catch (MessageLimitException e) {
-					throw e;
-				}
-				return;
-			} finally {
-				// Now that cleanup has been called, set the project to null.
-				// This project's
-				// resources have been freed so this project should also be
-				// cleared on the helper.
-				// If it isn't set to null, then the next time that the helper
-				// is retrieved from
-				// the ValidatorMetaData, the resources allocated for this
-				// project, in the
-				// helper's initialize method, will not be reallocated if the
-				// project is the same.
-				helper.setProject(null);
-			}
-			// Tell the progress monitor that we've completed n units of work
-			// (i.e., n resources validated by one validator).
-			reporter.getProgressMonitor().worked(((delta == null) ? 1 : delta.length)); // One
-			// unit
-			// of
-			// work
-			// = 1
-			// (i.e.,
-			// 1
-			// resource)
-		}
-	}
-
-	private Runnable wrapInRunnable(final WorkbenchReporter reporter, final IValidator validator, final ValidatorMetaData vmd, final IWorkbenchContext helper, final IFileDelta[] delta, final Iterator iterator) {
-		// Need to create a new Runnable each time because several Runnable
-		// instances may exist at the same time.
-		Runnable runnable = new ProjectRunnable(reporter, validator, vmd, helper, delta, iterator);
-		return runnable;
-	}
-
-	/*
-	 * // For convenience, keep this method in the class but commented out. // When async needs to
-	 * be tested, this method may be needed again. private static void debug(String prefix,
-	 * IWorkbenchContext helper) { IProject hProject = helper.getProject(); System.err.println(prefix +
-	 * "Start ValidationOperation "+Thread.currentThread().getName() + "::" + hProject.getName());
-	 * if( Thread.currentThread().getName().equals("ValidationThread") &&
-	 * (hProject.getName().indexOf("noFork") > -1)) { Thread.dumpStack(); } else
-	 * if((!Thread.currentThread().getName().equals("ValidationThread")) &&
-	 * (hProject.getName().indexOf("fork") > -1)) { Thread.dumpStack(); } System.err.println(prefix +
-	 * "End ValidationOperation"); }
-	 */
-	public class ProjectRunnable implements Runnable {
-		private WorkbenchReporter _reporter = null;
-		private IValidator _validator = null;
-		private ValidatorMetaData _vmd = null;
-//		private IValidationContext _helper = null;
-		private IFileDelta[] __delta = null;
-
-		public ProjectRunnable(WorkbenchReporter reporter, IValidator validator, ValidatorMetaData vmd, IWorkbenchContext helper, IFileDelta[] delta, Iterator iterator) {
-			_reporter = reporter;
-			_validator = validator;
-			_vmd = vmd;
-//			_helper = helper;
-			__delta = delta;
-		}
-
-		public void run() {
-			try {
-				internalValidate(_reporter, _validator, _vmd, context,__delta);
-			} catch (OperationCanceledException exc) {
-				// User can't cancel a job in a background thread, so ignore
-				// this exception.
-			}
-		}
-
-		public IProject getProject() {
-			return _reporter.getProject();
-		}
-	}
-
-	/**
-	 * @return Returns the context.
-	 */
-	public IValidationContext getContext() {
-		return context;
-	}
-
-	/**
-	 * @param context The context to set.
-	 */
-	public void setContext(IWorkbenchContext context) {
-		this.context = context;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidationUtility.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidationUtility.java
deleted file mode 100644
index 0a29729..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidationUtility.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.operations;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.logging.Level;
-
-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.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.validation.internal.ConfigurationConstants;
-import org.eclipse.wst.validation.internal.ConfigurationManager;
-import org.eclipse.wst.validation.internal.ProjectConfiguration;
-import org.eclipse.wst.validation.internal.TaskListUtility;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-
-/**
- * This class contains utility methods that are intended to be used by validators and code outside
- * of the validation framework.
- */
-public final class ValidationUtility {
-	//TODO Make the ValidationUtility constructor private in Milestone 4.
-
-	/**
-	 * Given an IResource and one of the org.eclipse.wst.validation.internal.core.core.SevertyEnum constants,
-	 * return an array containing the fully-qualified class names of the validators which have
-	 * reported messages, of the given severity, against the resource and the resource's children.
-	 */
-	public static String[] listValidatorClasses(IResource resource, int severity) {
-		IMarker[] markers = TaskListUtility.getValidationTasks(resource, severity);
-		if ((markers == null) || (markers.length == 0)) {
-			return new String[0];
-		}
-
-		Set tempSet = new HashSet();
-		for (int i = 0; i < markers.length; i++) {
-			IMarker marker = markers[i];
-			try {
-				Object owner = marker.getAttribute(ConfigurationConstants.VALIDATION_MARKER_OWNER);
-				if ((owner == null) || !(owner instanceof String)) {
-					// The ValidationMigrator will remove any "unowned" validation markers.
-					continue;
-				}
-				tempSet.add(owner);
-			} catch (CoreException exc) {
-				Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-				if (logger.isLoggingLevel(Level.SEVERE)) {
-					LogEntry entry = ValidationPlugin.getLogEntry();
-					entry.setSourceID("ValidationUtility.listValidatorClasses(" + resource.getName() + ", " + severity); //$NON-NLS-1$  //$NON-NLS-2$
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-		}
-
-
-		if (tempSet.size() > 0) {
-			String[] result = new String[tempSet.size()];
-			tempSet.toArray(result);
-			tempSet.clear();
-			return result;
-		}
-		return new String[0];
-	}
-
-	/**
-	 * @deprecated This instance method will be made static in Milestone 4.
-	 */
-	public boolean isEnabled(IProject project, String validatorClassName) {
-		return isEnabled(project, new String[]{validatorClassName});
-	}
-
-	/**
-	 * Return true if all of the validators, identified by their fully-qualified class names, are
-	 * enabled on the project. If a validator isn't enabled, or if there's an internal error while
-	 * retrieving the user's configuration, return false.
-	 */
-	public static boolean isEnabled(IProject project, String[] validatorClassNames) {
-		if ((validatorClassNames == null) || (validatorClassNames.length == 0)) {
-			return false;
-		}
-
-		try {
-			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-			for (int i = 0; i < validatorClassNames.length; i++) {
-				if (!prjp.isEnabled(validatorClassNames[i])) {
-					return false;
-				}
-			}
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("ValidationUtility::isEnabled(" + project.getName() + ", String[])"); //$NON-NLS-1$  //$NON-NLS-2$  //$NON-NLS-3$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-			return false;
-		}
-
-		return true;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidatorManager.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidatorManager.java
deleted file mode 100644
index 2b6ca75..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidatorManager.java
+++ /dev/null
@@ -1,1363 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.operations;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.logging.Level;
-
-import org.eclipse.core.resources.ICommand;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.validation.internal.ConfigurationManager;
-import org.eclipse.wst.validation.internal.InternalValidatorManager;
-import org.eclipse.wst.validation.internal.ProjectConfiguration;
-import org.eclipse.wst.validation.internal.ResourceConstants;
-import org.eclipse.wst.validation.internal.TaskListUtility;
-import org.eclipse.wst.validation.internal.ValidationConfiguration;
-import org.eclipse.wst.validation.internal.ValidationRegistryReader;
-import org.eclipse.wst.validation.internal.ValidatorMetaData;
-import org.eclipse.wst.validation.internal.core.Message;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-import org.eclipse.wst.validation.internal.provisional.core.IValidator;
-
-/**
- * A centralised class for accessing validation metadata.
- * 
- * This class is not intended to be subclassed outside of the validation framework.
- */
-public final class ValidatorManager {
-	private static ValidatorManager inst = null;
-	private static IResourceUtil _resourceUtil = null; // a common utility, different whether or not
-	// WSAD is running in headless or UI mode,
-	// which can retrieve the line number of some
-	// MOF objects.
-	private static final Class RESOURCEUTIL_DEFAULTCLASS = org.eclipse.wst.validation.internal.operations.DefaultResourceUtil.class;
-	private static Class _resourceUtilClass = RESOURCEUTIL_DEFAULTCLASS;
-	private static final Set EMPTY_SET = Collections.EMPTY_SET; // an empty set, provided for
-	// convenience, so that we only
-	// construct one empty set once.
-	private Set _suspendedProjects = null;
-	private boolean _suspendAllValidation = false;
-	private static Class _messageLimitOwner = null;
-	private String[] _internalOwners = null;
-
-	public static HashMap messageLimitProjectMap = null;
-	public static HashMap messageLimitMessageProjectMap = null;
-	
-	/**
-	 * ValidatorManager constructor comment.
-	 */
-	private ValidatorManager() {
-		super();
-		_suspendedProjects = new HashSet();
-		_internalOwners = new String[0];
-
-		addInternalOwner(getMessageLimitOwner());
-	}
-
-	/**
-	 * Disable all validators for the current project, and does not touch the auto-validate setting.
-	 */
-	public void disableAllValidators(IProject currentProject, IProgressMonitor monitor) {
-		// Disable the individual validators
-		setEnabledValidators(currentProject, EMPTY_SET, monitor);
-	}
-
-	/**
-	 * Given an IProject, if the IProject does not support build validation, add the validation
-	 * builder to the project description so that the project can support bulid validation.
-	 */
-	public static void addProjectBuildValidationSupport(IProject project) {
-		if (project == null) {
-			return;
-		}
-
-		boolean isBuilderAdded = false;
-		try {
-			IProjectDescription description = project.getDescription();
-			ICommand[] commands = description.getBuildSpec(); // don't need to check if description
-			// is null, because it's never null
-			if (commands != null) {
-				for (int i = 0; i < commands.length; i++) {
-					String builderName = commands[i].getBuilderName();
-					if (builderName == null) {
-						// builder name will be null if it has not been set
-						continue;
-					}
-
-					if (builderName.equals(ValidationPlugin.VALIDATION_BUILDER_ID)) {
-						isBuilderAdded = true;
-						break;
-					}
-				}
-			}
-
-			if (!isBuilderAdded) {
-				ICommand newCommand = description.newCommand();
-				newCommand.setBuilderName(ValidationPlugin.VALIDATION_BUILDER_ID);
-
-				ICommand[] newCommands = null;
-				if (commands != null) {
-					newCommands = new ICommand[commands.length + 1];
-					System.arraycopy(commands, 0, newCommands, 0, commands.length);
-					newCommands[commands.length] = newCommand;
-				} else {
-					newCommands = new ICommand[1];
-					newCommands[0] = newCommand;
-				}
-				description.setBuildSpec(newCommands);
-
-				project.setDescription(description, null);
-			}
-		} catch (CoreException exc) {
-			// if we can't read the information, the project isn't open, so it can't run
-			// auto-validate
-			return;
-		}
-	}
-
-
-	/**
-	 * Given an IProject, this method returns true if the project can run build validation (i.e.,
-	 * incremental validation), and false otherwise. The test, to find out if the project supports
-	 * build validation or not, is to see if the ValidationBuilder is configured on that type of
-	 * project.
-	 * 
-	 * This is a long-running process - is there any way that I can shorten the amount of time this
-	 * takes?
-	 */
-	public static boolean doesProjectSupportBuildValidation(IProject project) {
-		boolean canRunAV = false;
-		if (project == null) {
-			return canRunAV;
-		}
-
-		try {
-			IProjectDescription description = project.getDescription();
-			ICommand[] commands = description.getBuildSpec(); // don't need to check if description
-			// is null, because it's never null
-			if (commands == null) {
-				return canRunAV;
-			}
-
-			for (int i = 0; i < commands.length; i++) {
-				String builderName = commands[i].getBuilderName();
-				if (builderName == null) {
-					// builder name will be null if it has not been set
-					continue;
-				}
-
-				if (builderName.equals(ValidationPlugin.VALIDATION_BUILDER_ID)) {
-					canRunAV = true;
-					break;
-				}
-			}
-		} catch (CoreException exc) {
-			// if we can't read the information, the project isn't open, so it can't run
-			// auto-validate
-			return false;
-		}
-
-		return canRunAV;
-	}
-
-	/**
-	 * Enable all validators for the current project, and does not touch the auto-validate setting.
-	 */
-	public void enableAllValidators(IProject project, IProgressMonitor monitor) {
-		// Turn auto-validate off
-		//	setAutoValidate(currentProject, false);
-
-		// Enable the individual validators
-		try {
-			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-			prjp.setEnabledValidators(prjp.getValidators());
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("ValidatorManager::enableAllValidators(" + project.getName() + ")"); //$NON-NLS-1$  //$NON-NLS-2$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @deprecated For use by the validation framework only.
-	 * 
-	 * Return a collection of incremental ValidatorMetaData configured on a certain type of IProject
-	 * (e.g. EJB Project vs. Web Project).
-	 */
-	public Set getProjectConfiguredIncrementalValidators(IProject project) {
-		try {
-			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-			return InternalValidatorManager.wrapInSet(prjp.getIncrementalValidators());
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("ValidatorManager::getProjectConfiguredIncrementalValidators(" + project.getName() + ")"); //$NON-NLS-1$  //$NON-NLS-2$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-			return Collections.EMPTY_SET;
-		}
-	}
-
-	/**
-	 * @deprecated For use by the validation framework only.
-	 * 
-	 * Return a collection of ValidatorMetaData configured on a certain type of IProject (e.g. EJB
-	 * Project vs. Web Project).
-	 * 
-	 * If the collection has not been calculated before, calculate it now, and cache the result.
-	 */
-	public Set getProjectConfiguredValidatorMetaData(IProject project) {
-		try {
-			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-			return InternalValidatorManager.wrapInSet(prjp.getValidators());
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("ValidatorManager::getProjectConfiguredValidatorMetaData(" + project.getName() + ")"); //$NON-NLS-1$  //$NON-NLS-2$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-			return Collections.EMPTY_SET;
-		}
-	}
-
-	/**
-	 * @deprecated For use by the validation framework only.
-	 * 
-	 * Return a collection of ValidatorMetaData enabled on a certain type of IProject (e.g. EJB
-	 * Project vs. Web Project). The second parameter, isIncremental, identifies whether it's the
-	 * incremental, or non-incremental, validators which should be returned. If the parameter is
-	 * true, return incremental validators. If the parameter is false, return nonincremental
-	 * validators.
-	 */
-	public Set getProjectEnabledIncrementalValidators(IProject project) {
-		try {
-			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-			return InternalValidatorManager.wrapInSet(prjp.getEnabledIncrementalValidators(true));
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("ValidatorManager::getProjectEnabledIncrementalValidators" + project.getName() + ")"); //$NON-NLS-1$  //$NON-NLS-2$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-			return Collections.EMPTY_SET;
-		}
-	}
-
-	/**
-	 * @deprecated For use by the validation framework only.
-	 * 
-	 * Return a collection of ValidatorMetaData enabled on a certain type of IProject (e.g. EJB
-	 * Project vs. Web Project). The second parameter, isIncremental, identifies whether it's the
-	 * incremental, or non-incremental, validators which should be returned. If the parameter is
-	 * true, return incremental validators. If the parameter is false, return nonincremental
-	 * validators.
-	 */
-	public Collection getProjectEnabledNonIncrementalValidators(IProject project) {
-		try {
-			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-			return InternalValidatorManager.wrapInSet(prjp.getEnabledIncrementalValidators(false));
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("ValidatorManager::getProjectEnabledNonIncrementalValidators" + project.getName() + ")"); //$NON-NLS-1$  //$NON-NLS-2$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-			return Collections.EMPTY_SET;
-		}
-	}
-
-	/**
-	 * @deprecated For use by the validation framework only.
-	 * 
-	 * Returns a Vector of all ValidatorMetaData who are both configured on this type of project,
-	 * and who are also enabled by this project. If the list of enabled validators hasn't been
-	 * loaded into the cache, load it now. Otherwise, just return it.
-	 */
-	public Set getProjectEnabledValidators(IProject project) {
-		return getEnabledValidators(project);
-	}
-
-	public static ValidatorManager getManager() {
-		if (inst == null) {
-			inst = new ValidatorManager();
-		}
-		return inst;
-	}
-
-	public static IResourceUtil getResourceUtil() {
-		if (_resourceUtil == null) {
-			if (_resourceUtilClass == null) {
-				// Since the value returned from this method must never be null,
-				// default the resource util to the headless resource util.
-				_resourceUtilClass = RESOURCEUTIL_DEFAULTCLASS;
-			}
-
-			try {
-				_resourceUtil = (IResourceUtil) _resourceUtilClass.newInstance();
-			} catch (ClassCastException e) {
-				_resourceUtil = null;
-			} catch (InstantiationException e) {
-				_resourceUtil = null;
-			} catch (IllegalAccessException e) {
-				_resourceUtil = null;
-			}
-		}
-		return _resourceUtil;
-	}
-
-	/**
-	 * @deprecated This method is intended for use only by the validation framework. It will be
-	 *             moved to a class in the "internal" package at some time.
-	 */
-	public IMarker[] getValidationTasks(int severity, IProject project) {
-		return getValidationTasks(project, severity);
-	}
-
-	/**
-	 * @deprecated This method is intended for use only by the validation framework. It will be
-	 *             moved to a class in the "internal" package at some time.
-	 */
-	public IMarker[] getValidationTasks(IResource resource, int severity) {
-		return TaskListUtility.getValidationTasks(resource, severity);
-	}
-
-	/**
-	 * @deprecated This method is intended for use only by the validation framework. It will be
-	 *             moved to a class in the "internal" package at some time.
-	 */
-	public IMarker[] getValidationTasks(IResource resource, String[] validatorNames) {
-		return TaskListUtility.getValidationTasks(resource, validatorNames);
-	}
-
-	public int getMaximumMessagesAllowed(IProject project) {
-		try {
-			return ConfigurationManager.getManager().getProjectConfiguration(project).getMaximumNumberOfMessages();
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("ValidatorManager.getMaximumMessagesAllowed(" + project.getName() + ")"); //$NON-NLS-1$  //$NON-NLS-2$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-
-			return ValidationConfiguration.getMaximumNumberOfMessagesDefault();
-		}
-	}
-
-	/**
-	 * @deprecated For use by the validation framework only.
-	 */
-	public ValidatorMetaData getValidatorMetaData(IValidator validator) {
-		return ValidationRegistryReader.getReader().getValidatorMetaData(validator);
-	}
-
-	/**
-	 * @deprecated For use by the validation framework only.
-	 */
-	public Set getIncrementalValidators(Collection vmds) {
-		if (vmds == null) {
-			return Collections.EMPTY_SET;
-		}
-
-		Set result = new HashSet();
-		Iterator iterator = vmds.iterator();
-		while (iterator.hasNext()) {
-			ValidatorMetaData vmd = (ValidatorMetaData) iterator.next();
-			if (vmd.isIncremental()) {
-				result.add(vmd);
-			}
-		}
-		return result;
-	}
-
-
-	/**
-	 * Return true if the validator identified by validatorId will validate the given resource. If
-	 * either parameter is null, false is returned. If the validator is not registered with the
-	 * validation framework (i.e., either no validator in the activated plugins is identified by
-	 * that plugin id, or the given IResource's project does not run that particular validator),
-	 * then this method will return false.
-	 */
-	public boolean isApplicableTo(String validatorId, IResource res) {
-		if ((validatorId == null) || (res == null)) {
-			return false;
-		}
-
-		ValidatorMetaData vmd = ValidationRegistryReader.getReader().getValidatorMetaData(validatorId);
-		if (vmd == null) {
-			// validator not registered with the framework
-			return false;
-		}
-
-		if (!ValidationRegistryReader.getReader().isConfiguredOnProject(vmd, res.getProject())) {
-			return false;
-		}
-
-		return vmd.isApplicableTo(res);
-	}
-
-
-	public boolean isAutoValidate(IProject project) {
-		return isAutoValidate(project, isGlobalAutoBuildEnabled());
-	}
-
-	/**
-	 * Keeping this API around so as not to break existing code.
-	 * 
-	 * @deprecated use isAutoValidate
-	 */
-	public boolean isAutoValidateChecked(IProject project) {
-		return isAutoValidate(project);
-	}
-
-	/**
-	 * Keeping this API around so as not to break existing code.
-	 * 
-	 * @deprecated use isAutoValidate
-	 */
-	public boolean isAutoValidateChecked(IProject project, boolean isGlobalAutoBuildOn) {
-		return isAutoValidate(project, isGlobalAutoBuildOn);
-	}
-
-	/**
-	 * This method returns true if validate will run when there is a resource change. The following
-	 * attributes are checked: 1. does this project have auto-validate on or off? 2. if this project
-	 * does not have an auto-validate value set, is the global auto-validate preference on? 3. if 1
-	 * or 2 is true, does the project support auto-validate? 4. if 1/2, & 3, is auto-build on? 5. if
-	 * 1/2, 3, and 4, is there at least one incremental validator enabled on the project?
-	 */
-	public boolean isAutoValidate(IProject project, boolean isGlobalAutoBuildOn) {
-		try {
-			// 1. does the project have auto-validate on or off?
-			boolean isAutoValidate = ConfigurationManager.getManager().getProjectConfiguration(project).isAutoValidate();
-			if (!isAutoValidate) {
-				return false;
-			}
-
-			// 3. does the project support auto-validate?
-			// 4. is auto-build on?
-			// 5. is there at least one incremental validator enabled on the project?
-			/*
-			 * Auto-validation, on the properties page, can be enabled under these conditions: 1.
-			 * the project supports auto-validation, AND 2. fhe platform's global "automatically
-			 * build" is selected, AND 3. at least one of the project's validators supports
-			 * incremental validation. Without #1, the ValidationBuilder is never called because
-			 * it's not configured on the project. Without #2, the ValidationBuilder will not be
-			 * called because auto-building is turned off. Without #3, the ValidationBuilder will be
-			 * called, but there's no point because no validators can run.
-			 */
-			return canAutoValidateButtonBeEnabled(project, isGlobalAutoBuildOn);
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("ValidatorManager.canAutoValidateButtonBeEnabled(" + project.getName() + ")"); //$NON-NLS-1$  //$NON-NLS-2$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-
-			// If the user's setting can't be retrieved, return the default
-			return ValidationConfiguration.getAutoValidateDefault();
-		}
-	}
-
-	public boolean canAutoValidateButtonBeEnabled(IProject project) {
-		return canAutoValidateButtonBeEnabled(project, isGlobalAutoBuildEnabled());
-	}
-
-	/**
-	 * @deprecated For use by the validation framework only.
-	 */
-	public Set getEnabledIncrementalValidators(IProject project) {
-		try {
-			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-			ValidatorMetaData[] vmds = prjp.getEnabledIncrementalValidators(true);
-			return InternalValidatorManager.wrapInSet(vmds);
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("ValidatorManager::getEnabledIncrementalValidators" + project.getName() + ")"); //$NON-NLS-1$  //$NON-NLS-2$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-			return Collections.EMPTY_SET;
-		}
-	}
-
-	/**
-	 * @deprecated For use by the validation framework only.
-	 * 
-	 * Given a checked list of enabled validators, return a set of the ones which are configured on
-	 * the project and, if getIncremental is true, which also run incrementally.
-	 */
-	public Set getProjectConfiguredValidators(IProject project, Object[] enabledVal, boolean getIncremental) {
-		if ((project == null) || (enabledVal == null) || (enabledVal.length == 0)) {
-			return Collections.EMPTY_SET;
-		}
-
-		Set val = new HashSet();
-		for (int i = 0; i < enabledVal.length; i++) {
-			ValidatorMetaData vmd = (ValidatorMetaData) enabledVal[i];
-			if (!vmd.isConfiguredOnProject(project)) {
-				continue;
-			}
-
-			if (!getIncremental || vmd.isIncremental()) {
-				val.add(vmd);
-			}
-		}
-		return val;
-	}
-
-	public boolean containsIncrementalValidators(Object[] enabledVal) {
-		if ((enabledVal == null) || (enabledVal.length == 0)) {
-			return false;
-		}
-
-		for (int i = 0; i < enabledVal.length; i++) {
-			ValidatorMetaData vmd = (ValidatorMetaData) enabledVal[i];
-
-			if (vmd.isIncremental()) {
-				return true;
-			}
-		}
-
-		return false;
-	}
-
-	/**
-	 * For use by the validation framework only.
-	 */
-	protected Set getEnabledValidators(IProject project) {
-		try {
-			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-			ValidatorMetaData[] vmds = prjp.getEnabledValidators();
-			return InternalValidatorManager.wrapInSet(vmds);
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("ValidatorManager::getEnabledValidators" + project.getName() + ")"); //$NON-NLS-1$  //$NON-NLS-2$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-			return Collections.EMPTY_SET;
-		}
-	}
-
-	/**
-	 * This method is for use only by the validation framework. Update the task list based on which
-	 * validators are enabled or disabled. This method should be called only by the validation
-	 * framework UI classes. Remove the messages belonging to disabled validators.
-	 */
-	public void updateTaskList(IProject project) {
-		try {
-			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-			ValidatorMetaData[] vmds = prjp.getDisabledValidators();
-			for (int i = 0; i < vmds.length; i++) {
-				ValidatorMetaData vmd = vmds[i];
-				// For validators who aren't going to run, clear their messages from the task list.
-				// Don't need to check for duplicate entries because each Validator must be unique.
-				// The uniqueness of each Validator is checked by the plugin registry.
-				WorkbenchReporter.removeAllMessages(project, vmd.getValidatorNames(), null);
-			}
-
-			if (prjp.numberOfEnabledValidators() > 0) {
-				ValidatorManager.getManager().checkMessageLimit(project, false); // Do not remove
-				// the exceeded
-				// message; only
-				// ValidationOperation
-				// should do that
-				// because it's
-				// about to run
-				// validation. If
-				// the limit is
-				// increased,
-				// messages may
-				// still be
-				// missing, so
-				// don't remove the
-				// "messages may be
-				// missing"
-				// message.
-			} else {
-				// Can't run validation, so remove the "exceeded" message
-				ValidatorManager.getManager().removeMessageLimitExceeded(project);
-			}
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("ValidatorManager.updateTaskList(" + project.getName() + ")"); //$NON-NLS-1$  //$NON-NLS-2$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-		}
-	}
-
-
-	public boolean canAutoValidateButtonBeEnabled(IProject project, boolean isGlobalAutoBuildOn) {
-		try {
-			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-			boolean incrementalValEnabled = (prjp.numberOfEnabledIncrementalValidators() > 0);
-			return canAutoValidateButtonBeEnabled(project, isGlobalAutoBuildOn, incrementalValEnabled);
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("ValidatorManager::canAutoValidateButtonBeEnabled" + project.getName() + ")"); //$NON-NLS-1$  //$NON-NLS-2$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-			return false;
-		}
-	}
-
-	public boolean canAutoValidateButtonBeEnabled(IProject project, boolean isGlobalAutoBuildOn, boolean incrementalValEnabled) {
-		boolean doesProjectSupportAutoValidate = doesProjectSupportBuildValidation(project);
-		return (doesProjectSupportAutoValidate && isGlobalAutoBuildOn && incrementalValEnabled);
-	}
-
-	/**
-	 * Return true if the validator identified by the String is configured on the IProject and
-	 * enabled on the IProject. Otherwise return false;
-	 */
-	public boolean isEnabled(IProject project, String validatorName) {
-		try {
-			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-			return prjp.isEnabled(validatorName);
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("ValidatorManager.isEnabled(" + project.getName() + ", " + validatorName + ")"); //$NON-NLS-1$  //$NON-NLS-2$ //$NON-NLS-3$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-			return false;
-		}
-	}
-
-	/**
-	 * @deprecated For use by the validation framework only. Return true if the ValidatorMetaData is
-	 *             enabled for the given project
-	 */
-	public boolean isEnabled(IProject project, ValidatorMetaData vmd) {
-		try {
-			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-			return prjp.isEnabled(vmd);
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("ValidatorManager::isEnabled" + project.getName() + ")"); //$NON-NLS-1$  //$NON-NLS-2$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-			return false;
-		}
-	}
-
-	/**
-	 * @deprecated For use by the validation framework only.
-	 */
-	public boolean isConfigured(IProject project, ValidatorMetaData vmd) {
-		return ValidationRegistryReader.getReader().isConfiguredOnProject(vmd, project);
-	}
-
-	/**
-	 * This method returns true if the global auto-build setting is turned on.
-	 */
-	public boolean isGlobalAutoBuildEnabled() {
-		return ResourcesPlugin.getWorkspace().isAutoBuilding();
-	}
-
-	/**
-	 * Returns the number of enabled validators on the given project.
-	 */
-	public int numberProjectEnabledValidators(IProject project) {
-		if (project == null) {
-			return 0;
-		}
-
-		try {
-			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-			return prjp.numberOfEnabledValidators();
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("ValidatorManager::numberProjectEnabledValidators" + project.getName() + ")"); //$NON-NLS-1$  //$NON-NLS-2$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-			return 0;
-		}
-	}
-
-	/**
-	 * @deprecated
-	 * 
-	 * Use the suspendValidation(IProject, boolean) or suspendAllValidation(boolean) method instead.
-	 * This method does not guarantee that validation will be suspended. If the project is
-	 * overriding the preferences then validation will be suspended; otherwise validation will be
-	 * performed.
-	 * 
-	 * Programmatically changing the value of the project's preferences may be done only by the
-	 * validation framework.
-	 */
-	public void setAutoValidate(IProject project, boolean auto) {
-		try {
-			ConfigurationManager.getManager().getProjectConfiguration(project).setAutoValidate(auto);
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("ValidatorManager.setAutoValidate(" + project.getName() + ", " + auto + ")"); //$NON-NLS-1$  //$NON-NLS-2$ //$NON-NLS-3$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Suspends, or undoes the suspension of, validation on the current project. If "suspend" is
-	 * true then validation is suspended and if it's "false" then validation will run on the
-	 * project. The value of this variable is not persisted.
-	 * 
-	 * Be VERY CAREFUL when you use this method! Turn validation back on in a finally block because
-	 * if the code which suspended validation crashes, the user has no way to unsuspend validation.
-	 * The user will have to shut down & restart WSAD to get validation to work again.
-	 * 
-	 * If an operation is used to make changes that should not be validated, then use the technique
-	 * documented in the "Preventing Validation" topic of the "Validation Guide" (in the
-	 * org.eclipse.wst.validation.internal.provisional.core.core.prop plugin). If you don't, validation may not be suspended.
-	 */
-	public void suspendValidation(IProject project, boolean suspend) {
-		if (project == null) {
-			return;
-		}
-
-		if (!project.exists()) {
-			return;
-		}
-
-		// Ignore whether or not the project is closed. If it's closed then it will not be built
-		// and the "Run Validation" option will not be available.
-		if (suspend) {
-			_suspendedProjects.add(project);
-		} else {
-			_suspendedProjects.remove(project);
-		}
-	}
-
-	/**
-	 * Suspends, or undoes the suspension of, validation on all projects in the workbench. If
-	 * "suspend" is true then validation is suspended and if it's "false" then validation will run.
-	 * The value of this variable is not persisted.
-	 * 
-	 * Be VERY CAREFUL when you use this method! Turn validation back on in a finally block because
-	 * if the code which suspended validation crashes, the user has no way to unsuspend validation.
-	 * The user will have to shut down & restart WSAD to get validation to work again.
-	 * 
-	 * If an operation is used to make changes that should not be validated, then use the technique
-	 * documented in the "Preventing Validation" topic of the "Validation Guide" (in the
-	 * org.eclipse.wst.validation.internal.provisional.core.core.prop plugin). If you don't, validation may not be suspended.
-	 */
-	public void suspendAllValidation(boolean suspend) {
-		_suspendAllValidation = suspend;
-	}
-
-	/**
-	 * Return true if "suspend all" is enabled, false otherwise.
-	 */
-	public boolean isSuspended() {
-		return _suspendAllValidation;
-	}
-
-	/**
-	 * Returns true if validation will not run on the project because it's been suspended. This
-	 * method checks only the suspension status; if validation cannot run for some other reason (for
-	 * example, there are no enabled validators), yet the IProject is not suspended, this method
-	 * will return true even though validation will not run.
-	 */
-	public boolean isSuspended(IProject project) {
-		if (project == null) {
-			return false;
-		}
-
-		if (_suspendAllValidation) {
-			return true;
-		}
-
-		return _suspendedProjects.contains(project);
-	}
-
-	/**
-	 * This method should be called by any code that is preparing to suspend validation on a
-	 * project. Rather than calling isSuspsend(IProject), which will return true if all validation
-	 * has been suspended, this method returns the state of the project itself. See the
-	 * ValidationMigrator::migrateProject for an example.
-	 * 
-	 * @param project
-	 * @return boolean
-	 */
-	public boolean isProjectSuspended(IProject project) {
-		if (project == null) {
-			return false;
-		}
-
-		return _suspendedProjects.contains(project);
-	}
-
-	/**
-	 * @deprecated For use by the validation framework only.
-	 * 
-	 * Given a list of validators' plugin ids, make those validators enabled for this project. All
-	 * others, disable for this project.
-	 */
-	public void setEnabledValidators(IProject project, Set vmdsSet, IProgressMonitor monitor) {
-		try {
-			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-			ValidatorMetaData[] vmds = null;
-			if (vmdsSet == null) {
-				vmds = new ValidatorMetaData[0];
-			} else {
-				vmds = new ValidatorMetaData[vmdsSet.size()];
-				vmdsSet.toArray(vmds);
-			}
-
-			prjp.setEnabledValidators(vmds);
-
-			updateTaskList(project);
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("ValidatorManager.setEnabledValidators(" + project.getName() + ", Set, IProgressMonitor)"); //$NON-NLS-1$  //$NON-NLS-2$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-		}
-	}
-
-	public static void setResourceUtilClass(Class clazz) {
-		_resourceUtilClass = clazz;
-	}
-
-	public boolean isMessageLimitExceeded(IResource resource) {
-		if(resource == null) {
-			return false;
-		}
-		if(!resource.exists()) {
-			return false;
-		}
-		IProject project = resource.getProject();
-		if(isNoMessageLimit(project)) {
-			return false;
-		}
-		try {
-			//IMarker[] valTasks = getValidationTasks(project,SeverityEnum.ALL_MESSAGES);
-			initializeMessageLimitProjectMap(project);
-			Object messagesAddedForProject = messageLimitProjectMap.get(project);
-			int valTasks = ((Integer) messagesAddedForProject).intValue();
-			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-			int max = prjp.getMaximumNumberOfMessages();
-			initializeMessageLimitMessageProjectMap();
-			Object messageLimitMessageAdded = messageLimitMessageProjectMap.get(project);
-			boolean isMessageLimitMessageAdded = false;
-			if(messageLimitMessageAdded != null) {
-				isMessageLimitMessageAdded = ((Boolean)messageLimitMessageAdded).booleanValue();
-			}
-			if (valTasks >= max || isMessageLimitMessageAdded) {
-				IMarker[] exceededTasks = getLimitMessage(project);
-				int numExceeded = (exceededTasks == null) ? 0 : exceededTasks.length;
-				// Excluding the "max messages were reported" messages, do the
-				// number of validation messages exceed the limit?
-				int numValTasks = valTasks - numExceeded;
-				if (numValTasks > max) {
-					return true;
-				}
-				// If the "max were reported" exists, does the number of
-				// messages equal the limit?
-				if ((numExceeded > 0) && (numValTasks == max)) {
-					return true;
-				}
-			}
-		}
-		catch(InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("ValidatorManager.setEnabledValidators(" + project.getName() + ", Set, IProgressMonitor)"); //$NON-NLS-1$  //$NON-NLS-2$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-				
-				if(exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-		}
-		return false;
-	}
-	
-	public static void initializeMessageLimitProjectMap(IProject project) {
-		if(messageLimitProjectMap == null) 
-			messageLimitProjectMap = new HashMap();
-		if(messageLimitProjectMap.get(project) == null)
-			messageLimitProjectMap.put(project,new Integer(0));
-	}
-	
-	public static void setMessageLimitMessageForProject(IProject project) {
-		initializeMessageLimitMessageProjectMap();
-		messageLimitMessageProjectMap.put(project, Boolean.TRUE);
-	}
-
-	private static void initializeMessageLimitMessageProjectMap() {
-		if(messageLimitMessageProjectMap == null) 
-			messageLimitMessageProjectMap = new HashMap();
-	}
-
-	/**
-	 * This method is for use by batch EJB deploy only. Only in batch mode is an infinitie number of
-	 * messages allowed.
-	 * 
-	 * Enable a project to have an infinite number of messages.
-	 */
-	public void setNoMessageLimit(IProject project) {
-		setMessageLimit(project, WorkbenchReporter.NO_MESSAGE_LIMIT);
-	}
-
-	/**
-	 * This method is for use by batch EJB deploy only. Only in batch mode is an infinitie number of
-	 * messages allowed.
-	 * 
-	 * Return true if the given project is allowed an infinite number of validation messages.
-	 */
-	public boolean isNoMessageLimit(IProject project) {
-		try {
-			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-			int max = prjp.getMaximumNumberOfMessages();
-			if (max == WorkbenchReporter.NO_MESSAGE_LIMIT) {
-				return true;
-			}
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("ValidatorManager.setEnabledValidators(" + project.getName() + ", Set, IProgressMonitor)"); //$NON-NLS-1$  //$NON-NLS-2$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * This method is for use by the validation framework only.
-	 */
-	public void setMessageLimit(IProject project, int limit) {
-		try {
-			if ((limit == WorkbenchReporter.NO_MESSAGE_LIMIT) || (limit >= 0)) {
-				ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-				if (!prjp.doesProjectOverride()) {
-					prjp.setDoesProjectOverride(true);
-				}
-				prjp.setMaximumNumberOfMessages(limit);
-			}
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("ValidatorManager.setMessageLimit(" + project.getName() + ", " + limit + ")"); //$NON-NLS-1$  //$NON-NLS-2$ //$NON-NLS-3$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @deprecated This method should be used only by the validation framework. If a validator
-	 *             validates more than one project, then a try-catch block should wrap the
-	 *             validation of each project, and the MessageLimitException should be caught. In
-	 *             the catch(MessageLimitException) block, this method should be called so that the
-	 *             appropriate message can be added to the task list: "validation was terminated
-	 *             because the maximum number of messages was reported"
-	 */
-	public boolean checkMessageLimit(IProject project) {
-		return checkMessageLimit(project, true);
-	}
-
-	/**
-	 * @deprecated This method should be used only by the validation framework.
-	 */
-	public boolean checkMessageLimit(IProject project, Iterator iterator) {
-		return checkMessageLimit(project, false);
-	}
-
-	/**
-	 * This method is intended to be used only by the validation framework. This method should be
-	 * used by the validation operation to add/remove the "exceeded" message. Return true if the
-	 * project is under the limit of messages, false otherwise.
-	 */
-	public boolean checkMessageLimit(IProject project, boolean removeExceededMessage) {
-		if (project == null) {
-			return true;
-		}
-
-		if (!isMessageLimitExceeded(project)) {
-			if (removeExceededMessage) {
-				// If the max was exceeded before, but isn't exceeded now,
-				// remove the "exceeded" message.
-				removeMessageLimitExceeded(project);
-			}
-			return true;
-		}
-
-		// This method is called under two conditions:
-		//    1. The UI's message limit has changed, and some messages may need to be removed. The
-		// "exceeded" message is never removed.
-		//    2. The ValidationOperation has run, and the exceeded message may need to be added or
-		// removed.
-		boolean result = true;
-		try {
-			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-			int max = prjp.getMaximumNumberOfMessages();
-			IMarker[] markers = getValidationTasksWithoutLimitMessage(project);
-			int numExceededMarkers = markers.length - max; // Excluding the "limit was exceeded"
-			// message, this is the number of extra
-			// markers.
-			if (numExceededMarkers >= 0) { // Will be == max if last time val run, maximum reported.
-				// Remove some markers; these markers are chosen arbitrarily.
-				int index = (max >= 0) ? (max) : 0;
-				IMarker[] removeMarkers = new IMarker[numExceededMarkers];
-				System.arraycopy(markers, index, removeMarkers, 0, numExceededMarkers);
-				try {
-					ResourcesPlugin.getWorkspace().deleteMarkers(removeMarkers);
-				} catch (CoreException exc) {
-					Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-					if (logger.isLoggingLevel(Level.SEVERE)) {
-						LogEntry entry = ValidationPlugin.getLogEntry();
-						entry.setSourceID("ValidatorManager.checkMessageLimit(" + project.getName() + ")"); //$NON-NLS-1$  //$NON-NLS-2$
-						entry.setTargetException(exc);
-						logger.write(Level.SEVERE, entry);
-					}
-				}
-				result = false;
-
-				if (max > 0) {
-					// If max <= 0, user doesn't want to see anything
-					// If exceeded message doesn't exist, add it.
-					addMessageLimitExceeded(project);
-				}
-			} else if (removeExceededMessage) {
-				removeMessageLimitExceeded(project);
-			}
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceIdentifier("ValidatorManager.checkMessageLimit(" + project.getName() + ")"); //$NON-NLS-1$  //$NON-NLS-2$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-			return true;
-		}
-
-		return result;
-	}
-
-	/**
-	 * @deprecated This method should be used by the validation operation to add/remove the
-	 *             "exceeded" message.
-	 */
-	public boolean checkMessageLimit(IProject project, Iterator iterator, boolean removeExceededMessage) {
-		return checkMessageLimit(project, removeExceededMessage);
-	}
-
-	/**
-	 * This message is for use only by the validation framework. If the "max messages were reported"
-	 * IMarker exists, return it. Otherwise return null.
-	 */
-	private IMarker[] getLimitMessage(IProject project) {
-		IMarker[] exceededMessage = TaskListUtility.getValidationTasks(project, WorkbenchReporter.getUniqueId(getMessageLimitOwner()));
-		if ((exceededMessage != null) && (exceededMessage.length != 0)) {
-			return exceededMessage;
-		}
-
-		return null;
-	}
-
-	/**
-	 * Return true if the given IMarker is a "limit was exceeded" message, false otherwise.
-	 */
-	private boolean isLimitMessage(IMarker marker) {
-		if (marker == null) {
-			return false;
-		}
-
-		return TaskListUtility.isOwner(marker, WorkbenchReporter.getUniqueId(getMessageLimitOwner()));
-	}
-
-	/**
-	 * Return all of the IMarkers on the IProject excluding the "limit was exceeded" message. If
-	 * there are no markers, return null.
-	 */
-	private IMarker[] getValidationTasksWithoutLimitMessage(IProject project) {
-		IMarker[] allTasks = TaskListUtility.getValidationTasks(project, IMessage.ALL_MESSAGES);
-		if ((allTasks == null) || (allTasks.length == 0)) {
-			return null;
-		}
-
-		// Don't check if the limit message exists because
-		// any interaction with markers is costly. Since the
-		// interaction has to be done at least once, make that
-		// single occasion in the for loop below.
-		IMarker[] validatorMessages = new IMarker[allTasks.length];
-		int count = 0; // how many markers have been added to the result array?
-		for (int i = 0; i < allTasks.length; i++) {
-			IMarker marker = allTasks[i];
-			if (isLimitMessage(marker)) {
-				continue;
-			}
-			validatorMessages[count++] = marker;
-		}
-
-		IMarker[] result = new IMarker[count];
-		System.arraycopy(validatorMessages, 0, result, 0, count);
-		return result;
-	}
-
-	/**
-	 * This method should be called only by the validation framework. Return true if the message was
-	 * removed, false if the message didn't exist.
-	 */
-	public boolean removeMessageLimitExceeded(IProject project) {
-		IMarker[] exceededMessage = getLimitMessage(project);
-		if (exceededMessage != null) {
-			try {
-				ResourcesPlugin.getWorkspace().deleteMarkers(exceededMessage);
-				return true;
-			} catch (CoreException exc) {
-				Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-				if (logger.isLoggingLevel(Level.SEVERE)) {
-					LogEntry entry = ValidationPlugin.getLogEntry();
-					entry.setSourceID("ValidatorManager.removeMessageLimitExceeded(" + project.getName() + ")"); //$NON-NLS-1$  //$NON-NLS-2$
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Return true if the last validation operation terminated due to the maximum number of messages
-	 * having already been reported.
-	 */
-	public boolean wasValidationTerminated(IProject project) {
-		IMarker[] exceededMessage = getLimitMessage(project);
-		return (exceededMessage != null); // Validation was terminated if the message exists.
-	}
-
-	private Class getMessageLimitOwner() {
-		if (_messageLimitOwner == null) {
-			_messageLimitOwner = getClass();
-		}
-		return _messageLimitOwner;
-	}
-
-	/**
-	 * Return true if owner is the name of the class which owns validation framework status
-	 * messages.
-	 * 
-	 * ONLY the validation framework should use this method.
-	 */
-	public boolean isInternalOwner(String owner) {
-		if (owner == null) {
-			return false;
-		}
-
-		for (int i = 0; i < _internalOwners.length; i++) {
-			String internalOwner = _internalOwners[i];
-			if (owner.equals(internalOwner)) {
-				return true;
-			}
-		}
-
-		return false;
-	}
-
-	/**
-	 * Add a class to the list of owners of validation messages. ONLY by the validation framework
-	 * should use this method (it is used for messages owned by framework classes or classes used by
-	 * the TVT plugin.)
-	 */
-	public void addInternalOwner(Class clazz) {
-		if (clazz == null) {
-			return;
-		}
-
-		String[] tempInternalOwners = new String[_internalOwners.length + 1];
-		if (_internalOwners.length > 0) {
-			System.arraycopy(_internalOwners, 0, tempInternalOwners, 0, _internalOwners.length);
-		}
-		tempInternalOwners[_internalOwners.length] = WorkbenchReporter.getUniqueId(clazz);
-
-		_internalOwners = tempInternalOwners;
-	}
-
-
-	/**
-	 * @deprecated This method should be used only by the validation framework.
-	 */
-	public void addMessageLimitExceeded(IProject project, Iterator iterator) {
-		addMessageLimitExceeded(project);
-	}
-
-	/**
-	 * This method should be used only by the validation framework.
-	 */
-	public void addMessageLimitExceeded(IProject project) {
-		// if the message exists already, don't add it again.
-		IMarker[] exceededMessage = getLimitMessage(project);
-		if (exceededMessage == null) {
-			IMessage message = new Message(ValidationPlugin.VALIDATION_PROP_FILE_NAME, IMessage.LOW_SEVERITY, ResourceConstants.VBF_TASK_WARN_MESSAGE_LIMIT_VAL);
-			WorkbenchReporter.addMessage(project, getMessageLimitOwner(), message);
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidatorSubsetOperation.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidatorSubsetOperation.java
deleted file mode 100644
index f5aee2d..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidatorSubsetOperation.java
+++ /dev/null
@@ -1,317 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.operations;
-
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.wst.validation.internal.FilterUtil;
-import org.eclipse.wst.validation.internal.InternalValidatorManager;
-import org.eclipse.wst.validation.internal.RegistryConstants;
-import org.eclipse.wst.validation.internal.ResourceConstants;
-import org.eclipse.wst.validation.internal.ResourceHandler;
-import org.eclipse.wst.validation.internal.ValidationRegistryReader;
-import org.eclipse.wst.validation.internal.ValidatorMetaData;
-
-
-/**
- * Run some validators on a given IProject. Any validators which cannot be loaded or which are not
- * registered against this type of project will be ignored.
- * 
- * This operation is not intended to be subclassed outside of the validation framework.
- */
-public class ValidatorSubsetOperation extends ValidationOperation {
-	protected static final String DEFAULT_DEFAULTEXTENSION = null; // By default, assume that there
-
-	// is no default fallback
-	// extension
-
-	/**
-	 * Create an operation that runs a full validation on the named validators either if validation
-	 * needs to (@see ValidatorSubsetOperation(IProject)) or if <code>force</code> is true.
-	 * 
-	 * IProject must exist and be open.
-	 * 
-	 * If async is true, the validation will run all thread-safe validators in the background
-	 * validation thread, and all other validators in the main thread. If async is false, all
-	 * validators will run in in the main thread.
-	 */
-	public ValidatorSubsetOperation(IProject project, boolean force, boolean async) {
-		this(project, force, RegistryConstants.ATT_RULE_GROUP_DEFAULT, async);
-	}
-
-	/**
-	 * Create an operation that runs a full validation on the named validators using the
-	 * <code>ruleGroup</code> pass. Use this constructor only if you want to run a validator that
-	 * supports the two passes: FAST and FULL.
-	 * 
-	 * If force is true, validation is run whether or not it needs to.
-	 * 
-	 * IProject must exist and be open.
-	 * 
-	 * If async is true, the validation will run all thread-safe validators in the background
-	 * validation thread, and all other validators in the main thread. If async is false, all
-	 * validators will run in in the main thread.
-	 */
-	public ValidatorSubsetOperation(IProject project, IWorkbenchContext aWorkenchContext, boolean force, int ruleGroup, boolean async) {
-		super(project, aWorkenchContext, null, null, ruleGroup, force, async);
-	}
-	
-
-	/**
-	 * Create an operation that runs a full validation on the named validators using the
-	 * <code>ruleGroup</code> pass. Use this constructor only if you want to run a validator that
-	 * supports the two passes: FAST and FULL.
-	 * 
-	 * If force is true, validation is run whether or not it needs to.
-	 * 
-	 * IProject must exist and be open.
-	 * 
-	 * If async is true, the validation will run all thread-safe validators in the background
-	 * validation thread, and all other validators in the main thread. If async is false, all
-	 * validators will run in in the main thread.
-	 */
-	public ValidatorSubsetOperation(IProject project, boolean force, int ruleGroup, boolean async) {
-		super(project, null, null, ruleGroup, force, async);
-	}
-
-	/**
-	 * The fileExtension parameter must be ".X", where X is the extension. Do not type "*.X" or "X"
-	 * (i.e., without the dot). The parameter could also be the file name, e.g. "foo.X".
-	 * 
-	 * This constructor should be used when the invoker wishes to force validation on certain
-	 * resources, without waiting for the user to save their changes.
-	 * 
-	 * An IllegalArgumentException is thrown if there are no validators registered for the
-	 * fileExtension on the given IProject.
-	 * 
-	 * IProject must exist and be open.
-	 * 
-	 * If async is true, the validation will run all thread-safe validators in the background
-	 * validation thread, and all other validators in the main thread. If async is false, all
-	 * validators will run in in the main thread.
-	 */
-	public ValidatorSubsetOperation(IProject project, String fileExtension, Object[] changedResources, boolean async) throws IllegalArgumentException {
-		this(project, fileExtension, DEFAULT_DEFAULTEXTENSION, changedResources, async);
-	}
-
-	/**
-	 * The fileExtension parameter must be ".X", where X is the extension. Do not type "*.X" or "X"
-	 * (i.e., without the dot). The parameter could also be the file name, e.g. "foo.X".
-	 * 
-	 * This constructor should be used when the invoker wishes to force validation on certain
-	 * resources, without waiting for the user to save their changes.
-	 * 
-	 * If there are no validators configured on files named ".X", then use the validators configured
-	 * on validators named ".Y", where defaultExtension identifies the fallback extension to use.
-	 * defaultExtension follows the same syntax as fileExtension.
-	 * 
-	 * An IllegalArgumentException is thrown if there are no validators registered for the
-	 * fileExtension or defaultExtension on the given IProject.
-	 * 
-	 * IProject must exist and be open.
-	 * 
-	 * If async is true, the validation will run all thread-safe validators in the background
-	 * validation thread, and all other validators in the main thread. If async is false, all
-	 * validators will run in in the main thread.
-	 */
-	public ValidatorSubsetOperation(IProject project, String fileExtension, String defaultExtension, Object[] changedResources, boolean async) throws IllegalArgumentException {
-		super(project, shouldForce(changedResources), async);
-
-		boolean filterIn = false; // force the resources to be filtered in even if the validator
-		// doesn't normally take them?
-		ValidatorMetaData[] vmds = InternalValidatorManager.getManager().getValidatorsForExtension(project, fileExtension); // return
-		// a
-		// list
-		// of
-		// validators
-		// which
-		// are
-		// configured
-		// to
-		// run
-		// on
-		// files
-		// with
-		// that
-		// extension.
-		// A
-		// validator
-		// will
-		// be
-		// in
-		// the
-		// list
-		// whether
-		// it
-		// has
-		// been
-		// enabled
-		// or
-		// disabled
-		// by
-		// the
-		// user.
-		if ((defaultExtension != null) && ((vmds == null) || (vmds.length == 0))) {
-			filterIn = true;
-			vmds = InternalValidatorManager.getManager().getValidatorsForExtension(project, defaultExtension);
-		}
-
-		if ((vmds == null) || (vmds.length == 0)) {
-			throw new IllegalArgumentException();
-		}
-
-		setEnabledValidators(InternalValidatorManager.wrapInSet(vmds));
-
-		setFileDeltas(FilterUtil.getFileDeltas(getEnabledValidators(), changedResources, filterIn)); // construct
-		// an
-		// array
-		// of
-		// IFileDelta[]
-		// to
-		// wrap
-		// the
-		// Object[];
-		// one
-		// IFileDelta
-		// for
-		// each
-		// Object
-		// in
-		// the
-		// array
-	}
-
-	/**
-	 * This constructor is provided for the validation async testing, and is not intended to be
-	 * called outside the validation framework.
-	 * 
-	 * Run validation on the changed resources with the given validators. All resources must be from
-	 * the same project; if they're not, an IllegalArgumentException will be thrown. All validators
-	 * must be able to run on the resources' project; if not, an IllegalArgumentException will be
-	 * thrown. If the vmds are either empty or null, an IllegalArgumentExeption will be thrown. If
-	 * the project is closed or doesn't exist then an IllegalArgumentException will be thrown.
-	 * 
-	 * The ifileDeltaType is one of the IFileDelta constants: ADDED, CHANGED, or DELETED.
-	 * 
-	 * IProject must exist and be open.
-	 * 
-	 * If async is true, the validation will run all thread-safe validators in the background
-	 * validation thread, and all other validators in the main thread. If async is false, all
-	 * validators will run in in the main thread.
-	 */
-	public ValidatorSubsetOperation(IProject project, ValidatorMetaData[] vmds, IResource[] changedResources, int ifileDeltaType, boolean force, boolean async) throws IllegalArgumentException {
-		// Have to have the IProject as a parameter because ValidationOperation needs the IProject,
-		// and the super(..)
-		// must be called before anything else in this constructor is called.
-		super(project, force, async);
-
-		if ((vmds == null) || (vmds.length == 0)) {
-			throw new IllegalArgumentException(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_BADVMD));
-		}
-
-		if (!project.isOpen()) {
-			throw new IllegalArgumentException(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_OPENPRJ, new String[]{project.getName()}));
-		}
-		if (!project.exists()) {
-			throw new IllegalArgumentException(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_EXISTPRJ, new String[]{project.getName()}));
-		}
-
-		if ((changedResources != null) && (changedResources.length > 0)) {
-			Set tempSet = new HashSet();
-			for (int i = 0; i < changedResources.length; i++) {
-				IProject p = changedResources[i].getProject();
-				if (!p.isOpen()) {
-					throw new IllegalArgumentException(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_OPENPRJ, new String[]{p.getName()}));
-				}
-				if (!p.exists()) {
-					throw new IllegalArgumentException(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_EXISTPRJ, new String[]{p.getName()}));
-				}
-				tempSet.add(project);
-			}
-
-			if (!tempSet.contains(project)) {
-				throw new IllegalArgumentException(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_BADPRJ, new String[]{project.getName()}));
-			}
-			if (tempSet.size() != 1) {
-				StringBuffer buffer = new StringBuffer("\n"); //$NON-NLS-1$
-				Iterator iterator = tempSet.iterator();
-				while (iterator.hasNext()) {
-					IProject p = (IProject) iterator.next();
-					buffer.append("\t"); //$NON-NLS-1$
-					buffer.append(p.getName());
-					if (iterator.hasNext()) {
-						buffer.append(", "); //$NON-NLS-1$
-					}
-				}
-				throw new IllegalArgumentException(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_MULTIPRJ, new String[]{buffer.toString()}));
-			}
-		}
-
-		for (int i = 0; i < vmds.length; i++) {
-			ValidatorMetaData vmd = vmds[i];
-			if (!ValidationRegistryReader.getReader().isConfiguredOnProject(vmd, project)) {
-				throw new IllegalArgumentException(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_BADVAL, new String[]{vmd.getValidatorDisplayName(), project.getName()}));
-			}
-		}
-
-		setEnabledValidators(InternalValidatorManager.wrapInSet(vmds));
-		setFileDeltas(FilterUtil.getFileDeltas(getEnabledValidators(), changedResources, ifileDeltaType)); // construct
-		// an
-		// array
-		// of
-		// IFileDelta[]
-		// to
-		// wrap
-		// the
-		// IResource[];
-		// one
-		// IFileDelta
-		// for
-		// each
-		// IResource
-		// in
-		// the
-		// array
-	}
-
-	/**
-	 * Given an array of fully-qualified class names of validators, create the list of validators to
-	 * be run. The array is not checked for duplicates or for invalid validators (i.e., a validator
-	 * of that class type is not loaded, or the validator is loaded but cannot run against this type
-	 * of IProject.)
-	 */
-	public void setValidators(String[] validatorNames) throws IllegalArgumentException {
-		Set enabled = new HashSet();
-		for (int i = 0; i < validatorNames.length; i++) {
-			ValidatorMetaData vmd = ValidationRegistryReader.getReader().getValidatorMetaData(validatorNames[i]);
-			if (vmd == null) {
-				// No validator, with that plugin id, can be run on that project.
-				// Either the validator isn't installed, or the IProject passed in
-				// doesn't have the necessary nature.
-				throw new IllegalArgumentException(validatorNames[i]);
-			}
-			enabled.add(vmd);
-		}
-		setEnabledValidators(enabled);
-	}
-
-	/**
-	 * @deprecated Will be removed in Milestone 3. Use setForce(boolean)
-	 */
-	public void setAlwaysRun(boolean force) {
-		setForce(force);
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/WorkbenchContext.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/WorkbenchContext.java
deleted file mode 100644
index 58b281f..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/WorkbenchContext.java
+++ /dev/null
@@ -1,790 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.operations;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.logging.Level;
-
-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.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.validation.internal.RegistryConstants;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-
-/**
- * Abstract base class for registration of symbolic model names, and also provides the mechanism for
- * registering the load model method which loads a specific type of MOF model, as identified by the
- * symbolic model name.
- */
-public class WorkbenchContext implements IWorkbenchContext {
-	private IProject _project = null;
-	private Hashtable _modelRegistry = null;
-//	private static final IContainer[] NO_CONTAINERS = new IContainer[0];
-	private int _ruleGroup = RegistryConstants.ATT_RULE_GROUP_DEFAULT;
-	public List validationFileURIs = null; 
-	public static final String GET_PROJECT_FILES = "getAllFiles"; //$NON-NLS-1$
-	public static final String GET_FILE = "getFile"; //$NON-NLS-1$
-//	private static final IContainer[] NO_CONTAINERS = new IContainer[0];
-	public static final String VALIDATION_MARKER = "com.ibm.etools.validation.problemmarker"; //$NON-NLS-1$
-	public static final String VALIDATION_MARKER_OWNER = "owner";  //$NON-NLS-1$
-
-	public WorkbenchContext() {
-		super();
-		_modelRegistry = new Hashtable();
-
-		registerModel(IRuleGroup.PASS_LEVEL, "loadRuleGroup"); //$NON-NLS-1$
-		
-		//the following will register the helper's symbolic methods
-	    Class [] args = new Class[1] ;
-	    args[0] = String.class ;  // a string argument denoting a specific JSP.
-		registerModel(GET_FILE, "getFile", args);//$NON-NLS-1$
-		registerModel(GET_PROJECT_FILES, "getFiles", args);//$NON-NLS-1$
-	}
-
-	/**
-	 * When the validation is complete, this method will be called so that the IWorkbenchContext can
-	 * clean up any resources it allocated during the validation.
-	 * 
-	 * If the cleanup is a long-running operation, subtask messages should be sent to the IReporter.
-	 */
-	public void cleanup(WorkbenchReporter reporter) {
-		// Default: nothing to clean up
-	}
-
-	/**
-	 * When the IProject is closing, perform any cleanup that needs to be done. When this method is
-	 * called, if the helper has cached any resources from the IProject, it should release those
-	 * resources. If you do not allocate resources in your helper, then this method should be a
-	 * no-op.
-	 */
-	public void closing() {
-		closing(getProject());
-	}
-
-	/**
-	 * When the IProject is closing, perform any cleanup that needs to be done. When this method is
-	 * called, if the helper has cached any resources from the IProject, it should release those
-	 * resources. If you do not allocate resources in your helper, then this method should be a
-	 * no-op.
-	 * 
-	 * @deprecated Override closing() instead, and use getProject()
-	 */
-	public void closing(IProject project) {
-		//do nothing
-	}
-
-	/**
-	 * When the IProject is being deleted, perform any cleanup that needs to be done. When this
-	 * method is called, if the helper has cached any resources from the IProject, it should release
-	 * those resources. If you do not allocate resources in your helper, then this method should be
-	 * a no-op.
-	 */
-	public void deleting() {
-		deleting(getProject());
-	}
-
-	/**
-	 * When the IProject is being deleted, perform any cleanup that needs to be done. When this
-	 * method is called, if the helper has cached any resources from the IProject, it should release
-	 * those resources. If you do not allocate resources in your helper, then this method should be
-	 * a no-op.
-	 * 
-	 * @deprecated Override deleting() instead, and use getProject()
-	 */
-	public void deleting(IProject project) {
-		//do nothing
-	}
-
-	/**
-	 * Returns the IPath of a resource, relative to the container. If the IResource is not a member
-	 * of the container, return null. This method should be useful for implementors of this class;
-	 * specifically, in their getPortableName method.
-	 */
-	public static String getContainerRelativePath(String fullPath, IContainer container) {
-		if ((fullPath == null) || (container == null))
-			return null;
-		IPath relPath = getContainerRelativePath(new Path(fullPath), container);
-		if (relPath != null)
-			return relPath.toString();
-		return null;
-	}
-
-	/**
-	 * Returns the IPath of a resource, relative to the container. If the IResource is not a member
-	 * of the container, return null. This method should be useful for implementors of this class;
-	 * specifically, in their getPortableName method.
-	 */
-	public static IPath getContainerRelativePath(IResource resource, IContainer container) {
-		if ((resource == null) || (container == null)) {
-			return null;
-		}
-
-		IResource foundResource = null;
-		IPath relPath = getContainerRelativePath(resource.getFullPath(), container);
-		if (relPath != null) {
-			// if relPath is null, the resource is not a direct member of the container
-			try {
-				if (!resource.exists()) { // findMember won't work
-					if (resource instanceof IFile) {
-						foundResource = container.getFile(relPath);
-					} else if (resource instanceof IFolder) {
-						foundResource = container.getFolder(relPath);
-					}
-				} else {
-					foundResource = container.findMember(relPath, true); // true means include
-					// phantom resources
-					if ((foundResource != null) && !foundResource.exists()) {
-						foundResource = null;
-					}
-				}
-			} catch (IllegalArgumentException exc) {
-				foundResource = null;
-
-				Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-				if (logger.isLoggingLevel(Level.SEVERE)) {
-					LogEntry entry = ValidationPlugin.getLogEntry();
-					entry.setSourceID("WorkbenchContext::getContainerRelativePath(IResource, IContainer)"); //$NON-NLS-1$
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-			}
-		}
-
-		if (foundResource == null) {
-			return null;
-		}
-
-		// file has been found
-		int matchingFirstSegments = container.getProjectRelativePath().matchingFirstSegments(resource.getProjectRelativePath());
-		return resource.getProjectRelativePath().removeFirstSegments(matchingFirstSegments);
-	}
-
-	/**
-	 * Given an IPath, if the IPath is absolute, and is a part of the IContainer, return an IPath
-	 * which is relative to the container. If the IPath is not part of the IContainer, return null.
-	 */
-	public static IPath getContainerRelativePath(IPath path, IContainer container) {
-		if ((path == null) || (container == null)) {
-			return null;
-		}
-
-		if (path.isAbsolute()) {
-			// Is the path part of the IContainer?
-			int matchingFirstSegments = path.matchingFirstSegments(container.getFullPath());
-			if ((matchingFirstSegments > 0) && (matchingFirstSegments == container.getFullPath().segmentCount())) {
-				// part of the IContainer
-				return path.removeFirstSegments(matchingFirstSegments);
-			}
-			// not part of the IContainer
-			return null;
-		}
-		// path is relative
-		// Is the path part of the IContainer?
-		//TODO don't have time to implement this now, but should in future. - Ruth
-		return null;
-	}
-
-	/**
-	 * Given an IMessage's target object, return a string which identifies the object, so that the
-	 * user can locate it.
-	 */
-	public String getDescription(Object object) {
-		if (object == null) {
-			return ""; //$NON-NLS-1$
-		}
-
-		if (object instanceof WorkbenchFileDelta) {
-			WorkbenchFileDelta wfd = (WorkbenchFileDelta) object;
-			if (wfd.getResource() != null) {
-				// resource will be null if WorkbenchFileDelta was constructed from an Object
-				// instead of an IResource
-				return wfd.getResource().getFullPath().toString();
-			}
-		}
-
-		return object.toString();
-	}
-
-	/**
-	 * Given an Object, if the object has a corresponding IFile in the workbench, return the IFile.
-	 * Otherwise return null.
-	 * 
-	 * This method is used by the WorkbenchReporter. In eclipse, in order to add or remove a task
-	 * list entry, the IResource, to which the entry applies, must be identified. The IReporter
-	 * interface passes in an Object in these methods:
-	 * 
-	 * addValidationMessage(IValidator, IMessage) // Object is a part of IMessage
-	 * 
-	 * removeAllMessages(IValidator, Object),
-	 * 
-	 * Thus, the WorkbenchReporter needs to know how, given the Object, which IFile that the Object
-	 * represents in the workbench, in order to be able to add the task list entry.
-	 * 
-	 * If this method returns null, then the WorkbenchReporter will add the message to the IProject
-	 * instead of an IFile.
-	 *  
-	 */
-	public IFile getFile(Object obj) {
-		return null;
-	}
-
-	public IResource getResource(Object obj) {
-		if (obj == null) {
-			return null;
-		}
-
-		IResource res = null;
-		if (obj instanceof WorkbenchFileDelta) {
-			// resource may be null if WorkbenchFileDelta was constructed from an Object instead of
-			// an IResource
-			res = ((WorkbenchFileDelta) obj).getResource();
-		} else if (obj instanceof IResource) {
-			res = (IResource) obj;
-		}
-
-		if ((res == null) || (!res.exists())) {
-			return getFile(obj);
-		}
-
-		return res;
-	}
-
-	/**
-	 * If the IProject is associated with an EJBNatureRuntime, return the IJavaProject which
-	 * represents it.
-	 */
-//	public static IJavaProject getJavaProject(IProject project) {
-//		if (project == null) {
-//			return null;
-//		}
-//		return JavaCore.create(project);
-//	}
-
-	/**
-	 * Given an IMessage's target object, return the line number, of the IFile, which the target
-	 * object represents. If the object is null, or if access to line numbers is not possible,
-	 * return "0".
-	 */
-	public int getLineNo(Object object) {
-		IResourceUtil util = ValidatorManager.getResourceUtil();
-		if (util == null) {
-			return IMessage.LINENO_UNSET;
-		}
-		try {
-			return util.getLineNo(object);
-		} catch (Throwable exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("WorkbenchContext.getLineNo(Object)"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-			return IMessage.LINENO_UNSET;
-		}
-
-	}
-	
-	/**
-	 * Given an IMessage's target object, return the line number, of the IFile, which the target
-	 * object represents, if possible. If the object is null, or if access to line numbers is not
-	 * possible, return a text description of the location.
-	 * 
-	 * This method will be called whether or not the IResource is an IFile, IFolder, or IProject.
-	 * Line numbers are valid only for IFile types; if the resource is not an IFile, then a text
-	 * description of the location must be returned.
-	 */
-	public String getLocation(Object object) {
-		IResource res = getResource(object);
-		if ((res == null) || !(res instanceof IFile))
-			// return a text description
-			return getDescription(object);
-		// default to a line number, if it's available. Else, use a text description.
-		int lineNumber = getLineNo(object);
-		if (lineNumber == IMessage.LINENO_UNSET) {
-			return getDescription(object);
-		}
-		// return the line number
-		return String.valueOf(lineNumber);
-	}
-
-	/**
-	 * Given a name of a load method, and the types of parameters it takes (this method is always
-	 * called with null as the second parameter), return the java.lang.reflect.Method which
-	 * represents the load method.
-	 */
-	private final Method getMethod(String methodName, Class[] parmTypes) {
-		Method m = null;
-		try {
-			m = getClass().getMethod(methodName, parmTypes);
-		} catch (NoSuchMethodException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("WorkbenchContext::getMethod(String, Class[])"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-			return null;
-		}
-
-		return m;
-	}
-
-	/**
-	 * @see IWorkbenchContext.getPortableName(IResource)
-	 */
-	public String getPortableName(IResource resource) {
-		return resource.getFullPath().toString();
-	}
-
-	/**
-	 * Return the IProject which is about to be validated. Each IWorkbenchContext knows how to
-	 * traverse a certain type of IProject, for example, an EJB project or a web project.
-	 */
-	public final IProject getProject() {
-		return _project;
-	}
-	
-	  /**
-	   * Get the IFile for the given filename.
-	   * 
-	   * @param filename The name of the file to retrieve.
-	   * @return An IFile representing the file specified or null if it can't be resolved.
-	   */
-	  public IFile getFile(String filename)
-	  {
-	    //    System.out.println("file name = " + filename);
-	    IResource res = getProject().findMember(filename, true); // true means include phantom resources
-	    if (res instanceof IFile) 
-	    {
-	      return (IFile) res;
-	    }
-	    return null;
-	  }
-	  
-	  /**
-	   * Get the collection of files from the project that are relevant for the
-	   * validator with the given class name.
-	   * 
-	   * @param validatorClassName The name of the validator class.
-	   * @return The collection of files relevant for the validator class specified.
-	   */
-	  public Collection getFiles(String validatorClassName)
-	  {
-	    IProject project = getProject();
-	    List files = new ArrayList();
-	    getFiles(files, project, validatorClassName);
-	    return files;
-	  }
-
-	  /**
-	   * Get the collection of files from the project that are relevant for the
-	   * validator with the given class name.
-	   * 
-	   * @param files The files relevant for the class name.
-	   * @param resource The resource to look for files in.
-	   * @param validatorClassName The name of the validator class.
-	   */
-	  protected void getFiles(Collection files, IContainer resource, String validatorClassName)
-	  {
-	    try
-	    {
-	      IResource [] resourceArray = resource.members(false);
-	      for (int i=0; i<resourceArray.length; i++)
-	      {       
-	        if (ValidatorManager.getManager().isApplicableTo(validatorClassName, resourceArray[i])) 
-	        {
-	          if (resourceArray[i] instanceof IFile) 
-				  files.add(resourceArray[i]);
-	        }
-	        if (resourceArray[i].getType() == IResource.FOLDER)
-	         getFiles(files,(IContainer)resourceArray[i], validatorClassName) ;
-	      }
-	    }
-	    catch (Exception e) {}
-	  }
-	  
-
-//	/**
-//	 * Return the folders (or project) which contain the .java source files.
-//	 */
-//	public static IContainer[] getProjectSourceContainers(IProject project) {
-//		if (project == null) {
-//			return NO_CONTAINERS;
-//		}
-//
-//		IJavaProject jp = getJavaProject(project);
-//		if (jp == null) {
-//			return NO_CONTAINERS;
-//		}
-//
-//		return getProjectSourceContainers(jp);
-//	}
-
-	/**
-	 * Return the folders (or project) which contain the .java source files.
-	 */
-//	public static IContainer[] getProjectSourceContainers(IJavaProject javaProject) {
-//		if (javaProject == null) {
-//			return NO_CONTAINERS;
-//		}
-//		IProject project = javaProject.getProject();
-//
-//		IClasspathEntry[] classpath = null;
-//		try {
-//			classpath = javaProject.getResolvedClasspath(true); // true means ignore unresolved
-//			// (missing) variables, instead of
-//			// throwing an exception
-//		} catch (JavaModelException exc) {
-//			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-//			if (logger.isLoggingLevel(Level.SEVERE)) {
-//				LogEntry entry = ValidationPlugin.getLogEntry();
-//				entry.setSourceID("WorkbenchContext::getProjectSourceContainers(IJavaProject)"); //$NON-NLS-1$
-//				entry.setTargetException(exc);
-//				logger.write(Level.SEVERE, entry);
-//			}
-//			return NO_CONTAINERS;
-//		}
-//
-//		if (classpath == null) {
-//			return NO_CONTAINERS;
-//		}
-//
-//		// Traverse the classpath, and calculate a list of just the
-//		// IFolders and IProjects (i.e., IContainers) which contain source
-//		IContainer[] icontainers = new IContainer[classpath.length];
-//		int validCount = 0;
-//		for (int i = 0; i < classpath.length; i++) {
-//			IClasspathEntry entry = classpath[i];
-//			if (entry.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
-//				IPath entryPath = entry.getPath();
-//				IPath relEntryPath = getContainerRelativePath(entryPath, project);
-//				if (relEntryPath == null) {
-//					// classpath entry refers to something which doesn't exist
-//					continue;
-//				}
-//
-//				IResource outputResource = project.findMember(relEntryPath);
-//				if (outputResource == null) {
-//					// classpath entry refers to something which doesn't exist
-//					continue;
-//				}
-//
-//				if (outputResource instanceof IContainer) {
-//					icontainers[validCount++] = (IContainer) outputResource;
-//				}
-//			}
-//		}
-//
-//		//  following line causes a ClassCastException, so construct an array of IContainers
-//		// explicitly
-//		//	return (IContainer[])icontainers.toArray();
-//		IContainer[] containers = new IContainer[validCount];
-//		System.arraycopy(icontainers, 0, containers, 0, validCount);
-//		return containers;
-//	}
-
-	public int getRuleGroup() {
-		return _ruleGroup;
-	}
-
-	/**
-	 * This method can be overriden by AWorkbenchHelpers, if they wish to perform some
-	 * initialization once the IProject is set. Default is to do nothing.
-	 * 
-	 * For example, if this IWorkbenchContext delegates to another IWorkbenchContext, then that
-	 * IWorkbenchContext's setProject() method should be called here.
-	 */
-	public void initialize() {
-		//do nothing
-	}
-
-	/**
-	 * Return true if the given resource is in an IJavaProject, and if it is in one of the source
-	 * folders in the IJavaProject. If the project's source folder happens to be the project's
-	 * output folder too, this method will return true. If res is null, or is not found in one of
-	 * the source containers, this method will return false.
-	 */
-//	public boolean isInJavaSourcePath(IResource res) {
-//		if (res == null) {
-//			return false;
-//		}
-//
-//		IContainer[] containers = getProjectSourceContainers(res.getProject());
-//		for (int c = 0; c < containers.length; c++) {
-//			IPath resourcePath = getContainerRelativePath(res, containers[c]);
-//			if (resourcePath != null) {
-//				// file has been found
-//				return true;
-//			}
-//		}
-//
-//		return false;
-//	}
-
-	/**
-	 * Return true if the given symbolic name is registered, and can be loaded by WorkbenchContext's
-	 * "loadModel" method. For further information, see the comment above WorkbenchContext's
-	 * "registerModel" method.
-	 */
-	public final boolean isRegistered(String symbolicName) {
-		if (symbolicName == null) {
-			return false;
-		}
-		return _modelRegistry.containsKey(symbolicName);
-	}
-
-	/**
-	 * Given a symbolic name, load the MOF model which is identified by that name.
-	 * 
-	 * For support of dynamic symbolic names, such as file names, read the comment above the
-	 * registerModel method.
-	 * 
-	 * @see registerModel
-	 */
-	public Object loadModel(String symbolicName) {
-		return loadModel(symbolicName, null);
-	}
-
-	/**
-	 * Given a symbolic name, load the MOF model which is identified by that name.
-	 * 
-	 * For support of dynamic symbolic names, such as file names, read the comment above the
-	 * registerModel method.
-	 * 
-	 * @see registerModel
-	 */
-	public Object loadModel(String symbolicName, Object[] parms) {
-		try {
-			Method loader = (Method) _modelRegistry.get(symbolicName);
-			if (loader == null) {
-				return null;
-			}
-
-			return loader.invoke(this, parms);
-		} catch (IllegalAccessException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("WorkbenchContext::loadModel(String, Object[])"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-			return null;
-		} catch (InvocationTargetException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("WorkbenchContext::loadModel(String, Object[])"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-
-				if (exc.getTargetException() != null) {
-					entry.setTargetException(exc.getTargetException());
-					logger.write(Level.SEVERE, exc);
-				}
-			}
-			return null;
-		} catch (NullPointerException exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("WorkbenchContext::loadModel(String, Object[])"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-			return null;
-		} catch (ExceptionInInitializerError exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("WorkbenchContext::loadModel(String, Object[])"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-			return null;
-		}
-	}
-
-	public Object loadRuleGroup() {
-		return new Integer(getRuleGroup()); // have to wrap the int in an Integer because can't cast
-		// an int to an Object
-	}
-
-	/**
-	 * This method should be used only by the validation framework. This method will be called by
-	 * ValidationOperation, before the IValidator's validate method is called, to set the group of
-	 * rules which the IValidator should check.
-	 */
-	public void setRuleGroup(int rg) {
-		_ruleGroup = rg;
-	}
-
-	/**
-	 * Register a load method for a symbolic name. A load method is defined as a method which takes
-	 * no parameters and returns a RefObject.
-	 * 
-	 * Every subclass of WorkbenchContext, for every static type of symbolic name which it supports,
-	 * should call registerModel. For IWorkbenchHelpers which support dynamic symbolic names, such
-	 * as file names, each IWorkbenchContext should override the "loadModel" method. Their
-	 * "loadModel" should first call this class' "isRegistered" method to see if they're dealing
-	 * with a static symbolic name, or a dynamic one. If the symbolic name is registered, the
-	 * child's "loadModel" method should just return the result of WorkbenchContext's "loadModel"
-	 * method. Otherwise, it should return the result based on its own processing.
-	 * 
-	 * When this method is called, the load method identified by loadMethodName is located & stored
-	 * for future retrieval by the "loadModel" method. When the IValidator calls "loadModel" with a
-	 * symbolic name, the java.lang.reflect.Method which was loaded by this method is invoked, and
-	 * the result (RefObject) returned by that method is returned by "loadModel".
-	 * 
-	 * symbolicName must not be null or the empty string. loadMethodName must not be null or the
-	 * empty string.
-	 */
-	protected final void registerModel(String symbolicName, String loadMethodName) {
-		registerModel(symbolicName, loadMethodName, null);
-	}
-
-	/**
-	 * Register a load method for a symbolic name. A load method is defined as a method which takes
-	 * no parameters and returns a RefObject.
-	 * 
-	 * Every subclass of WorkbenchContext, for every static type of symbolic name which it supports,
-	 * should call registerModel. For IWorkbenchHelpers which support dynamic symbolic names, such
-	 * as file names, each IWorkbenchContext should override the "loadModel" method. Their
-	 * "loadModel" should first call this class' "isRegistered" method to see if they're dealing
-	 * with a static symbolic name, or a dynamic one. If the symbolic name is registered, the
-	 * child's "loadModel" method should just return the result of WorkbenchContext's "loadModel"
-	 * method. Otherwise, it should return the result based on its own processing.
-	 * 
-	 * When this method is called, the load method identified by loadMethodName is located & stored
-	 * for future retrieval by the "loadModel" method. When the IValidator calls "loadModel" with a
-	 * symbolic name, the java.lang.reflect.Method which was loaded by this method is invoked, and
-	 * the result (RefObject) returned by that method is returned by "loadModel".
-	 * 
-	 * symbolicName must not be null or the empty string. loadMethodName must not be null or the
-	 * empty string.
-	 */
-	protected final void registerModel(String symbolicName, String loadMethodName, Class[] parms) {
-		Method method = getMethod(loadMethodName, parms);
-		if (method == null) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.FINE)) {
-				StringBuffer buffer = new StringBuffer("Load method "); //$NON-NLS-1$
-				buffer.append(loadMethodName);
-				buffer.append("("); //$NON-NLS-1$
-				for (int i = 0; (parms != null) && (i < parms.length); i++) {
-					buffer.append(parms[i]);
-				}
-				buffer.append(") must exist. " + getClass().getName() + " cannot support model " + symbolicName); //$NON-NLS-1$ //$NON-NLS-2$
-
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("ValidationRegistryReader.readExtension(IExtension)"); //$NON-NLS-1$
-				entry.setText(buffer.toString());
-				logger.write(Level.FINE, entry);
-			}
-		} else {
-			_modelRegistry.put(symbolicName, method);
-		}
-	}
-
-	/**
-	 * Whether full or incremental validation is running, this method will be called, for every
-	 * IResource which is filtered in by the IValidator, so that the IValidationContext can receive
-	 * notification that one of the resources, which validation will run on, is being filtered in.
-	 */
-	public void registerResource(IResource resource) {
-		// default: do nothing
-	}
-
-	/**
-	 * This method is called by the Validation Framework, to initialize the IWorkbenchContext so that
-	 * it can gather information from the current project.
-	 * 
-	 * If an IWorkbenchContext delegates some model loading to another IWorkbenchContext, this method
-	 * should be overriden so that the delegatee IWorkbenchContext is initialized with the IProject.
-	 */
-	public final void setProject(IProject project) {
-		_project = project;
-
-		if (project != null) {
-			// Project will be set back to null once the validation of the project is complete.
-			initialize();
-		}
-	}
-
-	/**
-	 * Notifies this IWorkbenchContext that the Validation Framework is shutting down. There will be
-	 * calls to closing(IProject) and possibly deleting(IProject) following this call, but the
-	 * resources may already be closed by the time that those methods are called, so EVERYTHING
-	 * should be cleaned up in this method. The parameter passed in is the project which is about to
-	 * shut down. This method will be called once for every IProject in the workbench. The IProject
-	 * may, or may not, be closed.
-	 */
-	public void shutdown() {
-		// Default is to assume that no resources were allocated; therefore,
-		// no cleanup needs to be done.
-		shutdown(getProject());
-	}
-
-	/**
-	 * Notifies this IWorkbenchContext that the Validation Framework is shutting down. There will be
-	 * calls to closing(IProject) and possibly deleting(IProject) following this call, but the
-	 * resources may already be closed by the time that those methods are called, so EVERYTHING
-	 * should be cleaned up in this method. The parameter passed in is the project which is about to
-	 * shut down. This method will be called once for every IProject in the workbench. The IProject
-	 * may, or may not, be closed.
-	 * 
-	 * @deprecated Override shutdown() instead, and use getProject()
-	 */
-	public void shutdown(IProject project) {
-		// Default is to assume that no resources were allocated; therefore,
-		// no cleanup needs to be done.
-	}
-
-	public String getTargetObjectName(Object object) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public String[] getURIs() {
-		String[] uris = new String[validationFileURIs.size()];
-		for(int i = 0; i < validationFileURIs.size(); i++) 
-			uris[i] = (String) validationFileURIs.get(i);
-		return uris;
-	}
-
-	/**
-	 * @return Returns the validationFileURIs.
-	 */
-	public List getValidationFileURIs() {
-		return validationFileURIs;
-	}
-
-	/**
-	 * @param validationFileURIs The validationFileURIs to set.
-	 */
-	public void setValidationFileURIs(List validationFileURIs) {
-		this.validationFileURIs = validationFileURIs;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/WorkbenchFileDelta.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/WorkbenchFileDelta.java
deleted file mode 100644
index 2871aff..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/WorkbenchFileDelta.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.operations;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.wst.validation.internal.core.FileDelta;
-import org.eclipse.wst.validation.internal.core.IFileDelta;
-
-
-/**
- * Eclipse-specific implementation of FileDelta which also caches the IResource which is associated
- * with the FileDelta.
- */
-public class WorkbenchFileDelta extends FileDelta {
-	private IResource _resource = null;
-	private Object _changedResource = null;
-
-	private static final String FILE_NAME = "FILE NAME:"; //$NON-NLS-1$
-	private static final String DELTA = "  DELTA: "; //$NON-NLS-1$
-	private static final String RESOURCE = "  RESOURCE: "; //$NON-NLS-1$
-	private static final String OBJECT = "  OBJECT: "; //$NON-NLS-1$
-
-	public WorkbenchFileDelta(String aFileName, int aFileDelta, IResource resource) {
-		super(aFileName, aFileDelta);
-		setResource(resource);
-		setObject(resource);
-	}
-
-	public WorkbenchFileDelta(Object changedResource) {
-		super(null, IFileDelta.CHANGED);
-		setObject(changedResource);
-	}
-
-	public IResource getResource() {
-		return _resource;
-	}
-
-	public void setResource(IResource resource) {
-		_resource = resource;
-	}
-
-	/**
-	 * If the changed resource is not an IResource (e.g., a RefObject), then the getFileName method
-	 * will return null, getResource will return null, and this method will return the object. If
-	 * the changedResource is an IResource, then both this method and the getResource method will
-	 * return the resource.
-	 */
-	public Object getObject() {
-		return _changedResource;
-	}
-
-	/**
-	 * @see getObject()
-	 */
-	public void setObject(Object o) {
-		_changedResource = o;
-	}
-
-	public String toString() {
-		StringBuffer buffer = new StringBuffer(FILE_NAME);
-		buffer.append(String.valueOf(getFileName()));
-		buffer.append(DELTA);
-		buffer.append(getDeltaType());
-		buffer.append(RESOURCE);
-		buffer.append(String.valueOf(getResource()));
-		buffer.append(OBJECT);
-		buffer.append(String.valueOf(getObject()));
-		return buffer.toString();
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/WorkbenchReporter.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/WorkbenchReporter.java
deleted file mode 100644
index 54127a9..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/WorkbenchReporter.java
+++ /dev/null
@@ -1,737 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.operations;
-
-import java.text.MessageFormat;
-import java.util.List;
-import java.util.logging.Level;
-
-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.IProgressMonitor;
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.validation.internal.ResourceConstants;
-import org.eclipse.wst.validation.internal.TaskListUtility;
-import org.eclipse.wst.validation.internal.ValidationRegistryReader;
-import org.eclipse.wst.validation.internal.ValidatorMetaData;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-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;
-import org.eclipse.wst.validation.internal.provisional.core.MessageLimitException;
-import org.eclipse.wst.validation.internal.ResourceHandler;
-
-/**
- * IValidator instances will interact with an instance of this class, but should never cast that
- * IReporter instance to WorkbenchReporter. The WorkbenchReporter class will be moved in Milestone
- * 4.
- * 
- * This class handles interaction between the user and the IValidator in the eclipse workbench
- * environment.
- * 
- * This class must not be called outside of an IWorkspaceRunnable or IRunnableWithProgress. Many
- * resource deltas can be generated by the methods in this class.
- * 
- * Only the validation framework may instantiate or alter instances of this class.
- */
-
-public final class WorkbenchReporter implements IReporter {
-	public static final String DEFAULT_LOCATION = ""; //$NON-NLS-1$
-	public static final int NO_MESSAGE_LIMIT = -1;
-
-	private IProject _project = null;
-	private IProgressMonitor _monitor = null;
-
-	public static void addMessage(IResource resource, Class messageOwner, IMessage message) {
-		addMessage(resource, messageOwner, null, message); // null ClassLoader = use the default
-		// (clazz.getClassLoader());
-	}
-	
-	public static void addMessage(IResource resource, Class messageOwner, ClassLoader cl, IMessage message) {
-		addMessage(resource, messageOwner, cl, message, null, ""); //$NON-NLS-1$
-	}
-	
-	public static void addMessage(IResource resource, Class clazz, IMessage message, String targetObjectName, String location) {
-		addMessage(resource, clazz, null, message, targetObjectName, location); // null = use the
-		// default
-		// ClassLoader
-		// (class.getClassLoader())
-	}
-	
-	public static void addMessage(IResource resource, Class clazz, IMessage message, String targetObjectName, String location,String markerId) {
-		addMessage(resource, clazz, null, message, targetObjectName, location,markerId); // null = use the
-		// default
-		// ClassLoader
-		// (class.getClassLoader())
-	}
-	
-	
-
-	public static void addMessage(IResource resource, Class clazz, ClassLoader cl, IMessage message, String targetObjectName, String location) {
-		if ((clazz == null) || (message == null) || (resource == null)) {
-			return;
-		}
-
-		if (cl == null) {
-			cl = clazz.getClassLoader();
-		}
-
-		addMessage(resource, getUniqueId(clazz), cl, message, targetObjectName, location);
-	}
-	
-	public static void addMessage(IResource resource, Class clazz, ClassLoader cl, IMessage message, String targetObjectName, String location, String markerId) {
-		if ((clazz == null) || (message == null) || (resource == null)) {
-			return;
-		}
-
-		if (cl == null) {
-			cl = clazz.getClassLoader();
-		}
-
-		addMessage(resource, getUniqueId(clazz), cl, message, targetObjectName, location, markerId);
-	}
-
-	public static void addMessage(IResource resource, String messageOwnerId, ClassLoader cl, IMessage message) {
-		addMessage(resource, messageOwnerId, cl, message, null, ""); //$NON-NLS-1$
-	}
-
-	public static void addMessage(IResource resource, String messageOwnerId, ClassLoader cl, IMessage message, String targetObjectName, String location) {
-		int severity = message.getSeverity();
-		try {
-			TaskListUtility.addTask(messageOwnerId, resource, location, message.getId(), message.getText(cl), severity,targetObjectName, message.getGroupName(), message.getOffset(), message.getLength());
-		} catch (CoreException exc) {
-			// Couldn't add the task to the task list for some reason...
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("WorkbenchReporter.addMessage(Class,, IResource, IMessage, String, String"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-		}
-	}
-	
-	public static void addMessage(IResource resource, String messageOwnerId, ClassLoader cl, IMessage message, String targetObjectName, String location, String markerId) {
-		int severity = message.getSeverity();
-		try {
-			TaskListUtility.addTask(messageOwnerId, resource, location, message.getId(), message.getText(cl), severity,markerId,targetObjectName, message.getGroupName(), message.getOffset(), message.getLength());
-			increaseMessageCountForProject(resource.getProject());;
-		} catch (CoreException exc) {
-			// Couldn't add the task to the task list for some reason...
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("WorkbenchReporter.addMessage(Class,, IResource, IMessage, String, String"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-		}
-	}
-	
-	private static void increaseMessageCountForProject(IProject project) {
-		ValidatorManager.initializeMessageLimitProjectMap(project);
-		Object integer = ValidatorManager.messageLimitProjectMap.get(project);
-		int newVal = ((Integer) integer).intValue() + 1;
-		ValidatorManager.messageLimitProjectMap.put(project,new Integer(newVal));
-	}
-
-	public static void removeAllMessages(IResource resource, IValidator validator) {
-		if (resource == null) {
-			return;
-		}
-
-		ValidatorMetaData vmd = ValidationRegistryReader.getReader().getValidatorMetaData(validator);
-		if (vmd == null) {
-			// log
-			return;
-		}
-
-		String[] validatorNames = vmd.getValidatorNames();
-		try {
-			TaskListUtility.removeAllTasks(resource, validatorNames);
-		} catch (CoreException exc) {
-			// Couldn't remove the task from the task list for some reason...
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("WorkbenchReporter.removeAllMessages(String[], IResource, String)"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-		}
-	}
-
-	/**
-	 * @deprecated Will be removed in Milestone 3. Should not be called outside of the validation
-	 *             framework.
-	 */
-	public static void removeAllMessages(IResource resource, IValidator validator, Object object) {
-		if (resource == null) {
-			return;
-		}
-
-		ValidatorMetaData vmd = ValidationRegistryReader.getReader().getValidatorMetaData(validator);
-		if (vmd == null) {
-			// log
-			return;
-		}
-
-		String[] validatorNames = vmd.getValidatorNames();
-		try {
-			String targetObjectName = getTargetObjectName(vmd.getHelper(resource.getProject()), object);
-			removeAllMessages(resource, validatorNames, targetObjectName);
-		} catch (InstantiationException exc) {
-			// Remove the vmd from the reader's list
-			ValidationRegistryReader.getReader().disableValidator(vmd);
-
-			// Log the reason for the disabled validator
-			final Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("WorkbenchReporter::removeAllMessages(IResource, IValidator, Object)"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-		}
-	}
-
-	public static void removeAllMessages(IResource resource, String[] validatorNames, String targetObjectName) {
-		try {
-			TaskListUtility.removeAllTasks(resource, validatorNames, targetObjectName);
-		} catch (CoreException exc) {
-			// Couldn't remove the task from the task list for some reason...
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("WorkbenchReporter.removeAllMessages(String[], IResource, String)"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-		}
-	}
-
-	public static void removeMessageSubset(IResource resource, Class messageOwner, String groupName) {
-		// Since the addMessage(Class, IMessage) is defaulted to the IProject,
-		// remove the message subsets from the IProject
-		removeMessageSubset(resource, new String[]{getUniqueId(messageOwner)}, null, groupName);
-	}
-
-	public static void removeMessageSubset(IResource resource, String messageOwnerId, String groupName) {
-		// Since the addMessage(Class, IMessage) is defaulted to the IProject,
-		// remove the message subsets from the IProject
-		removeMessageSubset(resource, new String[]{messageOwnerId}, null, groupName);
-	}
-
-	public static void removeMessageSubset(IResource resource, String[] ownerId, String targetObjectName, String groupName) {
-		try {
-			TaskListUtility.removeTaskSubset(resource, ownerId, targetObjectName, groupName);
-		} catch (CoreException exc) {
-			// Couldn't remove the task to the task list for some reason...
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("WorkbenchReporter.removeMessageSubset(String[], IResource, String, String)"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-		}
-	}
-
-	/**
-	 * Given a Class instance, return the id that uniquely identifies this instance. (Used as the
-	 * value for the message owner.)
-	 */
-	public static String getUniqueId(Class clazz) {
-		if (clazz == null) {
-			return ""; //$NON-NLS-1$
-		}
-
-		// It is safe to load this String into the constants space because
-		// the Class name will not change during WSAD's session.
-		return clazz.getName().intern();
-	}
-
-	public static String getUniqueId(IValidator validator) {
-		if (validator == null) {
-			return ""; //$NON-NLS-1$
-		}
-		return getUniqueId(validator.getClass());
-	}
-
-	public static Logger getMsgLogger(IValidator validator) {
-		ValidatorMetaData vmd = ValidationRegistryReader.getReader().getValidatorMetaData(validator);
-		if (vmd == null) {
-			return ValidationPlugin.getPlugin().getMsgLogger();
-		}
-
-		return vmd.getMsgLogger();
-	}
-
-	public static String getLocation(IWorkbenchContext helper, IMessage message) {
-		if (message == null) {
-			return getLocationText(helper, null);
-		}
-		int lineNo = message.getLineNumber();
-		if (lineNo == IMessage.LINENO_UNSET) {
-			return getLocationText(helper, message.getTargetObject());
-		}
-		return String.valueOf(lineNo);
-	}
-
-	public static String getLocationText(IWorkbenchContext helper, Object targetObject) {
-		String location = null;
-		try {
-			location = helper.getLocation(targetObject);
-		} catch (Throwable exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("WorkbenchReporter.getLocationText(Object)"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-		}
-		if ((location == null) || (location.trim().equals(""))) { //$NON-NLS-1$
-			location = DEFAULT_LOCATION;
-		}
-		return location;
-	}
-
-	/**
-	 * If the user is cancelling validation on the current project/resource, Add an information task
-	 * to the task list informing the user that validation has not been run on the current project.
-	 */
-	// TODO This method was made protected for the SaberReporter. Make this method private again
-	// once the framework supports IMarker.PRIORITY.
-	protected static void addTerminatedTask(IProject project, IValidator validator) throws IllegalArgumentException {
-		if ((project == null) || (validator == null)) {
-			return;
-		}
-		ValidatorManager.getManager().addMessageLimitExceeded(project);
-		ValidatorManager.setMessageLimitMessageForProject(project);
-	}
-
-	// TODO This method was made protected for the SaberReporter. Make this method private again
-	// once the framework supports IMarker.PRIORITY.
-	protected static String getTargetObjectName(IWorkbenchContext helper, IMessage message) {
-		if (message == null) {
-			return getTargetObjectName(helper, null);
-		}
-		return getTargetObjectName(helper, message.getTargetObject());
-	}
-
-	private static String getTargetObjectName(IWorkbenchContext helper, Object targetObject) {
-		String targetObjectName = null;
-		try {
-			targetObjectName = helper.getTargetObjectName(targetObject);
-		} catch (Throwable exc) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("WorkbenchReporter.getTargetObjectName(Object)"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-		}
-		return targetObjectName;
-	}
-
-	// TODO This method was made "protected" for the SaberReporter. Do not call this method! This
-	// method will be made private once support for marker PRIORITY attributes is in the framework.
-	protected static ValidatorMetaData getVMD(IValidator validator) throws IllegalArgumentException {
-		ValidatorMetaData vmd = ValidationRegistryReader.getReader().getValidatorMetaData(validator);
-		if (vmd == null) {
-			throw new IllegalArgumentException(); // already logged in the ValidationRegistryReader
-		}
-		return vmd;
-	}
-
-	/**
-	 * @deprecated. The IValidationContext will be ignored.
-	 */
-	public WorkbenchReporter(IWorkbenchContext helper, IProgressMonitor monitor, IProject project) {
-		this(project, monitor);
-	}
-
-	/**
-	 * An IReporter instance must exist for each Runnable in order for the validator to report
-	 * status messages. IProject and IProgressMonitor must not be null.
-	 */
-	public WorkbenchReporter(IProject project, IProgressMonitor monitor) {
-		super();
-		_project = project;
-		_monitor = monitor;
-	}
-
-	// TODO This method was made protected for the SaberReporter. Make it private again once the
-	// framework support IMarker.PRIORITY.
-	protected IWorkbenchContext getHelper(IValidator validator) throws InstantiationException, IllegalArgumentException {
-		ValidatorMetaData vmd = getVMD(validator);
-		IWorkbenchContext helper = vmd.getHelper(getProject());
-		return helper;
-	}
-	
-
-	public IProject getProject() {
-		return _project;
-	}
-
-	public IProgressMonitor getProgressMonitor() {
-		return _monitor;
-	}
-
-	/**
-	 * This method will never return null.
-	 */
-	private IResource getDefaultResource() {
-		IResource prj = getProject();
-		if (prj != null) {
-			return prj;
-		}
-		// return the workspace root
-		return ResourcesPlugin.getWorkspace().getRoot();
-	}
-
-	/**
-	 * When an IMessage is created, the user has the option of creating it with a target object.
-	 * That target object is used to identify which object has the problem identified by the
-	 * IMessage. This method, given the target object, returns the IResource which represents that
-	 * object in the workbench.
-	 */
-	public IResource getMessageResource(IValidator validator, Object object) {
-		if (validator == null) {
-			return null;
-		}
-
-		IResource resource = null;
-		if (object != null) {
-			if (object instanceof IResource) {
-				resource = (IResource) object;
-			} else if (object instanceof WorkbenchFileDelta) {
-				// resource may be null if the WorkbenchFileDelta was constructed from an Object
-				// instead of an IResource
-				resource = ((WorkbenchFileDelta) object).getResource();
-			}
-
-			if (resource == null) {
-				try {
-					IWorkbenchContext helper = getHelper(validator);
-					resource = helper.getResource(object);
-				} catch (InstantiationException exc) {
-					try {
-						// Unlikely that an exception will be thrown, because this method is
-						// invoked by the validator, and if the validator is invoked, it's likely
-						// that the helper has been loaded too.
-						ValidatorMetaData vmd = getVMD(validator);
-
-						// Remove the vmd from the reader's list
-						ValidationRegistryReader.getReader().disableValidator(vmd);
-
-						// Log the reason for the disabled validator
-						Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-						if (logger.isLoggingLevel(Level.SEVERE)) {
-							LogEntry entry = ValidationPlugin.getLogEntry();
-							entry.setSourceID("WorkbenchReporter::getMessageResource(IValidator, Object)"); //$NON-NLS-1$
-							entry.setTargetException(exc);
-							logger.write(Level.SEVERE, entry);
-						}
-					} catch (IllegalArgumentException exc2) {
-						// Even the IValidator is invalid. Unfortunately, can't disable the
-						// validator because it can't be found by the registry reader.
-						// Log the reason for the disabled validator
-						Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-						if (logger.isLoggingLevel(Level.SEVERE)) {
-							LogEntry entry = ValidationPlugin.getLogEntry();
-							entry.setSourceID("WorkbenchReporter::getMessageResource(IValidator, Object)"); //$NON-NLS-1$
-							entry.setTargetException(exc2);
-							logger.write(Level.SEVERE, entry);
-						}
-					}
-				} catch (IllegalArgumentException exc) {
-					// Even the IValidator is invalid. Unfortunately, can't disable the
-					// validator because it can't be found by the registry reader.
-					// Log the reason for the disabled validator
-					Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-					if (logger.isLoggingLevel(Level.SEVERE)) {
-						LogEntry entry = ValidationPlugin.getLogEntry();
-						entry.setSourceID("WorkbenchReporter::getMessageResource(IValidator, Object)"); //$NON-NLS-1$
-						entry.setTargetException(exc);
-						logger.write(Level.SEVERE, entry);
-					}
-				} catch (Throwable exc) {
-					Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-					if (logger.isLoggingLevel(Level.SEVERE)) {
-						LogEntry entry = ValidationPlugin.getLogEntry();
-						entry.setSourceID("WorkbenchReporter.getMessageResource(IValidator, Object)"); //$NON-NLS-1$
-						entry.setTargetException(exc);
-						logger.write(Level.SEVERE, entry);
-					}
-				}
-			}
-		}
-
-		if (resource == null) {
-			resource = getDefaultResource();
-		}
-
-		if (!resource.exists()) {
-			resource = getDefaultResource();
-		}
-
-		return resource;
-	}
-
-	/**
-	 * Show a message to the user indicating which subtask is currently being processed. <br>
-	 * <br>
-	 * <code>message</code> may not be null or the empty string (""). <br>
-	 */
-	public void displaySubtask(String message) {
-		if ((message == null) || (message.equals(""))) { //$NON-NLS-1$
-			return;
-		}
-
-		if (getProgressMonitor() != null) {
-			getProgressMonitor().subTask(message);
-		} else {
-			System.out.println(message);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.wst.validation.internal.provisional.core.core.IReporter#getMessages()
-	 */
-	public List getMessages() {
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.wst.validation.internal.provisional.core.core.IReporter#isCancelled()
-	 */
-	public boolean isCancelled() {
-		if (getProgressMonitor() != null) {
-			return getProgressMonitor().isCanceled();
-		}
-		return false;
-	}
-
-	/**
-	 * @see org.eclipse.wst.validation.internal.provisional.core.core.IReporter#addMessage(IValidator, IMessage)
-	 */
-	public void addMessage(IValidator validator, IMessage message) throws MessageLimitException {
-		IResource resource = getMessageResource(validator, message.getTargetObject());
-		IWorkbenchContext helper = null;
-		ValidatorMetaData vmd = getVMD(validator);
-		try {
-			helper = getHelper(validator);
-		} catch (InstantiationException exc) {
-			try {
-				// Unlikely that an exception will be thrown, because this method is
-				// invoked by the validator, and if the validator is invoked, it's likely
-				// that the helper has been loaded too
-				
-				
-				// Remove the vmd from the reader's list
-				ValidationRegistryReader.getReader().disableValidator(vmd);
-
-				// Log the reason for the disabled validator
-				Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-				if (logger.isLoggingLevel(Level.SEVERE)) {
-					LogEntry entry = ValidationPlugin.getLogEntry();
-					entry.setSourceID("WorkbenchReporter::addMessage(IValidator, IMessage)"); //$NON-NLS-1$
-					entry.setTargetException(exc);
-					logger.write(Level.SEVERE, entry);
-				}
-				return;
-			} catch (IllegalArgumentException exc2) {
-				logDisabledValidator(exc2);
-				return;
-			}
-		} catch (IllegalArgumentException exc) {
-			logDisabledValidator(exc);
-			return;
-		}
-
-		if (resource == null) {
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.FINE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("WorkbenchReporter.addMessage(IValidator, Message)"); //$NON-NLS-1$
-				entry.setMessageTypeIdentifier(ResourceConstants.VBF_EXC_INVALID_RESOURCE);
-				String result = MessageFormat.format(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_INVALID_RESOURCE), new String[]{message.getText(), getTargetObjectName(helper, message)});
-				entry.setText(result);				
-				//entry.setTokens(new String[]{message.getText(), getTargetObjectName(helper, message)});
-				logger.write(Level.FINE, entry);
-			}
-			return;
-		}
-
-		ValidatorManager mgr = ValidatorManager.getManager();
-		if (mgr.isMessageLimitExceeded(resource.getProject())) {
-			try{
-				validateMessageLimitExceeded(validator, resource);
-			}catch(MessageLimitException e){
-				//do nothing here, a message is already logged by now 
-			}
-		}
-
-		addMessage(resource, validator.getClass(), message, getTargetObjectName(helper, message), getLocation(helper, message),vmd.getMarkerId());
-	}
-
-	/**
-	 * @param exc
-	 */
-	private void logDisabledValidator(IllegalArgumentException exc) {
-		// Even the IValidator is invalid. Unfortunately, can't disable the
-		// validator because it can't be found by the registry reader.
-		// Log the reason for the disabled validator
-		Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-		if (logger.isLoggingLevel(Level.SEVERE)) {
-			LogEntry entry = ValidationPlugin.getLogEntry();
-			entry.setSourceID("WorkbenchReporter::addMessage(IValidator, IMessage)"); //$NON-NLS-1$
-			entry.setTargetException(exc);
-			logger.write(Level.SEVERE, entry);
-		}
-		return;
-	}
-
-	/**
-	 * @param validator
-	 * @param resource
-	 */
-	private void validateMessageLimitExceeded(IValidator validator, IResource resource) {
-		try {
-			addTerminatedTask(resource.getProject(), validator);
-		} catch (IllegalArgumentException exc) {
-			// Even the IValidator is invalid. Unfortunately, can't disable the
-			// validator because it can't be found by the registry reader.
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("WorkbenchReporter::addMessage(IValidator, IMessage)"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-		}
-		throw new MessageLimitException();
-	}
-
-	/**
-	 * @see org.eclipse.wst.validation.internal.provisional.core.core.IReporter#displaySubtask(IValidator, IMessage)
-	 */
-	public void displaySubtask(IValidator validator, IMessage message) {
-		if ((message == null) || (message.equals(""))) { //$NON-NLS-1$
-			return;
-		}
-
-		displaySubtask(message.getText(validator.getClass().getClassLoader()));
-	}
-
-	/**
-	 * @see org.eclipse.wst.validation.internal.provisional.core.core.IReporter#removeAllMessages(IValidator)
-	 */
-	public void removeAllMessages(IValidator validator) {
-		if (validator == null) { // getHelper could be null if the user cancelled before something
-			// was fully initialized
-			return;
-		}
-
-		removeAllMessages(validator, null);
-	}
-
-	/**
-	 * @see org.eclipse.wst.validation.internal.provisional.core.core.IReporter#removeAllMessages(IValidator, Object)
-	 */
-	public void removeAllMessages(IValidator validator, Object object) {
-		IResource resource = getMessageResource(validator, object);
-		if (resource == null) {
-			return;
-		}
-
-		ValidatorMetaData vmd = ValidationRegistryReader.getReader().getValidatorMetaData(validator);
-		if (vmd == null) {
-			return;
-		}
-
-		IWorkbenchContext helper = null;
-		try {
-			helper = vmd.getHelper(resource.getProject());
-		} catch (InstantiationException exc) {
-			// Unlikely that an exception will be thrown, because this method is
-			// invoked by the validator, and if the validator is invoked, it's likely
-			// that the helper has been loaded too.
-
-			// Remove the vmd from the reader's list
-			ValidationRegistryReader.getReader().disableValidator(vmd);
-
-			// Log the reason for the disabled validator
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("WorkbenchReporter::removeAllMessages(IResource, IValidator, Object)"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-
-			return;
-		}
-
-		String[] validatorNames = vmd.getValidatorNames();
-		String targetObjectName = getTargetObjectName(helper, object);
-		removeAllMessages(resource, validatorNames, targetObjectName);
-	}
-
-	/**
-	 * @see org.eclipse.wst.validation.internal.provisional.core.core.IReporter#removeMessageSubset(IValidator, Object, String)
-	 */
-	public void removeMessageSubset(IValidator validator, Object obj, String groupName) {
-		IResource resource = getMessageResource(validator, obj);
-		if (resource == null) {
-			return;
-		}
-
-		ValidatorMetaData vmd = ValidationRegistryReader.getReader().getValidatorMetaData(validator);
-		if (vmd == null) {
-			return;
-		}
-
-
-		IWorkbenchContext helper = null;
-		try {
-			helper = vmd.getHelper(resource.getProject());
-		} catch (InstantiationException exc) {
-			// Unlikely that an exception will be thrown, because this method is
-			// invoked by the validator, and if the validator is invoked, it's likely
-			// that the helper has been loaded too.
-
-			// Remove the vmd from the reader's list
-			ValidationRegistryReader.getReader().disableValidator(vmd);
-
-			// Log the reason for the disabled validator
-			Logger logger = ValidationPlugin.getPlugin().getMsgLogger();
-			if (logger.isLoggingLevel(Level.SEVERE)) {
-				LogEntry entry = ValidationPlugin.getLogEntry();
-				entry.setSourceID("WorkbenchReporter::removeAllMessages(IResource, IValidator, Object)"); //$NON-NLS-1$
-				entry.setTargetException(exc);
-				logger.write(Level.SEVERE, entry);
-			}
-
-			return;
-		}
-
-		String[] validatorNames = vmd.getValidatorNames();
-		String targetObjectName = getTargetObjectName(helper, obj);
-		removeMessageSubset(resource, validatorNames, targetObjectName, groupName);
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/plugin/ValidationHelperRegistryReader.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/plugin/ValidationHelperRegistryReader.java
deleted file mode 100644
index eef9e53..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/plugin/ValidationHelperRegistryReader.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.plugin;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jem.util.RegistryReader;
-import org.eclipse.wst.validation.internal.IProjectValidationHelper;
-
-public class ValidationHelperRegistryReader extends RegistryReader {
-
-	public static final String VALIDATION_HELPER = "validationHelper"; //$NON-NLS-1$
-	static final String ATT_ID = "id"; //$NON-NLS-1$ 
-	static final String ATT_HELPER_CLASS = "helperClass"; //$NON-NLS-1$
-	private static ValidationHelperRegistryReader INSTANCE = null;
-	private List validationHelpers = null;
-	
-	/**
-	 * Default constructor
-	 */
-	public ValidationHelperRegistryReader() {
-		super(ValidationPlugin.PLUGIN_ID, VALIDATION_HELPER);
-	}
-	
-	public static ValidationHelperRegistryReader getInstance() {
-		if (INSTANCE == null) {
-			INSTANCE = new ValidationHelperRegistryReader();
-			INSTANCE.readRegistry();
-		}
-		return INSTANCE;
-	}
-	
-	private List getValidationHelpers() {
-		if (validationHelpers == null)
-			validationHelpers = new ArrayList();
-		return validationHelpers;
-	}
-
-	public boolean readElement(IConfigurationElement element) {
-		if (!element.getName().equals(VALIDATION_HELPER))
-			return false;
-		IProjectValidationHelper helper = null;
-		try {
-			helper = (IProjectValidationHelper) element.createExecutableExtension(ATT_HELPER_CLASS);
-			getValidationHelpers().add(helper);
-			return true;
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-		return false;
-	}
-	
-	public IProjectValidationHelper getValidationHelper() {
-		if (getValidationHelpers().isEmpty())
-			return null;
-		return (IProjectValidationHelper) getValidationHelpers().get(0);
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/plugin/ValidationPlugin.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/plugin/ValidationPlugin.java
deleted file mode 100644
index 12170c2..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/plugin/ValidationPlugin.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.plugin;
-
-import java.util.Locale;
-
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.wst.common.frameworks.internal.WTPPlugin;
-import org.eclipse.wst.validation.internal.EventManager;
-import org.eclipse.wst.validation.internal.TimeEntry;
-import org.eclipse.wst.validation.internal.core.Message;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-
-public class ValidationPlugin extends WTPPlugin {
-	public static final String VALIDATION_PROP_FILE_NAME = "validate_base"; //$NON-NLS-1$
-	public static final String PLUGIN_ID = "org.eclipse.wst.validation"; //$NON-NLS-1$
-	private static ValidationPlugin _plugin = null;
-	private static TimeEntry _tEntry = null;
-	private static LogEntry _entry = null;
-	private static Message _message = null;
-	public static final String VALIDATION_BUILDER_ID = PLUGIN_ID + ".validationbuilder"; //$NON-NLS-1$// plugin id of the validation builder
-	public static final String VALIDATOR_EXT_PT_ID = "validator"; //$NON-NLS-1$// extension point declaration of the validator 
-
-	/**
-	 * ValidationPlugin constructor comment.
-	 * 
-	 * @param descriptor
-	 *            org.eclipse.core.runtime.IPluginDescriptor
-	 */
-	public ValidationPlugin() {
-		super();
-		if (_plugin == null) {
-			_plugin = this;
-			//Commenting off the following lines the Plugin is not activated and the
-			//getMsgLogger tries to access the Plugin and the plugin is in a active pending state.
-			//getMsgLogger();
-			//logger.log(Level.CONFIG, null);
-
-		}
-	}
-
-	public static String getBundleName() {
-		return VALIDATION_PROP_FILE_NAME;
-	}
-
-	public static LogEntry getLogEntry() {
-		if (_entry == null) {
-			_entry = new LogEntry(VALIDATION_PROP_FILE_NAME);
-		} else {
-			_entry.reset();
-		}
-		// Always set the log entry's Locale before you use it
-		// because the user can reset it on the fly.
-		_entry.setLocaleOfOrigin(Locale.getDefault().toString());
-		return _entry;
-	}
-
-	public static TimeEntry getTimeEntry() {
-		if (_tEntry == null) {
-			_tEntry = new TimeEntry();
-		}
-		_tEntry.reset();
-		return _tEntry;
-	}
-
-	public static Message getMessage() {
-		if (_message == null) {
-			_message = new Message();
-			_message.setBundleName(getBundleName());
-		}
-		// clear the message for reuse
-		_message.setId(null);
-		_message.setParams(null);
-		_message.setTargetObject(null);
-		_message.setGroupName(null);
-		_message.setSeverity(IMessage.LOW_SEVERITY);
-		return _message;
-	}
-
-	/**
-	 * Retrieves a hashtable of a logger's preferences initially from the
-	 * com.ibm.etools.logging.util.loggingDefaults extension point if specified in the
-	 * com.ibm.etools.logging.util plugin.xml file. If specified, the
-	 * com.ibm.etools.logging.util.loggingOptions extension point preferences in the parameter
-	 * plugin's plugin.xml file are returned.
-	 * 
-	 * The logger's preferences are stored in the return hashtable using the static instance
-	 * variables in LoggerStateHashKeys as keys.
-	 * 
-	 * @param plugin
-	 *            the Plugin polled for their logger's preferences in the plugin.xml file
-	 * @return hashtable of a logger's preferences
-	 */
-	/*
-	 * public Hashtable getMsgLoggerConfig(Plugin plugin) { return (new
-	 * PluginHelperImpl().getMsgLoggerConfig(plugin));
-	 */
-	public static ValidationPlugin getPlugin() {
-		return _plugin;
-	}
-
-	/**
-	 * Sets the logger's preferences based on values in the parameter hashtable.
-	 * 
-	 * The logger's preferences are stored in the parameter hashtable using the static instance
-	 * variables in LoggerStateHashKeys as keys.
-	 * 
-	 * @param msgLoggerConfig
-	 *            hashtable of the logger's preferences
-	 */
-	/*
-	 * public void setMsgLoggerConfig(Hashtable msgLoggerConfig) {
-	 * getMsgLogger().setMsgLoggerConfig(msgLoggerConfig); }
-	 */
-	public static boolean isActivated() {
-		Bundle bundle = Platform.getBundle(PLUGIN_ID);
-		if (bundle != null)
-			return bundle.getState() == Bundle.ACTIVE;
-		return false;
-	}
-
-	/**
-	 * @see Plugin#startup()
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		ResourcesPlugin.getWorkspace().addResourceChangeListener(EventManager.getManager(), IResourceChangeEvent.PRE_CLOSE | IResourceChangeEvent.PRE_DELETE | IResourceChangeEvent.POST_BUILD | IResourceChangeEvent.PRE_BUILD | IResourceChangeEvent.POST_CHANGE);
-	}
-
-	/**
-	 * @see org.eclipse.core.runtime.Plugin#stop(BundleContext context)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		EventManager.getManager().shutdown();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.WTPPlugin#getPluginID()
-	 */
-	public String getPluginID() {
-		return PLUGIN_ID;
-	}
-	
-	
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/provisional/ValidationFactory.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/provisional/ValidationFactory.java
deleted file mode 100644
index caa4614..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/provisional/ValidationFactory.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.provisional;
-
-import org.eclipse.wst.validation.internal.ValidationFactoryImpl;
-import org.eclipse.wst.validation.internal.provisional.core.IValidator;
-
-/**
- * This interface provides a way to access an instance of the ValidationFactoryImpl
- * instance, an internal implementation that provides access to some of the internal state
- * of validators.
- * 
- * @plannedfor 1.0
- * 
- * [issue: LM - 2 issues.
- *  1. I don't think the name 'factory' provides a good description of 
- *     this interface. Unless I'm mistaken the ValidationFactory doesn't
- *     actually create validators but simply returns existing validators.
- *     Looking at the implementation this is currently the case. I suggest
- *     renaming this to ValidatorRegistry or something similar.
- *  2. I think the common way for creating a factory is to create a class
- *     with a static method such as getFactory. If this is to be a factory
- *     it should probably be structured as per the convention.]
- */
-public interface ValidationFactory {
-	
-	ValidationFactory instance = ValidationFactoryImpl.getInstance();
-	/**
-	 * This api returns the IValidator given the validatorUniqueName id. The unique
-	 * id name is the class name that is defined in the class name element in the 
-	 * plugin extension of the validator.
-	 * @param validatorUniqueId
-	 * @return IValidator
-	 * @plannedfor WTP 1.0
-	 */
-	public IValidator getValidator(String validatorUniqueId) throws InstantiationException;
-
-}
diff --git a/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/core/FileDelta.java b/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/core/FileDelta.java
deleted file mode 100644
index a0229a5..0000000
--- a/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/core/FileDelta.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.core;
-
-
-
-/**
- * <p>
- * Default implementation of the IFileDelta
- * </p>
- * 
- * @see org.eclipse.wst.validation.internal.core.IFileDelta
- * 
- *  [issue: CS - is there a reason that we need to expose this impl class as an API?
- *   It would seem better to only expose IFileDelta.  I can't think of a reason where 
- *   a typical client would need to create one of these.]
- */
-public class FileDelta implements IFileDelta {
-	private int fileDelta = 0;
-	private String fileName = null;
-
-	/**
-	 * <p>
-	 * Creates a default instance of the FileDelta
-	 * </p>
-	 */
-	public FileDelta() {
-		super();
-	}
-	
-	/**
-	 * <p>
-	 * Constructor is used to initialize the fields. 
-	 * </p>
-	 * 
-	 * @param aFileName specifies the file name
-	 * @param aFileDelta specifies the 
-	 */
-	public FileDelta(String aFileName, int aFileDelta) {
-		fileName = aFileName;
-		fileDelta = aFileDelta;
-	}
-
-	/**
-	 * @see IFileDelta#getDeltaType()
-	 */
-	public int getDeltaType() {
-		return fileDelta;
-	}
-
-	/**
-	 * @see IFileDelta#getFileName()
-	 */
-	public String getFileName() {
-		return fileName;
-	}
-
-	/**
-	 * <p>
-	 * Set the flag which indicates the type of change that the file 
-	 * has undergone.
-	 * </p>
-	 */
-	public void setDeltaType(int deltaType) {
-		fileDelta = deltaType;
-	}
-
-	/**
-	 * <p>
-	 * Set the name of the file which has changed.
-	 * </p>
-	 */
-	public void setFileName(String aFileName) {
-		fileName = aFileName;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/core/IFileDelta.java b/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/core/IFileDelta.java
deleted file mode 100644
index 170a74b..0000000
--- a/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/core/IFileDelta.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.core;
-
-/**
- * <p>
- * This interface is used, for incremental validation, to encapsulate the change 
- * status of a resource. IFileDelta contains the name of the file which has 
- * changed, and a flag which indicates the type of change which has occurred.
- * 
- * @plannedfor 1.0
- * </p>
- * [issue: LM - From speaking with Vijay the name IFileDelta doesn't really capture
- *  what this interface is for. Validation may occur of files, it may occur on resources,
- *  or it may occur on something more abstract simply known as an artifact. The delta part
- *  of the name also seems misleading as this interface doesn't provide the delta but
- *  rather provides the type of change. I suggest renaming this interface to IModifiedArtifact
- *  or something along those lines to better capture its use. ]
- */
-public interface IFileDelta {
-	public static final int ADDED = 1;   // the file has been added
-	public static final int CHANGED = 2; // the file has been changed
-	public static final int DELETED = 3; // the file has been deleted
-
-	/**
-	 * <p>
-	 * Returns the flag which indicates the type of change which has occurred:
-	 * IFileDelta.ADDED, IFileDelta.CHANGED, or IFileDelta.DELETED.
-	 * </p>
-	 * @return returns the delta type.
-	 * @plannedfor WTP 1.0
-	 * 
-	 * [issue: LM - From my experience a validator simply needs to know what artifact needs
-	 *  to be validated. Can you provide a use case where the type of change is needed for
-	 *  validation? ]
-	 */
-	public int getDeltaType();
-
-	/**
-	 * <p>
-	 * Returns the name of the eclipse resource file which has changed. The return value must not be 
-	 * null or the empty string ("").
-	 * </p>
-	 * @return returns the file name.
-	 * @plannedfor WTP 1.0
-	 * 
-	 * [issue: LM - Following my comments above this method should be renamed to getArtifactName or
-	 *  something that follows along with the interface rename. ]
-	 */
-	public String getFileName();
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/core/IMessageAccess.java b/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/core/IMessageAccess.java
deleted file mode 100644
index 88d6eca..0000000
--- a/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/core/IMessageAccess.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.core;
-
-
-import java.util.List;
-import java.util.Locale;
-
-
-/**
- * <p>
- * Interface which can be used to access messages which are stored within a reporter which retains
- * its message history.
- * </p>
- * 
- * [issue: CS - This interface seems like overkill.  I'd think that an IReport should simply have a getMessages() method.
- * I think MessageFiltering should take place at the 'display' level and not at this level of the API.]
- */
-public interface IMessageAccess {
-	/**
-	 * @param filter
-	 *            A filter which specifies a subset of messages to retrieve. null specifies, "all
-	 *            messages".
-	 * @return List list of messages related to the target object
-	 */
-	public abstract List getMessages(MessageFilter filter);
-
-	/**
-	 * @param filter
-	 *            A filter which specifies a subset of messages to retrieve. null specifies, "all
-	 *            messages".
-	 * @param locale
-	 *            The target local to translate the messages into. null specifies, "use default
-	 *            locale".
-	 * @return List a list of messages related to the target object, translated into the specified
-	 * locale.
-	 */
-	public abstract List getMessagesAsText(MessageFilter filter, Locale targetLocale);
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/core/Message.java b/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/core/Message.java
deleted file mode 100644
index f54b8db..0000000
--- a/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/core/Message.java
+++ /dev/null
@@ -1,373 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.core;
-
-
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-
-/**
- * <p>
- * Default implementation of the IMessage interface, provided for the convenience of the
- * IValidators. If an IValidator needs to run in both AAT and WSAD then this IMessage implementation
- * should be used; if the IValidator runs in WSAD alone, the WSAD LocalizedMessage may be used in
- * place of this implementation.
- * <p>
- * @see org.eclipse.wst.validation.internal.provisional.core.IMessage
- * 
- * [issue: CS - I'd suggest splitting this class into Message and BundleMessage (where the latter inherits
- * from the former.  We have many messages that come (from xerces) pretranslated and don't require 'bundle'
- * related fields and methods. Splitting this class would make it easier to understand where bundle related
- * function is coming into play. Below I've listed out what would go into BundleMessage to demonstrate how 
- * we can simplify the 'Message' class by factoring out the bundle related details.
- * 
- * Message
- *	private Object targetObject = null;
- *	private String groupName = null;
- *	private int lineNumber = IMessage.LINENO_UNSET;
- *	private int length = IMessage.OFFSET_UNSET;
- *	private int offset = IMessage.OFFSET_UNSET;
- *
- *    
- * BundleMessage
- *	private String id = null;
- *	private String[] params = null;
- *	private String bundleName = null;
- *   
- *   - getId()
- *   - getBundle(...)
- *   - getBundleName()
- *   - getParams()
- *   - getText(Locale)
- *   - getText(ClassLoader)
- *   - getText(Locale, ClassLoader)
- *   - setId(String)
- *   - setBundleName(String)
- *   - setParams(String[])
- * ]
- */
-public class Message implements IMessage {
-	private String id = null;
-	private String[] params = null;
-	private int severity = MessageFilter.ANY_SEVERITY;
-	private Object targetObject = null;
-	private String bundleName = null;
-	private String groupName = null;
-	private int lineNumber = IMessage.LINENO_UNSET;
-	private int length = IMessage.OFFSET_UNSET;
-	private int offset = IMessage.OFFSET_UNSET;
-	private HashMap messageAttributes;
-
-	/**
-	 * <p>
-	 * Creates a default instance of the Message
-	 * </p>
-	 */
-	public Message() {
-		super();
-	}
-
-	/**
-	 * <p>
-	 * Creates a Message object with bundle name, severity and a unique id
-	 * </p>
-	 * 
-	 * @param aBundleName 
-	 * 			Must not be null or the empty string (""). 
-	 * @param aSeverity 
-	 * 			Must be one of the severities specified in IMessage. 
-	 * @param anId 
-	 * 			Must not be null or the empty string ("").
-	 */
-	public Message(String aBundleName, int aSeverity, String anId) {
-		this(aBundleName, aSeverity, anId, null, null);
-	}
-
-	/**
-	 * <p>
-	 * Creates a Message object with bundle name, severity, a unique id, and 
-	 * a list of parameters. 
-	 * </p>
-	 * 
-	 * @param aBundleName 
-	 * 			Must not be null or the empty string (""). 
-	 * @param aSeverity 
-	 * 			Must be one of the severities specified in IMessage.
-	 * @param anId 
-	 * 			Must not be null or the empty string ("").
-	 * @param aParams 
-	 * 			May be null, if there are no parameters in the message.
-	 */
-	public Message(String aBundleName, int aSeverity, String anId, String[] aParams) {
-		this(aBundleName, aSeverity, anId, aParams, null);
-	}
-	
-	/**
-	 * <p>
-	 * Creates a Message object with bundle name, severity, a unique id, and 
-	 * a list of parameters and the target object.
-	 * </p>
-	 * 
-	 * @param aBundleName 
-	 * 			Must not be null or the empty string (""). 
-	 * @param aSeverity 
-	 * 			Must be one of the severities specified in IMessage.
-	 * @param anId 
-	 * 			Must not be null or the empty string ("").
-	 * @param aParams 
-	 * 			May be null, if there are no parameters in the message.
-	 * @param targetObject 
-	 * 			May be null, if the message does not pertain to a particular 
-	 * 			object.
-	 */
-	public Message(String aBundleName, int aSeverity, String anId, String[] aParams, Object aTargetObject) {
-		bundleName = aBundleName;
-		severity = aSeverity;
-		id = anId;
-		params = aParams;
-		targetObject = aTargetObject;
-	}
-	
-	public Message(String aBundleName, int aSeverity, String anId, String[] aParams, Object aTargetObject, String aGroupName) {
-		bundleName = aBundleName;
-		severity = aSeverity;
-		id = anId;
-		params = aParams;
-		targetObject = aTargetObject;
-		groupName = aGroupName;
-	}
-
-	/**
-	 * @return the resource bundle which contains the messages, as identified by
-	 * 
-	 * @link #getBundleName()
-	 */
-	public ResourceBundle getBundle(Locale locale, ClassLoader classLoader) {
-		ResourceBundle bundle = null;
-		try {
-			if (classLoader == null) {
-				bundle = ResourceBundle.getBundle(getBundleName(), locale);
-			} else {
-				bundle = ResourceBundle.getBundle(getBundleName(), locale, classLoader);
-			}
-		} catch (MissingResourceException e) {
-			e.printStackTrace();
-		}
-		return bundle;
-	}
-
-	/**
-	 * @see IMessage#getBundleName()
-	 */
-	public String getBundleName() {
-		return bundleName;
-	}
-
-	/**
-	 * @see IMessage#getGroupName()
-	 */
-	public String getGroupName() {
-		return groupName;
-	}
-
-	/**
-	 * @see IMessage#getId()
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * @see IMessage#getLength()
-	 */
-	public int getLength() {
-		return length;
-	}
-
-	/**
-	 * @see IMessage#getLineNumber()
-	 */
-	public int getLineNumber() {
-		return lineNumber;
-	}
-
-	/**
-	 * @see IMessage#getOffset()
-	 */
-	public int getOffset() {
-		return offset;
-	}
-
-	/**
-	 * @see IMessage#getParams()
-	 */
-	public String[] getParams() {
-		return params;
-	}
-
-	/**
-	 * @see IMessage#getSeverity()
-	 */
-	public int getSeverity() {
-		return severity;
-	}
-
-	/**
-	 * @see IMessage#getTargetObject()
-	 */
-	public Object getTargetObject() {
-		return targetObject;
-	}
-
-	/**
-	 * @see IMessage#getText()
-	 */
-	public String getText() {
-		return getText(Locale.getDefault(), null);
-	}
-
-	/**
-	 * @see IMessage#getText(ClassLoader)
-	 */
-	public String getText(ClassLoader classLoader) {
-		return getText(Locale.getDefault(), classLoader);
-	}
-
-	/**
-	 * @see IMessage#getText(Locale)
-	 */
-	public String getText(Locale locale) {
-		return getText(locale, null);
-	}
-
-	/**
-	 * @see IMessage#getText(Locale, ClassLoader)
-	 */
-	public java.lang.String getText(Locale locale, ClassLoader classLoader) {
-		String message = ""; //$NON-NLS-1$
-
-		if (locale == null) {
-			return message;
-		}
-
-		ResourceBundle bundle = getBundle(locale, classLoader);
-		if (bundle == null) {
-			return message;
-		}
-
-		try {
-			message = bundle.getString(getId());
-
-			if (getParams() != null) {
-				message = java.text.MessageFormat.format(message, getParams());
-			}
-		} catch (MissingResourceException exc) {
-			System.err.println(exc.getMessage());
-			System.err.println(getId());
-		} catch (NullPointerException exc) {
-			System.err.println(exc.getMessage());
-			System.err.println(getId());
-		}
-
-		return message;
-	}
-
-	/**
-	 * @see IMessage#setBundleName(String)
-	 */
-	public void setBundleName(String aBundleName) {
-		bundleName = aBundleName;
-	}
-
-	/**
-	 * @see IMessage#setGroupName(String)
-	 */
-	public void setGroupName(String name) {
-		groupName = name;
-	}
-
-	/**
-	 * @see IMessage#setId(String)
-	 */
-	public void setId(String newId) {
-		id = newId;
-	}
-
-	/**
-	 * @see IMessage#setLength(int)
-	 */
-	public void setLength(int length) {
-		if (length < 0) {
-			length = IMessage.OFFSET_UNSET;
-		}
-		this.length = length;
-	}
-
-	/**
-	 * @see IMessage#setLineNo(int)
-	 */
-	public void setLineNo(int lineNumber) {
-		if (lineNumber < 0) {
-			this.lineNumber = IMessage.LINENO_UNSET;
-		} else {
-			this.lineNumber = lineNumber;
-		}
-	}
-
-	/**
-	 * @see IMessage#setOffset(int)
-	 */
-	public void setOffset(int offset) {
-		if (offset < 0) {
-			offset = IMessage.OFFSET_UNSET;
-		}
-		this.offset = offset;
-	}
-
-	/**
-	 * @see IMessage#setParams(String[])
-	 */
-	public void setParams(String[] newParams) {
-		params = newParams;
-	}
-
-	/**
-	 * @see IMessage#setSeverity(int)
-	 */
-	public void setSeverity(int newSeverity) {
-		severity = newSeverity;
-	}
-
-	/**
-	 * @see IMessage#setTargetObject(Object)
-	 */
-	public void setTargetObject(Object obj) {
-		targetObject = obj;
-	}
-
-	public Object getAttribute(String attributeName) {
-		if(messageAttributes != null) {
-			return messageAttributes.get(attributeName);
-		}
-		return null;
-	}
-
-	public void setAttribute(String attributeName, Object value) {
-		if(messageAttributes == null) {
-			messageAttributes = new HashMap();
-		}
-		messageAttributes.put(attributeName,value);
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/core/MessageFilter.java b/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/core/MessageFilter.java
deleted file mode 100644
index a380061..0000000
--- a/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/core/MessageFilter.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.core;
-
-import org.eclipse.wst.validation.internal.provisional.core.IValidator;
-
-
-/**
- * <p>
- * Encapsulates common message filtering parameters. Message Filters are used when retrieving
- * messages via an IMessageAccess. The filter encapsulates a simple set of typical filter criteria
- * which is used to select a subset of messages to retrieve. If multiple attributes of the message
- * filter are specified, they should be logically AND'd together by the MessageAccess
- * implementation.
- * </p>
- */
-public class MessageFilter {
-	public static final int ANY_SEVERITY = -1;
-
-	/**
-	 * <p>
-	 * Messages matching this severity(s) will be retrieved. One of SeverityEnum XXX_severity
-	 * constants, or ANY_SEVERITY to specify that messages of any severity will be returned. This
-	 * field can be combined with other filter attributes to narrow the selection set further.
-	 * </p>
-	 */
-	private int severity = ANY_SEVERITY;
-
-	/**
-	 * <p>
-	 * The validator which reported the messages that should be returned. All messages which were
-	 * reported using validator matching this validator will be returned. This field can be combined
-	 * with other filter attributes to narrow the selection set further.
-	 * </p>
-	 */
-	private IValidator validator;
-
-	/**
-	 * <p>
-	 * The target object of the messages that should be returned, or null to specify to retrieve
-	 * messages of any target. All messages having a target object matching this object will be
-	 * returned. This field can be combined with other filter attributes to narrow the selection set
-	 * further.
-	 * </p>
-	 */
-	private Object targetObject;
-
-	/**
-	 * @deprecated
-	 */
-	public MessageFilter() {
-		super();
-	}
-
-	/**
-	 * 
-	 * @param aSeverity
-	 * 			Severity of the message
-	 * @param validator
-	 * 			IValidator which reported the message
-	 * @param aTargetObject
-	 * 			Target object of the message
-	 */
-	public MessageFilter(int aSeverity, IValidator validator, Object aTargetObject) {
-		super();
-		severity = aSeverity;
-		this.validator = validator;
-		targetObject = aTargetObject;
-	}
-
-	/**
-	 * @return the severity filter constraint.
-	 */
-	public int getSeverity() {
-		return severity;
-	}
-
-	/**
-	 * @return the target object filter constraint.
-	 */
-	public java.lang.Object getTargetObject() {
-		return targetObject;
-	}
-
-	/**
-	 * @return the validator to filter on.
-	 */
-	public IValidator getValidator() {
-		return validator;
-	}
-
-	/**
-	 * Set the severity filter constraint.
-	 * 
-	 * @param newSeverity
-	 *            severity filter constraint
-	 */
-	public void setSeverity(int newSeverity) {
-		severity = newSeverity;
-	}
-
-	/**
-	 * Set the target object filter constraint.
-	 * 
-	 * @param newTargetObject
-	 *             target object filter constraint
-	 */
-	public void setTargetObject(java.lang.Object newTargetObject) {
-		targetObject = newTargetObject;
-	}
-
-	/**
-	 * Set the validator to return messages for.
-	 * 
-	 * @param validator
-	 *            validator to return messages for
-	 */
-	public void setValidator(IValidator validator) {
-		this.validator = validator;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/core/ValidationException.java b/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/core/ValidationException.java
deleted file mode 100644
index c4c6c76..0000000
--- a/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/core/ValidationException.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.core;
-
-
-import java.util.Locale;
-
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-
-/**
- * <p>
- * This exception is the only exception which should be thrown by IValidators. The message in this
- * exception must be suitable for showing to the user. All ValidationExceptions will have their
- * message extracted when they're caught, and the message will be shown to the user.
- * 
- * @plannedfor 1.0
- * </p>
- */
-public class ValidationException extends Exception {
-	private Throwable _lowLevelException = null;
-	private IMessage _message = null;
-	private ClassLoader _loader = null;
-	private final static long serialVersionUID = -3387516993124229949L;
-
-	/**
-	 * Constructs a new exception with a given message string. <br>
-	 * <br>
-	 * 
-	 * @param message
-	 *            IMessage, which is Locale-independent, which contains the message to be shown to
-	 *            be shown to the user.
-	 */
-	public ValidationException(IMessage message) {
-		this(message, null);
-	}
-
-	/**
-	 * Constructs a new exception with a given message string, and low-level exception. <br>
-	 * <br>
-	 * 
-	 * @param message
-	 *            IMessage Locale-independent message to be shown to the user.
-	 * @param exception
-	 *            relevant low-level exception, or <code>null</code> if none. <br>
-	 *            &nbsp;&nbsp;&nbsp For example, when a method fails because of a network
-	 *            communications &nbsp;&nbsp;&nbsp problem, this would be the
-	 *            <code>java.io.IOException</code> &nbsp;&nbsp;&nbsp describing the exact nature
-	 *            of the problem.
-	 */
-	public ValidationException(IMessage message, Throwable exception) {
-		super();
-		_message = message;
-		_lowLevelException = exception;
-	}
-
-	/**
-	 * @return the low-level exception associated with this ValidationException.
-	 */
-	public Throwable getAssociatedException() {
-		return _lowLevelException;
-	}
-
-	/**
-	 * @return the IMessage to be shown to the user, or null if this exception should be handled
-	 * internally.
-	 */
-	public IMessage getAssociatedMessage() {
-		return _message;
-	}
-
-	/**
-	 * @return if the IValidator which threw this exception was loaded by a different ClassLoader than the
-	 * framework, this method returns the ClassLoader of the IValidator.
-	 */
-	public ClassLoader getClassLoader() {
-		return _loader;
-	}
-
-	/**
-	 * @return the error message string of this <code>Throwable</code> object if it was
-	 *         {@link java.lang.Throwable#Throwable(String) created}with an error message string;
-	 *         or <code>null</code> if it was {@link java.lang.Throwable#Throwable() created}with
-	 *         no error message.
-	 *  
-	 */
-	public String getMessage() {
-		return _message.getText(getClassLoader());
-	}
-
-	/**
-	 * @param locale
-	 * 			The locale of which to get the message.
-	 * @return the error message string of this <code>Throwable</code> object if it was
-	 *         {@link java.lang.Throwable#Throwable(String) created}with an error message string;
-	 *         or <code>null</code> if it was {@link java.lang.Throwable#Throwable() created}with
-	 *         no error message.
-	 */
-	public String getMessage(Locale locale) {
-		return _message.getText(locale, getClassLoader());
-	}
-
-	/**
-	 * <p>
-	 * If the IValidator which threw this exception was loaded by a different ClassLoader than the
-	 * framework, this method should set the ClassLoader to be the ClassLoader of the IValidator.
-	 * </p>
-	 * @param loader
-	 *  		ClassLoader of the validator
-	 */
-	public void setClassLoader(ClassLoader loader) {
-		_loader = loader;
-	}
-
-	/**
-	 * <p>
-	 * Returns a short description of this throwable object. If this <code>Throwable</code> object
-	 * was {@link java.lang.Throwable#Throwable(String) created}with an error message string, then
-	 * the result is the concatenation of three strings:
-	 * <ul>
-	 * <li>The name of the actual class of this object
-	 * <li>": " (a colon and a space)
-	 * <li>The result of the {@link #getMessage}method for this object
-	 * </ul>
-	 * If this <code>Throwable</code> object was {@link java.lang.Throwable#Throwable() created}
-	 * with no error message string, then the name of the actual class of this object is returned.
-	 * </p>
-	 * 
-	 * @return a string representation of this <code>Throwable</code>.
-	 */
-	public String toString() {
-		return toString(Locale.getDefault());
-	}
-
-	/**
-	 * <p>
-	 * Returns a short description of this throwable object. If this <code>Throwable</code> object
-	 * was {@link java.lang.Throwable#Throwable(String) created}with an error message string, then
-	 * the result is the concatenation of three strings:
-	 * <ul>
-	 * <li>The name of the actual class of this object
-	 * <li>": " (a colon and a space)
-	 * <li>The result of the {@link #getMessage}method for this object
-	 * </ul>
-	 * If this <code>Throwable</code> object was {@link java.lang.Throwable#Throwable() created}
-	 * with no error message string, then the name of the actual class of this object is returned.
-	 * </p>
-	 * 
-	 * @return a string representation of this <code>Throwable</code>.
-	 */
-	public String toString(Locale locale) {
-		String s = getClass().getName();
-		String message = getMessage(locale);
-		return (message != null) ? (s + ": " + message) : s; //$NON-NLS-1$
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/core/ValidatorLauncher.java b/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/core/ValidatorLauncher.java
deleted file mode 100644
index 8325e92..0000000
--- a/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/core/ValidatorLauncher.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.core;
-
-import org.eclipse.wst.validation.internal.provisional.core.IReporter;
-import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
-import org.eclipse.wst.validation.internal.provisional.core.IValidator;
-
-
-
-/**
- * <p>
- * This singleton launches the validation on a single validator. Clients should call this class's
- * <code>start</code> method to begin the validation.
- * </p>
- */
-public class ValidatorLauncher {
-	private static ValidatorLauncher _launcher = null;
-
-	
-	/**
-	 * Default constructor 
-	 */
-	private ValidatorLauncher() {
-		//Default constructor
-	}
-
-	/**
-	 * @return the singleton launcher.
-	 */
-	public static ValidatorLauncher getLauncher() {
-		if (_launcher == null) {
-			_launcher = new ValidatorLauncher();
-		}
-		return _launcher;
-	}
-
-	/**
-	 * <p>
-	 * This method is the launch point of the validation. It runs validation on the validator
-	 * accessed by the IValidationContext. When the validation is complete, each validator may perform resource
-	 * cleanup, if necessary.
-	 * 
-	 * <br>
-	 * <br>
-	 * If <code>helper</code>,<code>validator</code>, or <code>reporter</code> are null,
-	 * validation is not performed. <code>changedFiles</code> may be null, or empty, if a full
-	 * build should be done.
-	 * </p>
-	 * 
-	 * @param helper 
-	 * 			loads an object. 
-	 * @param validator
-	 * 			validator object to launch validation.
-	 * @param reporter
-	 * 			Is an instance of an IReporter interface, which is used for
-	 * interaction with the user.
-	 * @param changedFiles
-	 * 			Is an array of files which have been added, changed, or deleted
-	 * since the last validation. If <code>changedFiles</code> is null, or if it is an empty
-	 * array, then a full validation should be performed. Otherwise, validation on just the files
-	 * listed in the array should performed if the validator supports incremental validation.
-	 */
-	public void start(IValidationContext helper, IValidator validator, IReporter reporter) throws ValidationException {
-		if ((helper == null) || (validator == null) || (reporter == null)) {
-			return;
-		}
-
-		// Can't force each validator to check if it's cancelled or not,
-		// so check for cancellation here. Hopefully the user won't wait
-		// too long.
-		if (reporter.isCancelled()) {
-			return;
-		}
-
-		// If the validator is about to perform a full build, remove all of its previous validation
-		// messages.
-		if ((helper.getURIs() == null) || (helper.getURIs().length == 0)) {
-			reporter.removeAllMessages(validator);
-		}
-
-		validator.validate(helper, reporter);
-		validator.cleanup(reporter);
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/provisional/core/IMessage.java b/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/provisional/core/IMessage.java
deleted file mode 100644
index b53b851..0000000
--- a/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/provisional/core/IMessage.java
+++ /dev/null
@@ -1,330 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.provisional.core;
-
-
-import java.util.Locale;
-
-/**
- * <p>
- * This interface represents a locale-independent validation message.
- * </p>
- * <p>
- * Given these three values as input, this interface can be queried for the final message string.
- * (i.e., the message with the parameters already substituted in.) Either the default Locale can be
- * used, or the caller can specify a Locale.
- * 
- * @plannedfor 1.0
- * </p>
- * 
- * [issue: CS - The 'IMessage' interface would be simpler without the bundle related details.  I'd like to understand
- * why we can 'precompute' the translated message. Is there some benefit to perform 'late computation' of these messages?
- * How does this compare to the eclipse Marker (as far as I know the Marker's text() is preLocalized).
- * Here's a list of the methods that are related to 'bundle specific' aspects and could be separate out (or designed away)?
- *    
- *   - getId()
- *   - getBundle(...)
- *   - getBundleName()
- *   - getParams()
- *   - getText(Locale)
- *   - getText(ClassLoader)
- *   - getText(Locale, ClassLoader)
- *   - setId(String)
- *   - setBundleName(String)
- *   - setParams(String[])
- * ]
- * 
- *   - void setAttribute(String attributeName, Object value)
- *   - Object getAttribute(String attributeName);
- * ]
- */
-public interface IMessage {
-	public static final int OFFSET_UNSET = -1; // see getLength(), getOffset()
-	public static final int LINENO_UNSET = 0;
-	/**
-	 * Typically used to specify error messages.
-	 */
-	public static final int HIGH_SEVERITY = 0x0001;
-	/**
-	 * Typically used to specify warning messages.
-	 */
-	public static final int NORMAL_SEVERITY = 0x0002;
-	/**
-	 * Typically used to specify information messages.
-	 */
-	public static final int LOW_SEVERITY = 0x0004;
-	/**
-	 * Specify high (error) and normal (warning) messages. Typically used with a MessageFilter, to
-	 * filter out information messages.
-	 */
-	public static final int ERROR_AND_WARNING = HIGH_SEVERITY | NORMAL_SEVERITY;
-	/**
-	 * Specify all types of messages. Typically used with a MessageFilter.
-	 */
-	public static final int ALL_MESSAGES = ERROR_AND_WARNING | LOW_SEVERITY;
-
-	/**
-	 * @return the name of the bundle which this message is contained in.
-	 */
-	public String getBundleName();
-
-	/**
-	 * <p>
-	 * To support removal of a subset of validation messages, an IValidator may assign group names
-	 * to IMessages. An IMessage subset will be identified by the name of its group. Default (null)
-	 * means no group.
-	 * </p>
-	 * @return the name of the group to which the message belongs.
-	 */
-	public String getGroupName();
-
-	/**
-	 * <p>
-	 * Returns the id of the message. Message ids are used as the constants in property bundles
-	 * which localize the description of the message in a locale-independent fashion. The id is the
-	 * key, in the resource bundle, which identifies the string to be loaded. The id may not be null
-	 * or the empty string.
-	 * </p>
-	 * @return the id of the message
-	 */
-	public java.lang.String getId();
-
-	/**
-	 * @return the length of the problem area, starting from the offset. If unset, value =
-	 * IMessage.OFFSET_UNSET.
-	 * 
-	 * @see #getOffset()
-	 */
-	public int getLength();
-
-	/**
-	 * <p>
-	 * If there is a target object associated with this IMessage, and that target object is a file,
-	 * then an optional line number may be set. The line number identifies the location of the
-	 * problem identified by this message. If no line number has been set, #LINENO_UNSET will be
-	 * returned.
-	 * </p>
-	 * @return line number of the location of the problem.
-	 * 
-	 */
-	public int getLineNumber();
-
-	/**
-	 * <p>
-	 * Returns the offset of the message. If unset, value = IMessage.OFFSET_UNSET. For example, if
-	 * the java compiler were a validator, and it reported that a variable name was unknown, offset
-	 * would identify the position of the first character of the unknown variable. (The position is
-	 * identified by the number of characters from the start of the file.)
-	 * </p>
-	 * 
-	 * @return offset of the message
-	 */
-	public int getOffset();
-
-	/**
-	 * <p>
-	 * Returns the parameters of the message. Message parameters are the values which are
-	 * substituted into parameter slots in localized message text ddscriptions.
-	 * </p>
-	 * 
-	 * @return parameters of the message
-	 */
-	public java.lang.String[] getParams();
-
-	/**
-	 * <p>
-	 * Returns the severity level of the message. One of SeverityEnum constants.
-	 * 
-	 * @see IMessage#HIGH_SEVERITY
-	 * @see IMessage#NORMAL_SEVERITY
-	 * @see IMessage#LOW_SEVERITY
-	 * </p>
-	 * 
-	 * @return the severity level of the message
-	 */
-	public int getSeverity();
-
-	/**
-	 * <p>
-	 * Return the object that this IMessage is reporting the problem against, if any. null will be
-	 * returned if this is a general message which does not apply to a particular object; for
-	 * example, "internal error".
-	 * </p>
-	 * 
-	 * @return the target object for the message
-	 */
-	public Object getTargetObject();
-
-	/**
-	 * @return a text representation of this message formatted in the default Locale, with the
-	 * bundle loaded by the default ClassLoader.
-	 */
-	public java.lang.String getText();
-
-	/**
-	 * @param classLoader 
-	 * 				The ClassLoader which will be used to load the ResourceBundle.
-	 *            
-	 * @return a text representation of this message formatted in the default locale, with the
-	 * bundle loaded by the specified ClassLoader.
-	 */
-	public java.lang.String getText(ClassLoader classLoader);
-
-	/**
-	 * @param locale
-	 *            The locale to translate the message text into.
-	 *            
-	 * @return a text representation of this message formatted in the specified locale, with the
-	 * bundle loaded by the default ClassLoader.
-	 */
-	public java.lang.String getText(Locale locale);
-
-	/**
-	 * @param locale
-	 *            The locale to translate the message text into.
-	 * @param classLoader
-	 *            The ClassLoader which will be used to load the ResourceBundle.
-	 *            
-	 * @return a text representation of this message formatted in the specified locale, with the
-	 * bundle loaded by the specified ClassLoader.
-	 */
-	public java.lang.String getText(Locale locale, ClassLoader classLoader);
-	
-	/**
-	 * Provides a way to store some additional attributes that a message would like to store
-	 * that can used by some other parties that are interested in those attribute values. Basically
-	 * a convienince to pass object values around that can consumed by other Objects it they need it
-	 * @param attributeName
-	 * @return an Object basically the value associated with the object name.
-	 */
-	
-	public Object getAttribute(String attributeName);
-	
-	/**
-	 * Set the attributeName and value as key value pair
-	 * @see getAttribute(String attributeName).
-	 * @param attributeName
-	 */
-	
-	void setAttribute(String attributeName, Object value);
-	   
-
-	/**
-	 * Set the name of the bundle which this message is contained in.
-	 * 
-	 * @param bundleName 
-	 * 			Name of the bundle which contains the message.
-	 */
-	public void setBundleName(String bundleName);
-
-	/**
-	 * <p>
-	 * To support removal of a subset of validation messages, an IValidator may assign group names
-	 * to IMessages. An IMessage subset will be identified by the name of its group. Default (null)
-	 * means no group.
-	 * </p>
-	 * 
-	 * @param name
-	 * 			Name of the group.
-	 */
-	public void setGroupName(String name);
-
-	/**
-	 * <p>
-	 * Set the id of the message. Message ids are used as the constants in property bundles which
-	 * localize the description of the message in a locale-independent fashion. The id is the key,
-	 * in the resource bundle, which identifies the string to be loaded. The id may not be null or
-	 * the empty string.
-	 * </p>
-	 * 
-	 * @param newId
-	 *            Id of the message.
-	 */
-	public void setId(java.lang.String newId);
-
-	/**
-	 * <p>
-	 * Sets the length of the problem, starting from the offset. If unset, value =
-	 * IMessage.OFFSET_UNSET.
-	 * 
-	 * @see #setOffset(int)
-	 * </p>
-	 * 
-	 * @param length 
-	 *			sets the length 		
-	 */
-	public void setLength(int length);
-
-	/**
-	 * <p>
-	 * If there is a target object associated with this IMessage, and that target object is a file,
-	 * then an optional line number may be set. The line number identifies the location of the
-	 * problem identified by this message. To indicate no line number, use #LINENO_UNSET.
-	 * </p>
-	 * @param lineNumber 
-	 *			sets the line no. 	
-	 */
-	public void setLineNo(int lineNumber);
-
-	/**
-	 * <p>
-	 * Sets the offset of the message. If unset, value = IMessage.OFFSET_UNSET. For example, if the
-	 * java compiler were a validator, and it reported that a variable name was unknown, offset
-	 * would identify the position of the first character of the unknown variable. (The position is
-	 * identified by the number of characters from the start of the file.)
-	 * </p>
-	 * @param offset 
-	 *			sets the offset of the message.
-	 */
-	public void setOffset(int offset);
-
-	/**
-	 * <p>
-	 * Sets the parameters of the message. Message parameters are the values which are substituted
-	 * into parameter slots in localized message text descriptions.
-	 * </p>
-	 * <p>
-	 * For example, if getId() returns "MY_ID", then the ResourceBundle identified by
-	 * getBundleName() is searched for the message named "MY_ID", and if found,
-	 * </p>
-	 * 
-	 * @see java.text.MessageFormat#format(String, Object[]) is invoked on the message, with
-	 *      <code>newParams</code> passed in as the Object[].
-	 * @param newParams
-	 *            parameters of the message.
-	 */
-	public void setParams(java.lang.String[] newParams);
-
-	/**
-	 * Sets the severity level of the message. One of SeverityEnum constants.
-	 * 
-	 * @see IMessage#HIGH_SEVERITY
-	 * @see IMessage#NORMAL_SEVERITY
-	 * @see IMessage#LOW_SEVERITY
-	 * 
-	 * @param newSeverity
-	 *            severity level of the message
-	 */
-	public void setSeverity(int newSeverity);
-
-	/**
-	 * <p>
-	 * Associate this IMessage with the object that has the problem. A null value is permitted. If a
-	 * message is applicable to one object, then this value should be set. Otherwise, the default
-	 * value (null) should be kept. Given this target object, it should be possible to calculate the
-	 * exact location of the problem.
-	 * </p>
-	 * 
-	 * @param obj
-	 *         The object that has the problem.
-	 */
-	public void setTargetObject(Object obj);
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/provisional/core/IMetaModelContext.java b/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/provisional/core/IMetaModelContext.java
deleted file mode 100644
index 37a9cfe..0000000
--- a/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/provisional/core/IMetaModelContext.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.provisional.core;
-
-public interface IMetaModelContext extends IValidationContext {
-	
-	public Object getModel(String URI);
-
-}
diff --git a/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/provisional/core/IReporter.java b/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/provisional/core/IReporter.java
deleted file mode 100644
index 95f29a1..0000000
--- a/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/provisional/core/IReporter.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.provisional.core;
-
-import java.util.List;
-
-
-
-
-/*
- * CCM - Reporter is now passed locale-independent messages.
- *       Messages should only be translated to a locale upon access.
- *       Or in special locale-dependent reporter implementations (console logger).
- */
-
-/**
- * The interface used by IValidator's to report messages. The implementation of the IReporter could
- * simply log the messages to stdout, a file, or retain them in a buffer for later access by a user
- * interface.
- * 
- * Reporter implementations should keep non-localized versions of their messages
- * 
- * Any messages which need to be displayed to the user are done through this class, and if the user
- * cancels the current function, this class is the one which registers the cancellation.
- * 
- * The IReporter instance is created at the time validation begins and ends when validation is complete.
- * There is only one IReporter instance created for all validators that are run on a IResource. The IResource
- * provides a way to get messages put out each validator and add and delete messages for one validator
- * at a time. 
- * ] 
- */
-public interface IReporter  {
-	/**
-	 * <p>
-	 * Add a locale-independent validation message. It will be displayed later, with all of the
-	 * other validation messages.
-	 * </p>
-	 * <p>
-	 * The IValidator passed in is needed for incremental validation (when a message needs to be
-	 * removed, one validator should not remove messages entered by another validator.) The
-	 * validator is also queried for information about its resource bundle, to enable support for
-	 * localization of messages in a client-server environment.
-	 * </p>
-	 * <p>
-	 * Both parameters must not be null.
-	 * </p>
-	 * @param origin
-	 *            The validator which is the source of the message.
-	 * @param message
-	 *            A message to be reported
-	 * @exception MessageLimitException
-	 *                is thrown when the total number of messages reported exceeds the maximum
-	 *                allowed.
-	 * [issue: LM - This exception seems questionable to me. Why do validators need to know how
-	 *  to handle a MessageLimitException? Seems to me that this is a validation framework
-	 *  specific issue and that client validators shouldn't know about this at all. ]
-	 */
-	public abstract void addMessage(IValidator origin, IMessage message) throws MessageLimitException;
-
-	/**
-	 * <p>
-	 * Show a text representation of this message, formatted in the default Locale, to the user
-	 * immediately. This message indicates which subtask is currently being processed. The message
-	 * is not stored. The subtask message in this context is the subtask in a IProgressMontior 
-	 * 
-	 * @see subTask(String name) in IProgressMonitor
-	 * </p>
-	 * <p>
-	 * Both parameters must not be null. 
-	 * </p>
-	 * 
-	 * @param IValidator
-	 *            validator The validator issuing the subtask message.
-	 * @param IMessage
-	 *            message The message to be displayed to the user.
-	 *                       
-	 */
-	public abstract void displaySubtask(IValidator validator, IMessage message);
-
-	/**
-	 * @return the message access interface to this reporter, or null if message access is not
-	 * supported.
-	 *     
-	 */
-	public List getMessages();
-
-	/**
-	 * <p>
-	 * Return true if the user cancelled validation, and false otherwise. This method should be
-	 * called by IValidators periodically, because no event is fired to notify IValidators that the
-	 * user cancelled validation. If a validator does not check this method, a cancellation request
-	 * is ignored.
-	 * </p>
-	 * 
-	 * @return true if the user cancelled validation, and false otherwise.
-	 *  
-	 */
-	public abstract boolean isCancelled();
-
-	/**
-	 * <p>
-	 * Remove all validation messages entered by the identified validator. This method is provided
-	 * for incremental validation. 
-	 * </p>
-	 * <p>
-	 * The IValidator parameter must not be null.
-	 * </p>
-	 * @param origin
-	 * 			originator validator of the message.  
-	 */
-	public abstract void removeAllMessages(IValidator origin);
-
-	/**
-	 * Remove all validation messages, entered by the identified validator, pertaining to the Object
-	 * provided. This method is provided for incremental validation. <br>
-	 * <br>
-	 * If <code>object</code> is null, then this method should remove all messages owned by the
-	 * validator. (i.e., the same behaviour as the removeAllMessages(IValidator) method.) <br>
-	 * <br>
-	 * <p>
-	 * The IValidator parameter must not be null.
-	 * </p>
-	 * @param origin
-	 * 			originator validator of the message.
-	 * @param object
-	 * 			Object to which the message belongs. Object is the target object that was set on the IMessage
-	 * when adding the message as problem marker.
-	 * 
- 	 */
-	public abstract void removeAllMessages(IValidator origin, Object object);
-
-	/**
-	 * To support removal of a subset of validation messages, an IValidator may assign group names
-	 * to IMessages. An IMessage subset will be identified by the name of its group. This method
-	 * will remove only the IMessage's that are in the group identified by groupName. <br>
-	 * <br>
-	 * <br>
-	 * 
-	 * The IValidator parameter must not be null. <br>
-	 * <br>
-	 * 
-	 * If <code>object</code> is null, then this method should remove all messages owned by the
-	 * validator. (i.e., the same behaviour as the removeAllMessages(IValidator) method.)
-	 * 
-	 * If groupName is null, that's the same as no group (i.e., the same behaviour as the
-	 * <code>removeAllMessages(IValidator, Object)</code> method.) <br>
-	 * 
-	 * @param origin
-	 * 			originator validator of the message.
-	 * @param object
-	 * 			Object to which the message belongs. 
-	 * @param groupName
-	 * 			name of the group to which the message belongs. 
-	 */
-	public void removeMessageSubset(IValidator validator, Object obj, String groupName);
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/provisional/core/IValidationContext.java b/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/provisional/core/IValidationContext.java
deleted file mode 100644
index 135a80f..0000000
--- a/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/provisional/core/IValidationContext.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.provisional.core;
-
-
-
-/**
- * <p>
- * This class is used to to separate the IValidator from the model loading. A model 
- * is a group of object(s) that must follow some rules.
- * </p>
- * <p>
- * The model is loaded differently depending on whether the validator is running in 
- * UI or headless context. If the <code>loadModel</code> method was a method on the IValidator, 
- * then there would need to be two versions of validators, one for headless and one for 
- * UI. Because <code>loadModel</code> is separate from the IValidator, we provide 
- * two different IHelpers instead, and ship the one specific to the environment.
- * </p>
- * <p>
- * Each IValidationContext implementation loads a specific model as identified by a String
- * <code>symbolicName</code>. The symbolicName can be any value except null or the 
- * empty string. Each validator identifies the symbolic names which it needs, and the
- * type of model which needs to be returned when that symbolic name is loaded via a 
- * <code>loadModel</code> method. An IValidationContext can support more than one IValidator; 
- * the helper needs to support every model that each validator needs.
- * </p>
- */
-public interface IValidationContext {
-	/**
-	 * <p>
-	 * Load the model identified by <code>symbolicName</code>.<code>symbolicName</code> 
-	 * must not be null or the empty string if the validator needs to be run in both 
-	 * Headless and UI.
-	 * 
-	 * The symbolicName is a string name that is registered in the implementation of the
-	 * IValidatorContext. For an example our internal implementation of the loadModel use
-	 * method names for symbolicNames to load the model object to be validated. Users can
-	 * use their own model load mechanism.
-	 * @see <code>WorkbenchContext</code>
-	 * 
-	 * </p>
-	 * @plannedfor 1.0
-	 */
-	public Object loadModel(String symbolicName);
-
-	/**
-	 * <p>
-	 * Load the model identified by <code>symbolicName</code> and <code>parms</code>.
-	 * <code>symbolicName</code> must not be null or the empty string if the validator 
-	 * needs to be run in both Headless and UI. If <code>parms</code> is null then this
-	 * method behaves the same as
-	 * 
-	 * @link #loadModel(String).
-	 * 
-	 * This method differs from
-	 * @link #loadModel(String) because it takes parameters, from the IValidator, which 
-	 * 		 are available only at runtime. If you need to pass a live object to the IValidationContext, 
-	 * 		 this is the loadModel method to use.
-	 * </p>
-	 * @param symbolicName String identifier for model
-	 * @param parms 	   parms list of parameters that the model takes for invocation
-	 * 
-	 * [issue : CS - It's not at all clear how these parameters would get passed into a helper.  I'd suggest
-	 * providing getProperty() and setProperty() methods on the class to allow contextual information to be 
-	 * supplied and queried in a generic manner.]
-	 */
-	public Object loadModel(String symbolicName, Object[] parms);
-	
-	/**
-	 * @return a string array with the list of URI's that need to be validated in the
-	 * case of Incremental build
-	 */
-	
-	public String[] getURIs();
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/provisional/core/IValidator.java b/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/provisional/core/IValidator.java
deleted file mode 100644
index 37f740e..0000000
--- a/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/provisional/core/IValidator.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.provisional.core;
-
-import org.eclipse.wst.validation.internal.core.ValidationException;
-
-/**
- * This is the base interface for all Validators. A Validator is a class which verifies that objects
- * follow some rules. For example, in a MOF model which represents an EJB jar, the EJB specification
- * determines the rules. <br>
- * <br>
- * A validator can perform full validation or incremental validation. All validators must implement
- * full validation but incremental validation is optional. <br>
- * <br>
- * Each validator must not be tied to any particular workbench implementation. <br>
- * <br>
- * A validator's verification starts when the ValidatorLauncher singleton calls
- * <code>validate</code>.
- * 
- * [issue: LM - This interface will be implemented by clients. This should be considered a candidate for
- *  an abstract class. ]   
- */
-public interface IValidator {
-	/**
-	 * <p>
-	 * Perform any resource cleanup once validation is complete. If cleanup will take some time, the
-	 * IValidator should report subtask information to the user through the IReporter parameter. The
-	 * IReporter parameter will not be null.
-	 * </p>
-	 * @param reporter used for the interaction with the user
-	 * @plannedfor WTP 1.0
-	 * 
-	 * [issue : CS - Perhaps the IValidator should be required to provide a 'name' that can be used describe 
-	 * the running validation 'Job'.  Then the framework could automatically say something like 'XYZ validator : cleanup'.
-	 * Relying on the IValidator to provide subtask information seems error prone.]
-	 * [issue: LM - Is the cleanup method necessary? Can the framework put a requirement that client validators 'clean up'
-	 *  before returning from the validate method? ] 
-	 */
-	public void cleanup(IReporter reporter);
-
-	/**
-	 * This is the method which performs the validation on the objects. <br>
-	 * <br>
-	 * <code>helper</code> and <code>reporter</code> may not be null. <code>changedFiles</code>
-	 * may be null, if a full build is desired. <br>
-	 * <br>
-	 * @param helper 
-	 * 			loads an object. 
-	 * @param reporter
-	 * 			Is an instance of an IReporter interface, which is used for
-	 * interaction with the user.
-	 * @param changedFiles
-	 * 			Is an array of files which have been added, changed, or deleted
-	 * since the last validation. If <code>changedFiles</code> is null, or if it is an empty
-	 * array, then a full validation should be performed. Otherwise, validation on just the files
-	 * listed in the array should performed if the validator supports incremental validation.
-	 * 
-	 * [issue : CS - I'm curious to understand why the validator is not invoked directly on a file.  It seems it should be the
-	 * domain of another API to manage manage incremental file changes and triggering validations accordingly. 
-	 * Do we have a current use case in WTP where the validator does anything more validate a file from the changedFiles list?]
-	 */
-	public void validate(IValidationContext helper, IReporter reporter) throws ValidationException;
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/provisional/core/MessageLimitException.java b/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/provisional/core/MessageLimitException.java
deleted file mode 100644
index 47f61fc..0000000
--- a/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/provisional/core/MessageLimitException.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.wst.validation.internal.provisional.core;
-
-
-/**
- * This exception is thrown by
- * 
- * @see IReporter#addMessage(IValidator, IMessage) method if no more messages can be reported
- *      because the maximum number of messages has been reported.
- * [issue: LM - Going along with my comment on the addMessage method in IReporter I 
- *  think this class should be internal to the validation framework.
- *  I don't think there's a need for this class to be exposed to clients. If too many
- *  messages are added the framework should handle this without notifying the client
- *  validator. ]
- */
-public class MessageLimitException extends RuntimeException {
-	private final static long serialVersionUID = -7034897190745766940L;
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/xsds/referencialFileExtSchema.exsd b/plugins/org.eclipse.wst.validation/xsds/referencialFileExtSchema.exsd
deleted file mode 100644
index a30b719..0000000
--- a/plugins/org.eclipse.wst.validation/xsds/referencialFileExtSchema.exsd
+++ /dev/null
@@ -1,118 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.validation">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.validation" id="referencialFileValidator" name="Referencial File Validator"/>
-      </appInfo>
-      <documentation>
-         This extension point is used for referential file validation. This extension point should be extended if you have files that reference other files and would like the validation on referenced files to run when the validation on the referencing file is run. The Post Validator operation that is used by this extension point expects a flat list of files to run validation on referenced files.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="referencialFileValidator"/>
-         </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">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="referencialFileValidator">
-      <complexType>
-         <sequence>
-            <element ref="run"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="run">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;This extension point is part of an interim API that is still under development and expected to change significantly before reaching stability. It is being made available at this early stage to solicit feedback from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken (repeatedly) as the API evolves.&lt;/b&gt;
-      </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) 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/plugins/org.eclipse.wst.validation/xsds/validationHelper.exsd b/plugins/org.eclipse.wst.validation/xsds/validationHelper.exsd
deleted file mode 100644
index d6aece6..0000000
--- a/plugins/org.eclipse.wst.validation/xsds/validationHelper.exsd
+++ /dev/null
@@ -1,113 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.validation">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.validation" id="validationHelper" name="Validation Helper"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="validationHelper"/>
-         </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">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="validationHelper">
-      <complexType>
-         <attribute name="helperClass" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;This extension point is part of an interim API that is still under development and expected to change significantly before reaching stability. It is being made available at this early stage to solicit feedback from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken (repeatedly) as the API evolves.&lt;/b&gt;
-      </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) 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/plugins/org.eclipse.wst.validation/xsds/validationSelectionHandler.exsd b/plugins/org.eclipse.wst.validation/xsds/validationSelectionHandler.exsd
deleted file mode 100644
index 9e20f4a..0000000
--- a/plugins/org.eclipse.wst.validation/xsds/validationSelectionHandler.exsd
+++ /dev/null
@@ -1,117 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.validation">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.validation" id="validationSelectionHandler" name="Validation Selection Handler"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="validationSelectionHandler" minOccurs="1" maxOccurs="unbounded"/>
-         </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">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="validationSelectionHandler">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="handlerClass" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="selectionType" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;This extension point is part of an interim API that is still under development and expected to change significantly before reaching stability. It is being made available at this early stage to solicit feedback from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken (repeatedly) as the API evolves.&lt;/b&gt;
-      </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) 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/plugins/org.eclipse.wst.validation/xsds/validatorExtSchema.exsd b/plugins/org.eclipse.wst.validation/xsds/validatorExtSchema.exsd
deleted file mode 100644
index 0451696..0000000
--- a/plugins/org.eclipse.wst.validation/xsds/validatorExtSchema.exsd
+++ /dev/null
@@ -1,284 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.validation">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.validation" id="validator" name="Validator"/>
-      </appInfo>
-      <documentation>
-         This extension point give the ability to create a new validator that can validate resources in a Java Project. The validator needs to registered for a given nature of the project for it to run on that project. The user can specifiy file filters to filter out files that need to be validated. The new validator registered by the project nature on the project can be run manually or incrementally if  Auto Build is turned on, during incremental builds the changed delta of files are only validated if those files are part of the validation filters specified.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="validator"/>
-         </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>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="validator">
-      <complexType>
-         <sequence>
-            <element ref="projectNature" minOccurs="1" maxOccurs="unbounded"/>
-            <element ref="filter" minOccurs="1" maxOccurs="unbounded"/>
-            <element ref="helper"/>
-            <element ref="dependentValidator" minOccurs="0" maxOccurs="1"/>
-            <element ref="run"/>
-            <element ref="markerId" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="to" type="string">
-            <annotation>
-               <documentation>
-                  Optional migration tag
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="from" type="string">
-            <annotation>
-               <documentation>
-                  Optional migration tag
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="projectNature">
-      <complexType>
-         <sequence>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="include" type="boolean">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="filter">
-      <complexType>
-         <attribute name="objectClass" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="nameFilter" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="caseSensitive" type="boolean">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="action" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="helper">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="dependentValidator">
-      <complexType>
-         <attribute name="depValValue" type="boolean">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="run">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="incremental" type="boolean">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="enabled" type="boolean">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="fullBuild" type="boolean">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="async" type="boolean">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="markerId">
-      <annotation>
-         <documentation>
-            The markerId element is is used to get a custom problem marker for the custom validator implemented using this extension point
-
-This markerId element also needs a corresponding problemMarker extension to be defined bythis validator with the same Id as the makerIdValue for the validator to have its own marker type. Here is an example of the a problemMarker extension defined for a markerIdValue &quot;FooMarker&quot;
-
- &lt;extension
-         id=&quot;FooMarker&quot;
-         name=&quot;%EJB_VALIDATION_PROBLEMMARKER_NAME&quot;
-         point=&quot;org.eclipse.core.resources.markers&quot;&gt;
-      &lt;super
-            type=&quot;org.eclipse.wst.validation.problemmarker&quot;&gt;
-      &lt;/super&gt;
-      &lt;persistent
-            value=&quot;true&quot;&gt;
-      &lt;/persistent&gt;
-      &lt;attribute
-            name=&quot;owner&quot;&gt;
-      &lt;/attribute&gt;
-      &lt;attribute
-            name=&quot;validationSeverity&quot;&gt;
-      &lt;/attribute&gt;
-      &lt;attribute
-            name=&quot;targetObject&quot;&gt;
-      &lt;/attribute&gt;
-      &lt;attribute
-            name=&quot;groupName&quot;&gt;
-      &lt;/attribute&gt;
-      &lt;attribute
-            name=&quot;messageId&quot;&gt;
-      &lt;/attribute&gt;
-   &lt;/extension&gt;
-   
-   Without a problemMarker extension defined, the customer validator will use the base Validation Message problemMarker type.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="markerIdValue" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         &lt;b&gt;This extension point is part of an interim API that is still under development and expected to change significantly before reaching stability. It is being made available at this early stage to solicit feedback from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken (repeatedly) as the API evolves.&lt;/b&gt;
-      </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) 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
