diff --git a/plugins/org.eclipse.wst.common.emf/.classpath b/plugins/org.eclipse.wst.common.emf/.classpath
deleted file mode 100644
index e8d84f8..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.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<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 21c0734..0000000
--- a/plugins/org.eclipse.wst.common.emf/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-bin
-runtime
-temp.folder
-build.xml
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/build.properties b/plugins/org.eclipse.wst.common.emf/build.properties
deleted file mode 100644
index 3d1eb1a..0000000
--- a/plugins/org.eclipse.wst.common.emf/build.properties
+++ /dev/null
@@ -1,19 +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
-###############################################################################
-output.runtime/workbench.jar=bin/
-bin.includes=plugin.xml,\
-               runtime/workbench.jar,\
-               runtime/wtpemf.jar
-source.runtime/workbench.jar=workbench/
-source.runtime/wtpemf.jar=wtpemf/
-output.runtime/wtpemf.jar=bin/
-jars.compile.order=runtime/wtpemf.jar,\
-                     runtime/workbench.jar
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.xml b/plugins/org.eclipse.wst.common.emf/plugin.xml
deleted file mode 100644
index a4147a0..0000000
--- a/plugins/org.eclipse.wst.common.emf/plugin.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="org.eclipse.wst.common.emf"
-   name="EMF Utilities"
-   version="1.0.0"
-   provider-name="Eclipse.org"
-   description="Provides support and utilities for emf integration into the workbench"
-   class="org.eclipse.wst.common.internal.emf.plugin.EcoreUtilitiesPlugin">
-
-   <runtime>
-      <library name="runtime/wtpemf.jar">
-         <export name="*"/>
-      </library>
-      <library name="runtime/workbench.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.emf.ecore.xmi"/>
-      <import plugin="org.eclipse.wst.common.frameworks"/>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.eclipse.core.resources"/>
-   </requires>
-
-
-   <extension-point id="packageURIMap" name="PackageURIMap"/>
-
-<!-- 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/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 253ffe3..0000000
--- a/plugins/org.eclipse.wst.common.emf/workbench/org/eclipse/wst/common/internal/emf/plugin/PackageURIMapReader.java
+++ /dev/null
@@ -1,73 +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.IPluginRegistry;
-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() {
-		IPluginRegistry reg = Platform.getPluginRegistry();
-		return reg.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 65d5637..0000000
--- a/plugins/org.eclipse.wst.common.emf/workbench/org/eclipse/wst/common/internal/emf/plugin/PluginRendererFactoryDefaultHandler.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
- *******************************************************************************/
-/*
- * 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.wst.common.internal.emf.resource.EMF2DOMRendererFactoryDefaultHandler;
-import org.eclipse.wst.common.internal.emf.resource.RendererFactory;
-
-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 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 03b6992..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/AbstractRendererImpl.java
+++ /dev/null
@@ -1,148 +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;
-	}
-}
\ 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 d3a644e..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2DOMAdapterImpl.java
+++ /dev/null
@@ -1,1746 +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.DOMException;
-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("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 7c57ef9..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2DOMRenderer.java
+++ /dev/null
@@ -1,257 +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.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;
-
-import org.eclipse.jem.util.logger.proxy.Logger;
-
-
-
-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);
-		}
-	}
-
-	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 2164745..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2SAXRenderer.java
+++ /dev/null
@@ -1,176 +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.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXNotRecognizedException;
-import org.xml.sax.XMLReader;
-
-import org.eclipse.jem.util.logger.proxy.Logger;
-
-/**
- * @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 1710118..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/IDTranslator.java
+++ /dev/null
@@ -1,73 +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 = (String) res.getEObjectToIDMap().get(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) {
-		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 e3be112..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/Renderer.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.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);
-}
\ 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 da5b33c..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorResourceImpl.java
+++ /dev/null
@@ -1,380 +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 {
-			doSave(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(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 2213226..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DOMUtilities.java
+++ /dev/null
@@ -1,681 +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.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;
-
-import org.eclipse.jem.util.logger.proxy.Logger;
-
-/**
- * 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 dda0593..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.getString("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.getString("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.getString("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.getString("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.getString("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.getString("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.getString("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.getString("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.getString("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.getString("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.getString("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 c5026cb..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ExtendedEcoreUtil.java
+++ /dev/null
@@ -1,247 +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).getIDToEObjectMap().remove(id);
-			((XMLResource) res).getEObjectToIDMap().remove(p);
-		}
-		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("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 5fc1761..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/IDUtil.java
+++ /dev/null
@@ -1,73 +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.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;
-		Map idMap = aResource.getIDToEObjectMap();
-		while (idMap.get(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 fd2ab86..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(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(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 f56cfc1..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.getString("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 037337b..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/WFTUtilsResourceHandler.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
- **************************************************************************************************/
-package org.eclipse.wst.common.internal.emf.utilities;
-
-
-import java.text.MessageFormat;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-public class WFTUtilsResourceHandler {
-	private static ResourceBundle fgResourceBundle;
-
-	/**
-	 * Returns the resource bundle used by all classes in this Project
-	 */
-	public static ResourceBundle getResourceBundle() {
-		try {
-			return ResourceBundle.getBundle("wftutils");//$NON-NLS-1$
-		} catch (MissingResourceException e) {
-			// does nothing - this method will return null and
-			// getString(String, 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.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 b7f0034..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("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 a1ae58c..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/wftutils.properties
+++ /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
-###############################################################################
-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.
-
-ResourceDependencyRegister_ERROR_0=IWAE0002E The ResourceSet cannot be null.
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/wftutils_de.properties b/plugins/org.eclipse.wst.common.emf/wtpemf/wftutils_de.properties
deleted file mode 100644
index 740d673..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/wftutils_de.properties
+++ /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
-###############################################################################
-Warning__Could_not_write_b_WARN_=IWAE0008W Warnung: Zur\u00fcckschreiben von {0} war nicht m\u00f6glich
-Stack_trace_of_nested_exce_ERROR_=IWAE0009E Stack-Trace der verschachtelten Ausnahmebedingung:
-Enumeration_UI_=Aufz\u00e4hlung
-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 Die Konvertierung von {0} in {1} ist fehlgeschlagen.
-DANGLING_HREF_ERROR_=IWAE0001E HREF {0} konnte nicht aufgel\u00f6st werden. \u00dcberpr\u00fcfen Sie die Deskriptordateien und stellen Sie sicher, dass die IDs g\u00fcltig sind.
-
-ResourceDependencyRegister_ERROR_0=IWAE0002E Die Ressourcengruppe darf nicht Null sein.
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/wftutils_es.properties b/plugins/org.eclipse.wst.common.emf/wtpemf/wftutils_es.properties
deleted file mode 100644
index 3ca824d..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/wftutils_es.properties
+++ /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
-###############################################################################
-Warning__Could_not_write_b_WARN_=IWAE0008W Aviso: no se ha podido de nuevo {0}
-Stack_trace_of_nested_exce_ERROR_=IWAE0009E Rastreo de pila de excepci\u00f3n anidada:
-Enumeration_UI_=Enumeraci\u00f3n
-Double_UI_=Doble
-Float_UI_=Coma flotante
-Long_UI_=Largo
-Short_UI_=Corto
-Boolean_UI_=Booleano
-Integer_UI_=Entero
-Character_UI_=Car\u00e1cter
-Byte_UI_=Byte
-Failed_to_convert_{0}_to_{_ERROR_=IWAE0014E No se ha podido convertir {0} en {1}.
-DANGLING_HREF_ERROR_=IWAE0001E No se puede resolver HREF {0}. Compruebe los archivos de descriptor y aseg\u00farese de que los ID son v\u00e1lidos.
-
-ResourceDependencyRegister_ERROR_0=IWAE0002E ResourceSet no puede ser nulo.
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/wftutils_fr.properties b/plugins/org.eclipse.wst.common.emf/wtpemf/wftutils_fr.properties
deleted file mode 100644
index b2ad804..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/wftutils_fr.properties
+++ /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
-###############################################################################
-Warning__Could_not_write_b_WARN_=IWAE0008W Avertissement : impossible de r\u00e9\u00e9crire {0}.
-Stack_trace_of_nested_exce_ERROR_=IWAE0009E Trace de pile de l'exception imbriqu\u00e9e :
-Enumeration_UI_=Enum\u00e9ration
-Double_UI_=Variable double
-Float_UI_=Variable flottante
-Long_UI_=Variable longue
-Short_UI_=Variable courte
-Boolean_UI_=Bool\u00e9en
-Integer_UI_=Entier
-Character_UI_=Caract\u00e8re
-Byte_UI_=Octet
-Failed_to_convert_{0}_to_{_ERROR_=IWAE0014E Echec de la conversion de {0} en {1}.
-DANGLING_HREF_ERROR_=IWAE0001E Impossible de r\u00e9soudre HREF {0}. V\u00e9rifiez les fichiers du descripteur et assurez-vous que les ID sont valides.
-
-ResourceDependencyRegister_ERROR_0=IWAE0002E La classe ResourceSet ne peut pas \u00eatre NULL.
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/wftutils_it.properties b/plugins/org.eclipse.wst.common.emf/wtpemf/wftutils_it.properties
deleted file mode 100644
index 31d60a6..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/wftutils_it.properties
+++ /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
-###############################################################################
-Warning__Could_not_write_b_WARN_=IWAE0008W Avviso: Impossibile eseguire il write back per {0}
-Stack_trace_of_nested_exce_ERROR_=IWAE0009E Traccia dello stack dell'eccezione nidificata:
-Enumeration_UI_=Numerazione
-Double_UI_=Doppio
-Float_UI_=Mobile
-Long_UI_=Esteso
-Short_UI_=Breve
-Boolean_UI_=Booleano
-Integer_UI_=Intero
-Character_UI_=Carattere
-Byte_UI_=Byte
-Failed_to_convert_{0}_to_{_ERROR_=IWAE0014E Impossibile convertire {0} in {1}.
-DANGLING_HREF_ERROR_=IWAE0001E Impossibile risolvere HREF {0}. Controllare i file del descrittore e assicurarsi che gli ID siano validi.
-
-ResourceDependencyRegister_ERROR_0=IWAE0002E ResourceSet non pu\u00f2 essere null.
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/wftutils_ja.properties b/plugins/org.eclipse.wst.common.emf/wtpemf/wftutils_ja.properties
deleted file mode 100644
index 2347f79..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/wftutils_ja.properties
+++ /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
-###############################################################################
-Warning__Could_not_write_b_WARN_=IWAE0008W \u8b66\u544a: {0} \u3092\u66f8\u304d\u623b\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093
-Stack_trace_of_nested_exce_ERROR_=IWAE0009E \u30cd\u30b9\u30c8\u3055\u308c\u305f\u4f8b\u5916\u306e\u30b9\u30bf\u30c3\u30af\u30fb\u30c8\u30ec\u30fc\u30b9:
-Enumeration_UI_=\u5217\u6319\u578b
-Double_UI_=\u500d\u7cbe\u5ea6
-Float_UI_=\u6d6e\u52d5
-Long_UI_=\u9577\u5f62\u5f0f
-Short_UI_=\u77ed\u5f62\u5f0f
-Boolean_UI_=\u30d6\u30fc\u30eb
-Integer_UI_=Integer
-Character_UI_=\u6587\u5b57
-Byte_UI_=\u30d0\u30a4\u30c8
-Failed_to_convert_{0}_to_{_ERROR_=IWAE0014E {0} \u3092 {1} \u306b\u5909\u63db\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
-DANGLING_HREF_ERROR_=IWAE0001E HREF {0} \u3092\u89e3\u6c7a\u3067\u304d\u307e\u305b\u3093\u3002 \u8a18\u8ff0\u5b50\u30d5\u30a1\u30a4\u30eb\u3092\u8abf\u3079\u3001ID \u304c\u6709\u52b9\u304b\u3069\u3046\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002
-
-ResourceDependencyRegister_ERROR_0=IWAE0002E \u30ea\u30bd\u30fc\u30b9\u30fb\u30bb\u30c3\u30c8\u3092 NULL \u306b\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/wftutils_ko.properties b/plugins/org.eclipse.wst.common.emf/wtpemf/wftutils_ko.properties
deleted file mode 100644
index ae4662d..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/wftutils_ko.properties
+++ /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
-###############################################################################
-Warning__Could_not_write_b_WARN_=IWAE0008W \uacbd\uace0: {0}\uc744(\ub97c) \ud68c\uc2e0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
-Stack_trace_of_nested_exce_ERROR_=IWAE0009E \uc911\ucca9\ub41c \uc608\uc678\uc758 \uc2a4\ud0dd \ucd94\uc801:
-Enumeration_UI_=\uc5f4\uac70
-Double_UI_=Double
-Float_UI_=Float
-Long_UI_=Long
-Short_UI_=Short
-Boolean_UI_=\ubd80\uc6b8
-Integer_UI_=\uc815\uc218
-Character_UI_=\ubb38\uc790
-Byte_UI_=\ubc14\uc774\ud2b8
-Failed_to_convert_{0}_to_{_ERROR_=IWAE0014E {0}\uc744(\ub97c) {1}(\uc73c)\ub85c \ubcc0\ud658\ud558\ub294 \ub370 \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4.
-DANGLING_HREF_ERROR_=IWAE0001E {0} HREF\ub97c \ubd84\uc11d\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \uc124\uba85\uc790 \ud30c\uc77c\uc744 \ud655\uc778\ud558\uace0 ID\uac00 \uc62c\ubc14\ub978\uc9c0 \ud655\uc778\ud558\uc2ed\uc2dc\uc624.
-
-ResourceDependencyRegister_ERROR_0=IWAE0002E ResourceSet\uc740 \ub110(null)\uc77c \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/wftutils_pt_BR.properties b/plugins/org.eclipse.wst.common.emf/wtpemf/wftutils_pt_BR.properties
deleted file mode 100644
index 4031f06..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/wftutils_pt_BR.properties
+++ /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
-###############################################################################
-Warning__Could_not_write_b_WARN_=IWAE0008W Aviso: N\u00e3o foi poss\u00edvel gravar {0} novamente
-Stack_trace_of_nested_exce_ERROR_=IWAE0009E Rastreio de pilha de exce\u00e7\u00e3o aninhada:
-Enumeration_UI_=Enumera\u00e7\u00e3o
-Double_UI_=Duplo
-Float_UI_=Flutuante
-Long_UI_=Longo
-Short_UI_=Curto
-Boolean_UI_=Booleano
-Integer_UI_=Inteiro
-Character_UI_=Caractere
-Byte_UI_=Byte
-Failed_to_convert_{0}_to_{_ERROR_=IWAE0014E Falha ao converter {0} em {1}.
-DANGLING_HREF_ERROR_=IWAE0001E N\u00e3o foi poss\u00edvel resolver HREF {0}. Verifique os arquivos descritores e assegure que os IDs sejam v\u00e1lidos.
-
-ResourceDependencyRegister_ERROR_0=IWAE0002E O ResourceSet n\u00e3o pode ser nulo.
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/wftutils_zh_CN.properties b/plugins/org.eclipse.wst.common.emf/wtpemf/wftutils_zh_CN.properties
deleted file mode 100644
index 4ac8cec..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/wftutils_zh_CN.properties
+++ /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
-###############################################################################
-Warning__Could_not_write_b_WARN_=IWAE0008W \u8b66\u544a\uff1a\u672a\u80fd\u56de\u5199 {0}
-Stack_trace_of_nested_exce_ERROR_=IWAE0009E \u5d4c\u5957\u5f02\u5e38\u7684\u5806\u6808\u8ddf\u8e2a\uff1a
-Enumeration_UI_=\u679a\u4e3e\u578b
-Double_UI_=\u53cc\u7cbe\u5ea6\u578b
-Float_UI_=\u6d6e\u70b9\u578b
-Long_UI_=\u957f\u6574\u578b
-Short_UI_=\u77ed\u6574\u578b
-Boolean_UI_=\u5e03\u5c14\u578b
-Integer_UI_=\u6574\u578b
-Character_UI_=\u5b57\u7b26\u578b
-Byte_UI_=\u5b57\u8282\u578b
-Failed_to_convert_{0}_to_{_ERROR_=IWAE0014E \u672a\u80fd\u5c06 {0} \u8f6c\u6362\u4e3a {1}\u3002
-DANGLING_HREF_ERROR_=IWAE0001E \u672a\u80fd\u89e3\u6790 HREF {0}\u3002\u68c0\u67e5\u63cf\u8ff0\u7b26\u6587\u4ef6\u5e76\u786e\u4fdd\u6807\u8bc6\u6709\u6548\u3002
-
-ResourceDependencyRegister_ERROR_0=IWAE0002E ResourceSet \u4e0d\u80fd\u4e3a\u7a7a\u3002
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/wftutils_zh_TW.properties b/plugins/org.eclipse.wst.common.emf/wtpemf/wftutils_zh_TW.properties
deleted file mode 100644
index a8179ad..0000000
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/wftutils_zh_TW.properties
+++ /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
-###############################################################################
-Warning__Could_not_write_b_WARN_=IWAE0008W \u8b66\u544a\uff1a\u7121\u6cd5\u5beb\u56de {0}
-Stack_trace_of_nested_exce_ERROR_=IWAE0009E \u5de2\u72c0\u7570\u5e38\u72c0\u6cc1\u7684\u5806\u758a\u8ffd\u8e64\uff1a
-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 \u7121\u6cd5\u5c07 {0} \u8f49\u63db\u6210 {1}\u3002
-DANGLING_HREF_ERROR_=IWAE0001E \u7121\u6cd5\u89e3\u6790 HREF {0}\u3002\u8acb\u6aa2\u67e5\u63cf\u8ff0\u5b50\u6a94\u6848\uff0c\u4e26\u78ba\u5b9a ID \u662f\u5426\u6709\u6548\u3002
-
-ResourceDependencyRegister_ERROR_0=IWAE0002E ResourceSet \u4e0d\u80fd\u662f\u7a7a\u503c\u3002
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 d7d0dbf..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.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<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 86c9683..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-bin
-temp.folder
-build.xml
-emfworkbenchedit.jar
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/build.properties b/plugins/org.eclipse.wst.common.emfworkbench.integration/build.properties
deleted file mode 100644
index 64eb80a..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/build.properties
+++ /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
-###############################################################################
-source.emfworkbenchedit.jar = src/,\
-                              property_file/
-output.emfworkbenchedit.jar = bin/
-bin.includes = plugin.xml,\
-               emfworkbenchedit.jar
-src.includes = schema/
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 4b27689..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/plugin.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="org.eclipse.wst.common.emfworkbench.integration"
-   name="EMF Workbench Edit Plug-in"
-   description="This plugin provides the extensible edit model and edit model operation framework used to keep editors in synch. The DynamicAdapterFactory framework is also provided so adapters can register themselves to be picked up globally."
-   version="1.0.0"
-   provider-name="Eclipse.org"
-   class="org.eclipse.wst.common.internal.emfworkbench.integration.EMFWorkbenchEditPlugin">
-
-   <runtime>
-      <library name="emfworkbenchedit.jar">
-         <export name="*"/>
-      </library> 
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.wst.common.frameworks"/>
-      <import plugin="org.eclipse.jem.util"/>
-      <import plugin="org.eclipse.emf.edit"/>
-      <import plugin="org.eclipse.emf.ecore.xmi"/>
-      <import plugin="org.eclipse.wst.common.emf"/>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.eclipse.core.resources"/>
-      <import plugin="org.eclipse.emf.codegen"/>
-      <import plugin="org.eclipse.emf.codegen.ecore"/>
-      <import plugin="org.eclipse.xsd"/>
-   </requires>
-
-
-   <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 
-       point="org.eclipse.jem.util.uiContextSensitiveClass">
-       <uiContextSensitiveClass
-          key="ValidateEditContext"
-          className="org.eclipse.wst.common.internal.emfworkbench.validateedit.ValidateEditHeadlessContext"
-          context="Headless"/>
-  </extension>
-  <extension
-         id="Generator"
-         point="org.eclipse.core.runtime.applications">
-      <application>
-         <run
-               class="org.eclipse.wst.common.internal.emfworkbench.operation.DataObjectGeneratorModel">
-         </run>
-      </application>
-   </extension>
-   
-   <extension
-        id="emfValidationHandler"
-        name="emfValidationHandler"
-        point="org.eclipse.wst.common.frameworks.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/emfworkbenchedit.properties b/plugins/org.eclipse.wst.common.emfworkbench.integration/property_file/emfworkbenchedit.properties
deleted file mode 100644
index 04eab80..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/property_file/emfworkbenchedit.properties
+++ /dev/null
@@ -1,21 +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
-###############################################################################
-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. 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 65dfe01..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/schema/adapterFactory.exsd
+++ /dev/null
@@ -1,140 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="com.ibm.etools.emf.workbench">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="com.ibm.etools.emf.workbench" 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>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="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>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         
-      </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 e79f950..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/schema/editModel.exsd
+++ /dev/null
@@ -1,178 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="com.ibm.etools.emf.workbench">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="com.ibm.etools.emf.workbench" 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>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="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;com.ibm.etools.emf.workbench.edit.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>
-         6.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;br&gt;
-&lt;code&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;extension&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;id=&quot;editModel.acme.parent&quot;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name=&quot;Acme&amp;nbsp;Parent&amp;nbsp;Edit&amp;nbsp;Model&quot;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;point=&quot;com.ibm.etools.emf.workbench.editModel&quot;&amp;gt;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;editModel&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;editModelID=&quot;com.acme.acmepro.parent.editModel&quot;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;factoryClass=&quot;com.ibm.etools.emf.workbench.edit.EditModelFactory&quot;&amp;gt;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;editModelResource&amp;nbsp;URI=&quot;DIR/resource0.xml&quot;&amp;nbsp;/&amp;gt;&amp;nbsp;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;editModelResource&amp;nbsp;URI=&quot;DIR/resource1.xml&quot;&amp;nbsp;/&amp;gt;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/editModel&amp;gt;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/extension&amp;gt;&amp;nbsp;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;extension&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;id=&quot;editModel.acme.child&quot;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name=&quot;Acme&amp;nbsp;Child&amp;nbsp;Edit&amp;nbsp;Model&quot;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;point=&quot;com.ibm.etools.emf.workbench.editModel&quot;&amp;gt;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;editModel&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;editModelID=&quot;com.acme.acmepro.child.editModel&quot;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;factoryClass=&quot;com.ibm.etools.emf.workbench.edit.EditModelFactory&quot;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;parentModelID=&quot;com.acme.acmepro.parent.editModel&quot;&amp;gt;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;editModelResource&amp;nbsp;URI=&quot;DIR/resource2.xml&quot;&amp;nbsp;/&amp;gt;&amp;nbsp;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;editModelResource&amp;nbsp;URI=&quot;DIR/resource3.xml&quot;&amp;nbsp;/&amp;gt;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/editModel&amp;gt;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/extension&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
-&lt;/code&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Edit Models can be accessed through the com.ibm.etools.emf.workbench.EMFWorkbenchContext.
-      </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>
-         
-      </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 7340818..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/schema/editModelExtension.exsd
+++ /dev/null
@@ -1,127 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="com.ibm.etoosl.emf.workbench">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="com.ibm.etoosl.emf.workbench" id="geditModelExtension" name="Edit Model Extension"/>
-      </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>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="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>
-         6.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;br&gt;
-&lt;code&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;extension&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;point=&quot;com.ibm.etools.emf.workbench.editModelExtension&quot;&amp;gt;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;editModelExtension&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;editModelID=&quot;com.ibm.etools.inheritance.parent.editModel&quot;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;functionGroupID=&quot;com.ibm.etools.websphere.group&quot;&amp;gt;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;editModelResource&amp;nbsp;URI=&quot;DIR/extension0.xml&quot;/&amp;gt;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;editModelResource&amp;nbsp;URI=&quot;DIR/extension1.xml&quot;/&amp;gt;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/editModelExtension&amp;gt;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/extension&amp;gt;&lt;br&gt;
-&lt;/code&gt;
-      </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>
-         
-      </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 988c139..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/schema/modifierHelperFactory.exsd
+++ /dev/null
@@ -1,156 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="com.ibm.wtp.emf.workbench.edit">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="com.ibm.wtp.emf.workbench.edit" id="ModifierHelperFactory" name="ModifierHelperFactory"/>
-      </appInfo>
-      <documentation>
-         [Enter description of this extension point.]
-      </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>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="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>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         
-      </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 c685b92..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, 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 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;
-	}
-
-}
\ No newline at end of file
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 b87f8f7..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, 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 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};
-	}
-
-}
\ No newline at end of file
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 8929ec5..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/EMFWorkbenchContext.java
+++ /dev/null
@@ -1,369 +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 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 (editModel == null) {
-			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 (editModel == null) {
-			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);
-	}
-
-
-
-	private EditModel getExistingEditModel(String editModelID, Map params, boolean isReadOnly) {
-		EditModel editModel = null;
-		if (isReadOnly) {
-			editModel = (EditModel) this.readOnlyModels.get(getCacheID(editModelID, params));
-		} else {
-			editModel = (EditModel) this.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);
-		if (editModel.isReadOnly())
-			this.readOnlyModels.put(getCacheID(editModel.getEditModelID(), params), editModel);
-		else
-			this.editableModels.put(getCacheID(editModel.getEditModelID(), params), editModel);
-	}
-
-	protected void discardAllEditModels() {
-		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
-		if (readOnly)
-			readOnlyModels.values().remove(editModel);
-		else
-			editableModels.values().remove(editModel);
-	}
-
-	/**
-	 * Notify all editModels of the change.
-	 */
-	protected void notifyEditModels(EditModelEvent anEvent) {
-		if (anEvent == null)
-			return;
-		List aList = new ArrayList();
-		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() {
-		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;
-	}
-
-}
\ No newline at end of file
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 0db8e58..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/EMFWorkbenchEditResourceHandler.java
+++ /dev/null
@@ -1,78 +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 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 java.text.MessageFormat;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * @author vijayb
- * 
- * TODO To change the template for this generated type comment go to Window - Preferences - Java -
- * Code Style - Code Templates
- */
-public class EMFWorkbenchEditResourceHandler {
-
-
-
-	private static ResourceBundle fgResourceBundle;
-
-	/**
-	 * Returns the resource bundle used by all classes in this Project
-	 */
-	public static ResourceBundle getResourceBundle() {
-		try {
-			return ResourceBundle.getBundle("emfworkbenchedit"); //$NON-NLS-1$
-		} catch (MissingResourceException e) {
-			// does nothing - this method will return null and
-			// getString(String, 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.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 c549927..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, 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;
-
-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.wst.common.frameworks.internal.IValidationSelectionHandler;
-
-import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-
-/**
- * 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 1820719..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, 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;
-
-
-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;
-	}
-
-}
\ No newline at end of file
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 2e1ce7b..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/WorkbenchResourceHelper.java
+++ /dev/null
@@ -1,447 +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 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.wst.common.internal.emf.resource.ReferencedResource;
-import org.eclipse.wst.common.internal.emf.resource.ReferencedXMIFactoryImpl;
-import org.eclipse.wst.common.internal.emf.utilities.ExtendedEcoreUtil;
-
-import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
-import org.eclipse.jem.util.emf.workbench.WorkbenchURIConverter;
-import org.eclipse.jem.util.plugin.JEMUtilPlugin;
-
-/**
- * @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));
-	}
-
-
-
-}
\ No newline at end of file
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 4643166..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/AdapterFactoryDescriptor.java
+++ /dev/null
@@ -1,160 +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 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.internal.runtime.Assert;
-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.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.getString("AdapterFactoryDescriptor_ERROR_0")); //$NON-NLS-1$
-		Assert.isNotNull(id, EMFWorkbenchEditResourceHandler.getString("AdapterFactoryDescriptor_ERROR_1", new Object[]{element.getDeclaringExtension().getDeclaringPluginDescriptor().getUniqueIdentifier()})); //$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;
-	}
-}
\ No newline at end of file
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 b601d00..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, 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.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;
-	}
-
-}
\ No newline at end of file
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 9ba8d3d..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, 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.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);
-		}
-	}
-}
\ No newline at end of file
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 bbe924c..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ClientAccessRegistry.java
+++ /dev/null
@@ -1,103 +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 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.wst.common.internal.emfworkbench.EMFWorkbenchEditResourceHandler;
-
-import org.eclipse.jem.internal.util.emf.workbench.nls.EMFWorkbenchResourceHandler;
-
-/**
- * @author mdelder
- */
-public class ClientAccessRegistry {
-
-	private final WeakHashMap registry = new WeakHashMap();
-	private final Set baseSet = new HashSet();
-
-	public 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.getString("ClientAccessRegistry_ERROR_0"), accessorKey); //$NON-NLS-1$
-
-		} else
-			complain();
-	}
-
-	public 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 void assertAccess(Object accessorKey) {
-		if (!isClientAccessing(accessorKey))
-			throw new ClientAccessRegistryException(EMFWorkbenchResourceHandler.getString("ClientAccessRegistry_ERROR_1"), accessorKey); //$NON-NLS-1$
-	}
-
-	public boolean isClientAccessing(Object client) {
-		boolean result = this.registry.containsKey(client);
-		if (!isStable())
-			complain();
-		return result;
-	}
-
-	public boolean isAnyClientAccessing() {
-		boolean result = this.registry.size() > 0;
-		if (!isStable())
-			complain();
-		return result;
-	}
-
-	public 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 int size() {
-		return this.registry.size();
-	}
-
-}
\ No newline at end of file
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 e4f45d2..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, 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 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("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("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();
-
-	}
-
-}
\ No newline at end of file
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 0c9f5c0..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, 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 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);
-	}
-}
\ No newline at end of file
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 3e29a0a..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelExtension.java
+++ /dev/null
@@ -1,67 +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 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;
-	}
-
-}
\ No newline at end of file
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 2dbfc7c..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelExtensionRegistry.java
+++ /dev/null
@@ -1,99 +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.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.wst.common.internal.emfworkbench.integration.EMFWorkbenchEditPlugin;
-
-import org.eclipse.jem.util.RegistryReader;
-
-
-/**
- * @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;
-	}
-
-}
\ No newline at end of file
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 13a50ff..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelRegistry.java
+++ /dev/null
@@ -1,257 +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.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeSet;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-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.jem.util.RegistryReader;
-import org.eclipse.jem.util.logger.proxy.Logger;
-
-/**
- * @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("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; 
-	}
-
-	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("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.getString("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;
-	}
-}
\ No newline at end of file
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 b6551a2..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, 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 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;
-	}
-}
\ No newline at end of file
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 4bb6897..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, 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.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();
-	}
-}
\ No newline at end of file
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/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 af83c11..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, 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 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.getString("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();
-	}
-}
\ No newline at end of file
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 56928ff..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, 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.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;
-	}
-
-}
\ No newline at end of file
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 862b8ef..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, 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 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
-	}
-}
\ No newline at end of file
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 01d5251..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/DynamicAdapterFactory.java
+++ /dev/null
@@ -1,643 +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.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.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;
-
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-
-/**
- * @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.getString("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;
-	}
-}
\ No newline at end of file
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 eb15974..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, 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.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();
-	}
-
-
-}
\ No newline at end of file
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 535e34d..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EditModel.java
+++ /dev/null
@@ -1,1566 +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.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.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.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 final ClientAccessRegistry registry = new ClientAccessRegistry();
-	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");
-		this.editModelID = editModelID;
-		this.readOnly = readOnly;
-		this.emfContext = context;
-		this.project = context.getProject();
-		initializeKnownResourceUris();
-		processLoadedResources();
-		processPreloadResources();
-	}
-
-
-
-	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
-	 */
-	protected boolean isDisposing() {
-		return disposing;
-	}
-
-	public void dispose() {
-		synchronized (this) {
-			if(disposing || isDisposed())
-				return;
-			disposing = true;
-		}
-		try { 
-			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 {
-			disposing = false;
-			disposed = true;
-		}
-	}
-
-	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.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);
-		} 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);
-	}
-
-	private void runSaveOperation(IWorkspaceRunnable runnable, IProgressMonitor monitor) throws SaveFailedException {
-		try {
-			ResourcesPlugin.getWorkspace().run(runnable, 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 (isInterrestedInResource(res)) {
-				processResource(res);
-				processed = true;
-			}
-		}
-		return processed;
-	}
-
-	public EMFWorkbenchContext getEmfContext() {
-		if (isDisposed())
-			throw new IllegalStateException("Edit Model already disposed");
-		if (emfContext == null)
-			throw new IllegalStateException("EMF context is null");
-		return emfContext;
-	}
-
-	private 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) {
-
-		if (!isShared())
-			releaseResources();
-
-		registry.release(accessorKey);
-
-		if (!isDisposing() && 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;
-	}
-}
\ No newline at end of file
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 39d83da..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, 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.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;
-	}
-
-}
\ No newline at end of file
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 7b04ed7..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, 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 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();
-	}
-
-}
\ No newline at end of file
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 1bd83df..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, 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.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);
-}
\ No newline at end of file
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 fd47554..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, 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.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);
-	}
-}
\ No newline at end of file
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 3e6bc72..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, 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.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);
-	}
-}
\ No newline at end of file
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 acb9366..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ModifierHelperRegistry.java
+++ /dev/null
@@ -1,275 +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;
-
-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.IPluginDescriptor;
-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.getPluginRegistry().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().getDeclaringPluginDescriptor().getUniqueIdentifier() + factoryElement.getAttribute(FACTORY_CLASS);
-	}
-
-	public static void logError(IConfigurationElement element, String text) {
-		IExtension extension = element.getDeclaringExtension();
-		IPluginDescriptor descriptor = extension.getDeclaringPluginDescriptor();
-		StringBuffer buf = new StringBuffer();
-		buf.append("Plugin " + descriptor.getUniqueIdentifier() + ", 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;
-	}
-}
\ No newline at end of file
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 85cf4ee..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, 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 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;
-	}
-
-}
\ No newline at end of file
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 19f5a0d..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, 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 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) {
-			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);
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/operation/DataObjectGenerator.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/operation/DataObjectGenerator.java
deleted file mode 100644
index 8ed5d3b..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/operation/DataObjectGenerator.java
+++ /dev/null
@@ -1,401 +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.operation;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-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.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.emf.codegen.ecore.genmodel.GenModel;
-import org.eclipse.emf.codegen.ecore.genmodel.GenModelFactory;
-import org.eclipse.emf.codegen.ecore.genmodel.GenPackage;
-import org.eclipse.emf.codegen.ecore.java2ecore.JavaEcoreBuilder;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperation;
-import org.eclipse.xsd.XSDPackage;
-import org.eclipse.xsd.XSDSchema;
-import org.eclipse.xsd.ecore.XSDEcoreBuilder;
-
-/**
- * @author delfinoj
- * 
- * Generates SDO DataObject classes.
- *  
- */
-public class DataObjectGenerator extends WTPOperation {
-	protected IProject project;
-	protected List xmiPackages;
-	protected List javaModels;
-	protected XSDEcoreBuilder xsdECoreBuilder;
-	protected List ePackages;
-
-	/**
-	 * @param operationDataModel
-	 */
-	public DataObjectGenerator(DataObjectGeneratorModel operationDataModel) {
-		super(operationDataModel);
-	}
-
-	/**
-	 * Set the nsURI of the <code>ePackage</code> to be in the form
-	 * "java://{fullyQualifiedPackageInterfaceName}. When this format is used, EMF will attempt to
-	 * register the static package by loading the interface and calling the eINSTANCE field.
-	 * 
-	 * @param ePackage
-	 * @param fullyQualifiedPackageInterfaceName
-	 */
-	public static void setStaticPackageNsURI(EPackage ePackage, String fullyQualifiedPackageInterfaceName) {
-		if (ePackage != null && fullyQualifiedPackageInterfaceName != null)
-			ePackage.setNsURI("java://" + fullyQualifiedPackageInterfaceName);//$NON-NLS-1$
-	}
-
-	protected IProject getProject() {
-		if (project == null)
-			project = (IProject) operationDataModel.getProperty(DataObjectGeneratorModel.PROJECT);
-		return project;
-	}
-
-	protected XSDEcoreBuilder getXSDEcoreBuilder() {
-		if (xsdECoreBuilder == null)
-			xsdECoreBuilder = new XSDEcoreBuilder();
-		return xsdECoreBuilder;
-	}
-
-	/**
-	 * @see com.ibm.etools.ctc.ant.task.util.BaseProjectBuilder#generate(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	protected boolean prepareGenerate() {
-		// Collect all generated EPackages
-		ePackages = new ArrayList();
-		// Packages generated from XSDs
-		if (xsdECoreBuilder != null)
-			ePackages.addAll(xsdECoreBuilder.getTargetNamespaceToEPackageMap().values());
-		// Packages loaded from XMI files
-		if (xmiPackages != null)
-			ePackages.addAll(xmiPackages);
-		if (javaModels != null)
-			prepareEPackagesFromJavaModels();
-		if (ePackages.isEmpty())
-			return false;
-		return true;
-	}
-
-	protected void prepareEPackagesFromJavaModels() {
-		// Generate packages from annotated java model files
-		JavaEcoreBuilder javaEcoreBuilder = new JavaEcoreBuilder(getProject().getFile(new Path("sdo.genmodel"))) { //$NON-NLS-1$
-			public void getAllGenModelFiles(Collection result, IFile file) throws CoreException {
-				// Ignore .genmodel files on the buildpath
-				return;
-			}
-		};
-		javaEcoreBuilder.run(new NullProgressMonitor(), false);
-		IStatus localStatus = javaEcoreBuilder.getStatus();
-		if (localStatus.getSeverity() != IStatus.ERROR) {
-			List genPackages = javaEcoreBuilder.getGenModel().getGenPackages();
-			processGenPackagesFromJavaModels(genPackages);
-		} else
-			logProblems(localStatus);
-	}
-
-	/**
-	 * @param statusArg
-	 */
-	private void logProblems(IStatus statusArg) {
-		Logger logger = Logger.getLogger();
-		logger.logError("Problems detected generating SDO objects."); //$NON-NLS-1$
-		log(statusArg, logger);
-	}
-
-	private void log(IStatus statusArg, Logger logger) {
-		doLog(statusArg, logger);
-		if (statusArg.isMultiStatus()) {
-			MultiStatus mStatus = (MultiStatus) statusArg;
-			IStatus[] children = mStatus.getChildren();
-			for (int i = 0; i < children.length; i++) {
-				log(children[i], logger);
-			}
-		}
-	}
-
-	private void doLog(IStatus statusArg, Logger logger) {
-		switch (statusArg.getSeverity()) {
-			case IStatus.ERROR :
-				logger.logError(statusArg.getMessage());
-				break;
-			case IStatus.WARNING :
-				logger.logWarning(statusArg.getMessage());
-				break;
-			case IStatus.INFO :
-				logger.log(statusArg.getMessage());
-				break;
-		}
-	}
-
-	/**
-	 * @param genPackages
-	 */
-	protected void processGenPackagesFromJavaModels(List genPackages) {
-		if (genPackages.isEmpty())
-			return;
-		for (Iterator i = genPackages.iterator(); i.hasNext();) {
-			GenPackage genPackage = (GenPackage) i.next();
-			EPackage ePackage = genPackage.getEcorePackage();
-			updateEPackageFromJavaModel(ePackage, genPackage);
-			ePackages.add(ePackage);
-		}
-
-	}
-
-	protected void updateEPackageFromJavaModel(EPackage ePackage, GenPackage genPackage) {
-		// Fix the ePackage name
-		ePackage.setName(ePackage.getNsPrefix());
-		setStaticPackageNsURI(ePackage, genPackage);
-	}
-
-	/**
-	 * Since we are generating static Packages we need to set the nsURI of each EPackage to be in
-	 * the form "java://{fully qualified package interface name}. When this format is used, EMF will
-	 * attempt to register the static package by loading the interface and calling the eINSTANCE
-	 * field.
-	 * 
-	 * @param ePackage
-	 * @param genPackage
-	 */
-	protected void setStaticPackageNsURI(EPackage ePackage, GenPackage genPackage) {
-		String interfaceName = genPackage.getPackageInterfaceName();
-		if (interfaceName != null) {
-			StringBuffer b = new StringBuffer();
-			b.append(genPackage.getPackageName()).append('.').append(interfaceName);
-			setStaticPackageNsURI(ePackage, b.toString());
-		}
-	}
-
-	/**
-	 * @see com.ibm.etools.ctc.ant.task.util.BaseProjectBuilder#generate(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	protected void generate(IProgressMonitor progressMonitor) throws CoreException {
-		try {
-			progressMonitor.beginTask(getProject().getFullPath().toString(), 100);
-			// Create a GenModel
-			GenModel genModel = GenModelFactory.eINSTANCE.createGenModel();
-			initializeGenModel(genModel);
-			setPackagesOnGenModel(genModel);
-			// Validate the GenModel
-			IStatus localStatus = genModel.validate();
-			if (!localStatus.isOK())
-				throw new CoreException(localStatus);
-			doGenerate(progressMonitor, genModel);
-			progressMonitor.worked(100);
-		} finally {
-			progressMonitor.done();
-		}
-	}
-
-	/*
-	 * Generate static code.
-	 */
-	protected void doGenerate(IProgressMonitor progressMonitor, GenModel genModel) {
-		try {
-			genModel.generate(new SubProgressMonitor(progressMonitor, 50));
-		} catch (Throwable e) {
-			e.printStackTrace();
-		}
-	}
-
-	/*
-	 * Initialize the GenModel from the EPackages
-	 */
-	protected void setPackagesOnGenModel(GenModel genModel) {
-		genModel.initialize(ePackages);
-		for (Iterator i = genModel.getGenPackages().iterator(); i.hasNext();) {
-			GenPackage genPackage = (GenPackage) i.next();
-			genPackage.setLoadInitialization(false);
-			String prefix = genPackage.getInterfacePackageName();
-			prefix = prefix.substring(prefix.lastIndexOf('.') + 1);
-			if (prefix.length() > 1)
-				prefix = prefix.substring(0, 1).toUpperCase() + prefix.substring(1);
-			else
-				prefix = prefix.toUpperCase();
-			genPackage.setPrefix(prefix);
-		}
-	}
-
-	/**
-	 * @param genModel
-	 */
-	protected void initializeGenModel(GenModel genModel) {
-		setSDODefaults(genModel);
-
-		genModel.setDynamicTemplates(operationDataModel.getBooleanProperty(DataObjectGeneratorModel.DYNAMIC_TEMPLATES));
-		genModel.setForceOverwrite(operationDataModel.getBooleanProperty(DataObjectGeneratorModel.FORCE_OVERWRITE));
-		genModel.setCanGenerate(operationDataModel.getBooleanProperty(DataObjectGeneratorModel.CAN_GENERATE));
-		genModel.setUpdateClasspath(operationDataModel.getBooleanProperty(DataObjectGeneratorModel.UPDATE_CLASSPATH));
-		genModel.setGenerateSchema(operationDataModel.getBooleanProperty(DataObjectGeneratorModel.GENERATE_SCHEMA));
-		genModel.setNonNLSMarkers(operationDataModel.getBooleanProperty(DataObjectGeneratorModel.NON_NLS_MARKERS));
-
-		IFolder modelDir = (IFolder) operationDataModel.getProperty(DataObjectGeneratorModel.MODEL_DIR);
-		genModel.setModelDirectory(modelDir.getFullPath().toOSString());
-	}
-
-	/*
-	 * Options from SetDefaultSDOOptions, recommended by Ed
-	 */
-	protected void setSDODefaults(GenModel genModel) {
-		genModel.setRootExtendsInterface(""); //$NON-NLS-1$
-		//TODO why would you expose this internal interface in the generated code, instead of
-		// commonj.sdo.DataObject
-		genModel.setRootImplementsInterface("org.eclipse.emf.ecore.sdo.InternalEDataObject"); //$NON-NLS-1$
-		genModel.setRootExtendsClass("org.eclipse.emf.ecore.sdo.impl.EDataObjectImpl"); //$NON-NLS-1$
-		genModel.setFeatureMapWrapperInterface("commonj.sdo.Sequence"); //$NON-NLS-1$
-		genModel.setFeatureMapWrapperInternalInterface("org.eclipse.emf.ecore.sdo.util.ESequence"); //$NON-NLS-1$
-		genModel.setFeatureMapWrapperClass("org.eclipse.emf.ecore.sdo.util.BasicESequence"); //$NON-NLS-1$
-		genModel.setSuppressEMFTypes(true);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperation#execute(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	protected void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException {
-		loadModelFiles(monitor);
-		if (prepareGenerate())
-			generate(monitor);
-	}
-
-	/**
-	 * @param monitor
-	 */
-	protected void loadModelFiles(IProgressMonitor monitor) {
-		loadXSDFiles(monitor);
-		loadEcoreFiles(monitor);
-		//loadWSDLFiles(monitor);
-		loadJavaFiles(monitor);
-	}
-
-	/**
-	 * Load an XSD and generate the eCore packages for each tracked XSD file.
-	 * 
-	 * @param monitor
-	 */
-	protected void loadXSDFiles(IProgressMonitor monitor) {
-		if (operationDataModel.isSet(DataObjectGeneratorModel.XSD_FILES)) {
-			List files = (List) operationDataModel.getProperty(DataObjectGeneratorModel.XSD_FILES);
-			IFile file;
-			for (int i = 0; i < files.size(); i++) {
-				file = (IFile) files.get(i);
-				Resource resource = WorkbenchResourceHelperBase.load(file);
-				Collection xsdSchemas = EcoreUtil.getObjectsByType(resource.getContents(), XSDPackage.eINSTANCE.getXSDSchema());
-				for (Iterator j = xsdSchemas.iterator(); j.hasNext();) {
-					getXSDEcoreBuilder().generate((XSDSchema) j.next());
-				}
-			}
-		}
-	}
-
-	/**
-	 * Load an Ecore model file and generate the eCore packages for each tracked Ecore file.
-	 * 
-	 * @param monitor
-	 */
-	protected void loadEcoreFiles(IProgressMonitor monitor) {
-		if (operationDataModel.isSet(DataObjectGeneratorModel.ECORE_FILES)) {
-			List files = (List) operationDataModel.getProperty(DataObjectGeneratorModel.ECORE_FILES);
-			IFile file;
-			for (int i = 0; i < files.size(); i++) {
-				file = (IFile) files.get(i);
-
-				Resource resource = WorkbenchResourceHelperBase.getResource(file, true);
-				addXmiPackages(resource.getContents());
-			}
-		}
-	}
-
-
-	protected void addXmiPackages(List packages) {
-		if (xmiPackages == null)
-			xmiPackages = new ArrayList();
-		xmiPackages.addAll(packages);
-	}
-
-	/**
-	 * Load the XSD files and generate the eCore packages for each tracked WSDL file.
-	 * 
-	 * @param monitor
-	 */
-	protected void loadWSDLFiles(IProgressMonitor monitor) {
-		//		if (operationDataModel.isSet(DataObjectGeneratorModel.WSDL_FILES)) {
-		//			List files = (List) operationDataModel.getProperty(DataObjectGeneratorModel.WSDL_FILES);
-		//			IFile file;
-		//			for (int i = 0; i < files.size(); i++) {
-		//				file = (IFile) files.get(i);
-		//				//TODO We can't handle WSDL in WSAD 5.1 as the WSDL model is not an EMF 2.0 model
-		//				// Re-activate this function when we move to 6.0
-		//				// // Load a WSDL file and collect all the references XSD schemas
-		//				// Set xsdSchemas=new HashSet();
-		//				// URI uri = URI.createFileURI(file.getLocation().toString());
-		//				// Resource resource = WorkbenchResourceHelper.getResource(uri);
-		//				// for (Iterator i=resource.getAllContents(); i.hasNext(); ) {
-		//				// Object object=i.next();
-		//				// if (object instanceof XSDSchemaExtensibilityElement) {
-		//				// XSDSchemaExtensibilityElement
-		//				// extensibilityElement=(XSDSchemaExtensibilityElement)object;
-		//				// XSDSchema xsdSchema=extensibilityElement.getEXSDSchema();
-		//				// if (xsdSchema!=null)
-		//				// xsdSchemas.add(xsdSchema);
-		//				// } else if (object instanceof Part) {
-		//				// Part part=(Part)object;
-		//				// XSDNamedComponent xsdComponent=part.getEXSDType();
-		//				// if (xsdComponent==null)
-		//				// xsdComponent=part.getEXSDElement();
-		//				// if (xsdComponent!=null) {
-		//				// XSDSchema xsdSchema=xsdComponent.getSchema();
-		//				// if (xsdSchema!=null &&
-		//				// !XSDUtil.isSchemaForSchemaNamespace(xsdSchema.getTargetNamespace())) {
-		//				// xsdSchemas.add(xsdSchema);
-		//				// }
-		//				// }
-		//				// }
-		//				// }
-		//				//
-		//				// // Generate Ecore packages from XSDs
-		//				// for (Iterator i=xsdSchemas.iterator(); i.hasNext(); )
-		//				// xsdECoreBuilder.generate((XSDSchema)i.next());
-		//				// }
-		//			}
-		//		}
-	}
-
-	/**
-	 * Load an Ecore model file and generate the eCore packages for each tracked Ecore file.
-	 * 
-	 * @param monitor
-	 */
-	protected void loadJavaFiles(IProgressMonitor monitor) {
-		javaModels = (List) operationDataModel.getProperty(DataObjectGeneratorModel.JAVA_FILES);
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/operation/DataObjectGeneratorModel.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/operation/DataObjectGeneratorModel.java
deleted file mode 100644
index 40b9449..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/operation/DataObjectGeneratorModel.java
+++ /dev/null
@@ -1,345 +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 3, 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.emfworkbench.operation;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.util.ArrayList;
-import java.util.Collections;
-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.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IPlatformRunnable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.codegen.CodeGen.StreamProgressMonitor;
-import org.eclipse.emf.codegen.ecore.Generator;
-import org.eclipse.jem.util.plugin.JEMUtilPlugin;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperation;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
-
-import sun.tools.jar.Main;
-
-/**
- * @author DABERG
- * 
- * TODO To change the template for this generated type comment go to Window - Preferences - Java -
- * Code Generation - Code and Comments
- */
-public class DataObjectGeneratorModel extends WTPOperationDataModel implements IPlatformRunnable {
-	/**
-	 * The project that you want this generator to operate upon. (Required)
-	 * 
-	 * @link org.eclipse.core.resources.IProject
-	 */
-	public static final String PROJECT = "DataObjectGeneratorModel.project"; //$NON-NLS-1$
-	/**
-	 * This is a list of XSD Files that need to be processed. (Optional)
-	 * 
-	 * @link List
-	 * 
-	 * @see IFile
-	 */
-	public static final String XSD_FILES = "DataObjectGeneratorModel.xsdFiles"; //$NON-NLS-1$
-	/**
-	 * This is a list of ECORE Files that need to be processed. (Optional)
-	 * 
-	 * @link List
-	 * 
-	 * @see IFile
-	 */
-	public static final String ECORE_FILES = "DataObjectGeneratorModel.ecoreFiles"; //$NON-NLS-1$
-	/**
-	 * This is a list of WSDL Files that need to be processed. (Optional)
-	 * 
-	 * @link List
-	 * 
-	 * @see IFile
-	 */
-	public static final String WSDL_FILES = "DataObjectGeneratorModel.wsdlFiles"; //$NON-NLS-1$
-	/**
-	 * This is a list of Java model Files that need to be processed. (Optional)
-	 * 
-	 * @link List
-	 * 
-	 * @see IFile
-	 */
-	public static final String JAVA_FILES = "DataObjectGeneratorModel.javaFiles"; //$NON-NLS-1$
-	/**
-	 * This is the folder within the project that you want to have the generated output for the data
-	 * objects to be saved. (Optional - defaults to {project}/gen/src/)
-	 * 
-	 * @link org.eclipse.core.resources.IFolder
-	 */
-	public static final String MODEL_DIR = "DataObjectGeneratorModel.modelDirectory"; //$NON-NLS-1$
-	/**
-	 * GenModel Dynamic Templates option. (Optional - defaults to false)
-	 * 
-	 * @link Boolean
-	 */
-	public static final String DYNAMIC_TEMPLATES = "DataObjectGeneratorModel.dynamicTemplates"; //$NON-NLS-1$
-	/**
-	 * GenModel Force Overwrite option. (Optional - defaults to true)
-	 * 
-	 * @link Boolean
-	 */
-	public static final String FORCE_OVERWRITE = "DataObjectGeneratorModel.forceOverwrite"; //$NON-NLS-1$
-	/**
-	 * GenModel CanGenerate option. (Optional - defaults to true)
-	 * 
-	 * @link Boolean
-	 */
-	public static final String CAN_GENERATE = "DataObjectGeneratorModel.canGenerate"; //$NON-NLS-1$
-	/**
-	 * GenModel Update Classpath option. (Optional - defaults to false)
-	 * 
-	 * @link Boolean
-	 */
-	public static final String UPDATE_CLASSPATH = "DataObjectGeneratorModel.updateClasspath"; //$NON-NLS-1$
-	/**
-	 * GenModel Generate Schema option. (Optional - defaults to false)
-	 * 
-	 * @link Boolean
-	 */
-	public static final String GENERATE_SCHEMA = "DataObjectGeneratorModel.generateSchema"; //$NON-NLS-1$
-	/**
-	 * GenModel NON NLS Markers option. (Optional - defaults to false)
-	 * 
-	 * @link Boolean
-	 */
-	public static final String NON_NLS_MARKERS = "DataObjectGeneratorModel.nonNLSMarkers"; //$NON-NLS-1$
-
-
-	public static void main(String args[]) {
-		new DataObjectGeneratorModel().run(args);
-	}
-
-	public Object run(Object object) {
-		try {
-
-			final String[] arguments = (String[]) object;
-			final IWorkspace workspace = ResourcesPlugin.getWorkspace();
-			IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
-				public void run(IProgressMonitor progressMonitor) throws CoreException {
-					try {
-						boolean keepGenerated = false;
-						boolean verbose = false;
-
-						String ecoreFileName = null;
-						String outputJar = null;
-						if (arguments.length == 0) {
-							printUsage();
-							return;
-						}
-						for (int i = 0; i < arguments.length; i++) {
-							if (arguments[i].equalsIgnoreCase("-keepgenerated")) { //$NON-NLS-1$
-								keepGenerated = true;
-							} else if (arguments[i].equalsIgnoreCase("-ecore")) { //$NON-NLS-1$
-								ecoreFileName = arguments[++i];
-							} else if (arguments[i].equalsIgnoreCase("-output")) { //$NON-NLS-1$
-								outputJar = arguments[++i];
-							} else if (arguments[i].equalsIgnoreCase("-verbose")) { //$NON-NLS-1$
-								verbose = true;
-							}
-						}
-
-						if ((ecoreFileName == null) || (outputJar == null)) {
-							printUsage();
-							return;
-						}
-
-						if (!verbose)
-							progressMonitor = new NullProgressMonitor();
-
-						DataObjectGeneratorModel g = new DataObjectGeneratorModel();
-
-						IProject proj = workspace.getRoot().getProject("TargetProject"); //$NON-NLS-1$
-						IFolder srcFolder = proj.getFolder("src"); //$NON-NLS-1$
-						g.setProperty(DataObjectGeneratorModel.MODEL_DIR, srcFolder);
-
-						if (!proj.exists()) {
-							IPath location = proj.getLocation();
-							proj = Generator.createEMFProject(srcFolder.getFullPath(), //new
-										// Path("/TargetProject/src"),
-										location, Collections.EMPTY_LIST, progressMonitor, Generator.EMF_PLUGIN_PROJECT_STYLE);
-
-						}
-						g.setProperty(DataObjectGeneratorModel.PROJECT, proj);
-
-						File ecoreFile = new File(ecoreFileName);
-
-						IFile file = proj.getFile("datagraph.ecore"); //$NON-NLS-1$
-						if (file.exists()) {
-							file.delete(true, progressMonitor);
-						}
-
-						file.create(new FileInputStream(ecoreFile), true, progressMonitor);
-
-						g.addEcoreFile(file);
-						WTPOperation op = g.getDefaultOperation();
-						op.run(progressMonitor);
-
-						// Build the Project
-
-						proj.build(IncrementalProjectBuilder.FULL_BUILD, progressMonitor);
-
-						// Jar up the files
-						sun.tools.jar.Main jartool = new Main(System.out, System.err, "jar"); //$NON-NLS-1$
-						String args[] = new String[5];
-						args[0] = "cf"; //$NON-NLS-1$
-						args[1] = outputJar;
-						args[2] = "-C"; //$NON-NLS-1$
-						args[3] = proj.getFolder("runtime").getLocation().toString(); //$NON-NLS-1$
-						args[4] = "."; //$NON-NLS-1$
-						jartool.run(args);
-
-						if (keepGenerated) {
-							// Add java files
-							jartool = new Main(System.out, System.err, "jar"); //$NON-NLS-1$
-							args[0] = "uf"; //$NON-NLS-1$
-							args[3] = proj.getFolder("src").getLocation().toString(); //$NON-NLS-1$
-							jartool.run(args);
-						}
-
-						// Delete the old project
-						proj.delete(true, true, progressMonitor);
-
-					} catch (Exception exception) {
-						exception.printStackTrace();
-						throw new CoreException(new Status(IStatus.ERROR, JEMUtilPlugin.ID, 0, "EMF Workbench Error", exception)); //$NON-NLS-1$
-					} finally {
-						progressMonitor.done();
-					}
-				}
-			};
-			workspace.run(runnable, new StreamProgressMonitor(System.out));
-
-			return new Integer(0);
-		} catch (Exception exception) {
-			exception.printStackTrace();
-			return new Integer(1);
-		}
-	}
-
-	public void printUsage() throws Exception {
-		System.out.println("Usage arguments:"); //$NON-NLS-1$
-		System.out.println("  -ecore <ecore-file>"); //$NON-NLS-1$
-		System.out.println("  -output <jar file name>"); //$NON-NLS-1$
-		System.out.println("  [-keepGenerated]  [-verbose]"); //$NON-NLS-1$
-
-	}
-
-	/**
-	 *  
-	 */
-	public DataObjectGeneratorModel() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperationDataModel#getDefaultOperation()
-	 */
-	public WTPOperation getDefaultOperation() {
-		return new DataObjectGenerator(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperationDataModel#initValidBaseProperties()
-	 */
-	protected void initValidBaseProperties() {
-		addValidBaseProperty(PROJECT);
-		addValidBaseProperty(XSD_FILES);
-		addValidBaseProperty(ECORE_FILES);
-		addValidBaseProperty(WSDL_FILES);
-		addValidBaseProperty(JAVA_FILES);
-		addValidBaseProperty(MODEL_DIR);
-		addValidBaseProperty(DYNAMIC_TEMPLATES);
-		addValidBaseProperty(FORCE_OVERWRITE);
-		addValidBaseProperty(CAN_GENERATE);
-		addValidBaseProperty(UPDATE_CLASSPATH);
-		addValidBaseProperty(GENERATE_SCHEMA);
-		addValidBaseProperty(NON_NLS_MARKERS);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperationDataModel#getDefaultProperty(java.lang.String)
-	 */
-	protected Object getDefaultProperty(String propertyName) {
-		if (propertyName.equals(MODEL_DIR))
-			return getDefaultModelDirectory();
-		if (propertyName.equals(FORCE_OVERWRITE) || propertyName.equals(CAN_GENERATE))
-			return Boolean.TRUE;
-		if (propertyName.equals(XSD_FILES) || propertyName.equals(ECORE_FILES) || propertyName.equals(WSDL_FILES) || propertyName.equals(JAVA_FILES))
-			return Collections.EMPTY_LIST;
-		return super.getDefaultProperty(propertyName);
-	}
-
-	/**
-	 * @return
-	 */
-	protected Object getDefaultModelDirectory() {
-		IProject project = (IProject) getProperty(PROJECT);
-		if (project == null)
-			return null;
-		return project.getFolder(new Path("gen/src")); //$NON-NLS-1$
-	}
-
-	private void addFile(String propertyName, IFile file) {
-		if (file != null) {
-			List files;
-			if (!isSet(propertyName)) {
-				files = new ArrayList();
-				setProperty(propertyName, files);
-			} else
-				files = (List) getProperty(propertyName);
-			files.add(file);
-		}
-	}
-
-	public void addXSDFile(IFile file) {
-		addFile(XSD_FILES, file);
-	}
-
-	public void addEcoreFile(IFile file) {
-		addFile(ECORE_FILES, file);
-	}
-
-	public void addWSDLFile(IFile file) {
-		addFile(WSDL_FILES, file);
-	}
-
-	public void addJavaFile(IFile file) {
-		addFile(JAVA_FILES, file);
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/operation/EditModelOperation.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/operation/EditModelOperation.java
deleted file mode 100644
index 0816e2a..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/operation/EditModelOperation.java
+++ /dev/null
@@ -1,109 +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 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.internal.emfworkbench.operation;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.common.command.CommandStack;
-import org.eclipse.jem.util.UIContextDetermination;
-import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
-import org.eclipse.wst.common.frameworks.internal.operations.IOperationHandler;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperation;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
-import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
-import org.eclipse.wst.common.internal.emfworkbench.integration.EditModel;
-import org.eclipse.wst.common.internal.emfworkbench.validateedit.IValidateEditContext;
-
-public abstract class EditModelOperation extends WTPOperation {
-	protected EditModel editModel;
-	protected EMFWorkbenchContext emfWorkbenchContext;
-	private CommandStack commandStack;
-
-	public EditModelOperation(EditModelOperationDataModel dataModel) {
-		super(dataModel);
-	}
-
-	public EditModelOperation() {
-		//Default constructor
-	}
-
-	protected final void initilize(IProgressMonitor monitor) {
-		EditModelOperationDataModel dataModel = (EditModelOperationDataModel) operationDataModel;
-		emfWorkbenchContext = (EMFWorkbenchContext) WorkbenchResourceHelperBase.createEMFContext(dataModel.getTargetProject(), null);
-		editModel = emfWorkbenchContext.getEditModelForWrite(dataModel.getStringProperty(EditModelOperationDataModel.EDIT_MODEL_ID), this);
-		doInitialize(monitor);
-	}
-
-	protected void doInitialize(IProgressMonitor monitor) {
-		//init
-	}
-
-	protected final void dispose(IProgressMonitor monitor) {
-		try {
-			doDispose(monitor);
-		} finally {
-			saveEditModel(monitor);
-		}
-	}
-
-	private final void saveEditModel(IProgressMonitor monitor) {
-		if (null != editModel) {
-			if (((EditModelOperationDataModel) operationDataModel).getBooleanProperty(EditModelOperationDataModel.PROMPT_ON_SAVE))
-				editModel.saveIfNecessaryWithPrompt(monitor, (IOperationHandler) operationDataModel.getProperty(WTPOperationDataModel.UI_OPERATION_HANLDER), this);
-			else
-				editModel.saveIfNecessary(monitor, this);
-			editModel.releaseAccess(this);
-			editModel = null;
-		}
-		postSaveEditModel(monitor);
-	}
-
-	/**
-	 * @param monitor
-	 */
-	protected void postSaveEditModel(IProgressMonitor monitor) {
-		// do nothing by default
-	}
-
-	protected void doDispose(IProgressMonitor monitor) {
-		//dispose
-	}
-
-	/**
-	 * @return Returns the commandStack.
-	 */
-	public CommandStack getCommandStack() {
-		if (commandStack == null && editModel != null)
-			commandStack = editModel.getCommandStack();
-		return commandStack;
-	}
-
-	/**
-	 * @param commandStack
-	 *            The commandStack to set.
-	 */
-	public void setCommandStack(CommandStack commandStack) {
-		this.commandStack = commandStack;
-	}
-
-	/**
-	 * @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperation#validateEdit()
-	 */
-	protected boolean validateEdit() {
-		IValidateEditContext validator = (IValidateEditContext) UIContextDetermination.createInstance(IValidateEditContext.CLASS_KEY);
-		return validator.validateState(editModel).isOK();
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/operation/EditModelOperationDataModel.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/operation/EditModelOperationDataModel.java
deleted file mode 100644
index f6f22d7..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/operation/EditModelOperationDataModel.java
+++ /dev/null
@@ -1,64 +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 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.internal.emfworkbench.operation;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.wst.common.frameworks.internal.operations.ProjectCreationDataModel;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
-import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
-import org.eclipse.wst.common.internal.emfworkbench.integration.EditModel;
-
-import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
-
-public abstract class EditModelOperationDataModel extends WTPOperationDataModel {
-
-	/**
-	 * Required
-	 */
-	public static final String PROJECT_NAME = "EditModelOperationDataModel.PROJECT_NAME"; //$NON-NLS-1$
-	/**
-	 * Required
-	 */
-	public static final String EDIT_MODEL_ID = "EditModelOperationDataModel.EDIT_MODEL_ID"; //$NON-NLS-1$
-	/**
-	 * Optional, should save with prompt...defaults to false
-	 */
-	public static final String PROMPT_ON_SAVE = "EditModelOperationDataModel.PROMPT_ON_SAVE"; //$NON-NLS-1$
-
-	protected void initValidBaseProperties() {
-		super.initValidBaseProperties();
-		addValidBaseProperty(PROJECT_NAME);
-		addValidBaseProperty(EDIT_MODEL_ID);
-		addValidBaseProperty(PROMPT_ON_SAVE);
-	}
-
-	public IProject getTargetProject() {
-		return ProjectCreationDataModel.getProjectHandleFromProjectName(getStringProperty(PROJECT_NAME));
-	}
-
-	protected Object getDefaultProperty(String propertyName) {
-		if (propertyName.equals(PROMPT_ON_SAVE))
-			return Boolean.FALSE;
-		return super.getDefaultProperty(propertyName);
-	}
-
-	public final EditModel getEditModelForRead(Object key) {
-		EMFWorkbenchContext emfWorkbenchContext = (EMFWorkbenchContext) WorkbenchResourceHelperBase.createEMFContext(getTargetProject(), null);
-		return emfWorkbenchContext.getEditModelForRead(getStringProperty(EDIT_MODEL_ID), key);
-	}
-
-}
\ No newline at end of file
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 e0a52f6..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/validateedit/ResourceStateValidator.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.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 0cfa000..0000000
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/validateedit/ResourceStateValidatorImpl.java
+++ /dev/null
@@ -1,445 +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.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.wst.common.internal.emf.resource.ReferencedResource;
-import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
-
-import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
-
-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;
-	}
-}
\ No newline at end of file
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.frameworks.ui/.classpath b/plugins/org.eclipse.wst.common.frameworks.ui/.classpath
deleted file mode 100644
index beda00a..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.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<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 800bb16..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-bin
-temp.folder
-build.xml
-wtp_ui.jar
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/build.properties b/plugins/org.eclipse.wst.common.frameworks.ui/build.properties
deleted file mode 100644
index 72b3e59..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/build.properties
+++ /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
-###############################################################################
-output.wtp_ui.jar = bin/
-bin.includes = plugin.xml,\
-               wtp_ui.jar
-source.wtp_ui.jar = wtp_ui/,\
-                    property_files/
-src.includes = schema/
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 3e7d622..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/plugin.properties
+++ /dev/null
@@ -1,12 +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
-###############################################################################
-Cut=Cut
-FLEXIBLE_PROJECT_PREFERENCE=Flexible Java Project Preference
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 0ab571f..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/plugin.xml
+++ /dev/null
@@ -1,93 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="org.eclipse.wst.common.frameworks.ui"
-   name="WTP UI Plug-in"
-   version="1.0.0"
-   provider-name=""
-   description="This is a holding place for common frameworks UI used by components used in WTP currently it includes the following frameworks: Entendable Wizards, Extendable Actions"
-   class="org.eclipse.wst.common.frameworks.internal.ui.WTPUIPlugin">
-
-   <runtime>
-      <library name="wtp_ui.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.ui.ide"/>
-      <import plugin="org.eclipse.core.resources"/>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.wst.common.frameworks" export="true"/>
-      <import plugin="org.eclipse.core.runtime"/>
-   </requires>
-
-
-   <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>
-   -->
-   <extension
-   		id="PasteActionOperationExtendibleOperation"
-         point="org.eclipse.wst.common.frameworks.ExtendableOperation">
-      <extendableOperation
-            class="org.eclipse.wst.common.frameworks.internal.operation.extension.ui.PasteActionOperation"
-            id="org.eclipse.wst.common.frameworks.internal.operation.extension.ui.PasteActionOperation"/>
-   </extension> 
-   
-<!-- ====================================================== -->
-<!--           Flexible Java Project preference page                   -->
-<!-- ====================================================== -->
-   <extension
-         point="org.eclipse.ui.preferencePages">
-      <page
-            name="%FLEXIBLE_PROJECT_PREFERENCE"
-            class="org.eclipse.wst.common.frameworks.internal.ui.FlexibleJavaProjectPreferencePage"
-            id="FlexibleJavaProjectPreferencePage">
-      </page>
-   </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 9e8a4b5..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/property_files/wtpcommonui.properties
+++ /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
-###############################################################################
-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:
\ No newline at end of file
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 9c4b4ac..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/schema/DataModelWizardExtension.exsd
+++ /dev/null
@@ -1,109 +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="DataModelWizard"/>
-      </appInfo>
-      <documentation>
-         [Enter description of this extension point.]
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="DataModelWizard"/>
-         </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="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>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         
-      </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 ba2556d..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/schema/extendableWizard.exsd
+++ /dev/null
@@ -1,99 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="com.ibm.etools.emf.workbench.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="com.ibm.etools.emf.workbench.ui" id="editModelEditor" name="Edit Model Editor"/>
-      </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>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="extendableWizard">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         6.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         
-      </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 9dc6e0c..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/schema/extendableWizardPage.exsd
+++ /dev/null
@@ -1,139 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="com.ibm.etools.emf.workbench.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="com.ibm.etools.emf.workbench.ui" id="editModelEditor" name="Edit Model Editor"/>
-      </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>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="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>
-         6.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         
-      </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 7066b3f..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/schema/extendedViewer.exsd
+++ /dev/null
@@ -1,134 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="com.ibm.wtp.common.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="com.ibm.wtp.common.ui" id="extendedViewer" name="Extended Viewer"/>
-      </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>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="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>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         
-      </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 fcffea2..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/schema/wtpuiAction.exsd
+++ /dev/null
@@ -1,351 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="com.ibm.wtp.common.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="com.ibm.wtp.common.ui" id="WTPUIOperation" name="WTP UI Operation"/>
-      </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>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="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 extend com.ibm.wtp.common.operation.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>
-                  An implementation of com.ibm.wtp.common.operation.extension.ui.WTPOperationDataModelUICreator. 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 extend com.ibm.wtp.common.operation.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>
-         6.0.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         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.
-&lt;pre&gt;
-   &lt;extension
-         point=&quot;com.ibm.wtp.common.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;   
-
-For each of the slaveOperations referenced above, you must have a corresponding WTP Operation Extension declared similar to the following:
- 
-&lt;pre&gt; 
-   &lt;extension
-         id=&quot;wtpuiAciton.Acme.Extensions&quot;
-         point=&quot;com.ibm.wtp.common.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;com.ibm.wtp.common.OperationExtension&quot;&gt;
-      &lt;!-- Made optional by the above declaration --&gt;
-      &lt;operationExtension
-            preOperationClass=&quot;com.acme.ui.operation.SlaveOperationA&quot;
-            id=&quot;com.acme.ui.operation.MasterOperationA&quot;&gt;
-      &lt;/operationExtension&gt; 
-      &lt;!-- Made optional by the above declaration --&gt;
-      &lt;operationExtension
-            postOperationClass=&quot;com.acme.ui.operation.SlaveOperationB&quot;
-            id=&quot;com.acme.ui.operation.SlaveOperationA&quot;&gt;
-      &lt;/operationExtension&gt;   
-      &lt;!-- Non-optional operation, will always run --&gt;
-      &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;
-
-In general, users extending existing actions only need to declare the following: 
-&lt;pre&gt;
- &lt;extension
-         point=&quot;com.ibm.wtp.common.OperationExtension&quot;&gt; 
- &lt;!-- The action referenced must be declared as extensible by the   com.ibm.wtp.common.ExtendableOperation extension point --&gt;         
-      &lt;operationExtension
-            preOperationClass=&quot;...YOUR CLASS...&quot;            
-            id=&quot;...ID OF EXISTING OPERATION...&quot;&gt; 
-      &lt;/operationExtension&gt; 
- &lt;/extension&gt;      
-&lt;/pre&gt;      
-
-And if your operation is optional declare the slaveOperation:
-
-&lt;pre&gt; 
-   &lt;extension
-         point=&quot;com.ibm.wtp.common.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;
-      </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>
-         
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/DataModelExtendedWizardPage.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/DataModelExtendedWizardPage.java
deleted file mode 100644
index 7404233..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/DataModelExtendedWizardPage.java
+++ /dev/null
@@ -1,44 +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.datamodel.ui;
-
-import org.eclipse.core.internal.runtime.Assert;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPCommonUIResourceHandler;
-
-/**
- * This class is EXPERIMENTAL and is subject to substantial changes.
- */
-public abstract class DataModelExtendedWizardPage extends DataModelWizardPage implements IDMExtendedWizardPage {
-
-	private String id;
-
-	protected DataModelExtendedWizardPage(IDataModel model, String pageName) {
-		super(model, pageName);
-	}
-
-	/**
-	 * @return Returns the id.
-	 */
-	public final String getGroupID() {
-		return id;
-	}
-
-	/**
-	 * Will only set the id once. Further invocations will be ignored.
-	 * 
-	 * @param id
-	 *            The id to set.
-	 */
-	public final void setGroupID(String id) {
-		Assert.isTrue(this.id == null, WTPCommonUIResourceHandler.getString("ExtendedWizardPage_ERROR_0")); //$NON-NLS-1$
-		Assert.isNotNull(id, WTPCommonUIResourceHandler.getString("ExtendedWizardPage_ERROR_1")); //$NON-NLS-1$
-		this.id = id;
-	}
-}
\ 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/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 c4c6ab3..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/DataModelSynchHelper.java
+++ /dev/null
@@ -1,555 +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.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.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 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();
-				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(String propertyName, int flag) {
-		if (null != propertyToWidgetHash && propertyToWidgetHash.containsKey(propertyName)) {
-			try {
-				// dataModel.setIgnorePropertyChanges(true);
-				currentWidget = (Widget) propertyToWidgetHash.get(propertyName);
-				if (currentWidget != null && currentWidget != currentWidgetFromEvent) {
-					ignoreModifyEvent = true;
-					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(propertyName);
-				}
-			} finally {
-				currentWidget = null;
-				// dataModel.setIgnorePropertyChanges(false);
-			}
-		}
-	}
-
-	/**
-	 * @param control
-	 */
-	private void setEnablement(String propertyName) {
-		if (currentWidget == null)
-			return;
-		setEnablement((Control) currentWidget, dataModel.isPropertyEnabled(propertyName));
-	}
-
-	/**
-	 * @param control
-	 * @param enabled
-	 */
-	private void setEnablement(Control control, boolean enabled) {
-		if (control.isEnabled() != enabled)
-			control.setEnabled(enabled);
-		setDependentControlEnablement(control, enabled);
-	}
-
-	private void setEnablement(String propertyName, boolean enabled) {
-		if (propertyToWidgetHash != null) {
-			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;
-	}
-}
\ 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/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 dc64df8..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/DataModelWizard.java
+++ /dev/null
@@ -1,371 +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.datamodel.ui;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jface.util.Assert;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.swt.widgets.Composite;
-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.AdaptabilityUtility;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ExtendableOperationImpl;
-import org.eclipse.wst.common.frameworks.internal.enablement.IEnablementManager;
-import org.eclipse.wst.common.frameworks.internal.operation.extensionui.DMWizardPageElement;
-import org.eclipse.wst.common.frameworks.internal.operation.extensionui.DMWizardPageExtensionManager;
-import org.eclipse.wst.common.frameworks.internal.ui.ErrorDialog;
-import org.eclipse.wst.common.frameworks.internal.ui.RunnableOperationWrapper;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPCommonUIResourceHandler;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPUIPlugin;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPWizardSkipPageDataModel;
-
-
-/**
- * This class is EXPERIMENTAL and is subject to substantial changes.
- */
-public abstract class DataModelWizard extends Wizard {
-
-	private IDMExtendedWizardPage[] extendedPages = null;
-	private IDMExtendedPageHandler[] extendedPageHandlers = null;
-
-	private IDataModel dataModel;
-
-	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();
-	}
-
-	/**
-	 * The <code>Wizard</code> implementation of this <code>IWizard</code>
-	 * method creates all the pages controls using
-	 * <code>IDialogPage.createControl</code>. Subclasses should reimplement
-	 * this method if they want to delay creating one or more of the pages
-	 * lazily. The framework ensures that the contents of a page will be created
-	 * before attempting to show it.
-	 */
-	public void createPageControls(Composite pageContainer) {
-		IWizardPage[] pages = getPages();
-		// the default behavior is to create all the pages controls
-		for (int i = 0; i < pages.length; i++) {
-			if (isExtendedPage(pages[i])) {
-				try {
-					pages[i].createControl(pageContainer);
-				} catch (Exception e) {
-					Logger.getLogger().logError(e);
-					continue;
-				}
-			} else {
-				pages[i].createControl(pageContainer);
-			}
-			// page is responsible for ensuring the created control is
-			// accessable
-			// via getControl.
-			Assert.isNotNull(pages[i].getControl());
-		}
-	}
-
-	protected boolean isExtendedPage(IWizardPage page) {
-		for (int i = 0; null != extendedPages && i < extendedPages.length; i++) {
-			if (page == extendedPages[i]) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-
-	/**
-	 * This is finalized to handle the adding of extended pages. Clients should
-	 * override doAddPages() to add their pages.
-	 */
-	public final void addPages() {
-		doAddPages();
-		addExtensionPages();
-	}
-
-	/**
-	 * Subclasses should override this method to add pages.
-	 */
-	protected void doAddPages() {
-
-	}
-
-	private void addExtensionPages() {
-		String wizardID = getWizardID();
-		DMWizardPageElement wizElement = null;
-		if (wizardID == null)
-			return;
-		DMWizardPageElement[] elements = DMWizardPageExtensionManager.getInstance().getPageElements(getWizardID());
-		IDMExtendedWizardPage[] extendedPagesLocal = null;
-		IDMExtendedPageHandler extendedPageHandler = null;
-		List extendedPagesList = new ArrayList();
-		List extendedPageHandlerList = new ArrayList();
-		for (int i = 0; i < elements.length; i++) {
-			wizElement = elements[i];
-			try {
-				extendedPagesLocal = wizElement.createPageGroup(getDataModel());
-				if (null != extendedPagesLocal) {
-					for (int j = 0; j < extendedPagesLocal.length; j++) {
-						addPage(extendedPagesLocal[j]);
-						extendedPagesList.add(extendedPagesLocal[j]);
-					}
-				}
-				extendedPageHandler = wizElement.createPageHandler(getDataModel());
-				if (null != extendedPageHandler && !extendedPageHandlerList.contains(extendedPageHandler)) {
-					extendedPageHandlerList.add(extendedPageHandler);
-				}
-			} catch (RuntimeException runtime) {
-				Logger.getLogger().logError(WTPCommonUIResourceHandler.getString("ExtendableWizard_UI_0", new Object[]{wizElement.getPluginID(), wizElement.pageGroupID})); //$NON-NLS-1$
-				Logger.getLogger().logError(runtime);
-			}
-		}
-		extendedPages = new IDMExtendedWizardPage[extendedPagesList.size()];
-		for (int i = 0; i < extendedPages.length; i++) {
-			extendedPages[i] = (IDMExtendedWizardPage) extendedPagesList.get(i);
-		}
-		extendedPageHandlers = new IDMExtendedPageHandler[extendedPageHandlerList.size()];
-		for (int i = 0; i < extendedPageHandlers.length; i++) {
-			extendedPageHandlers[i] = (IDMExtendedPageHandler) extendedPageHandlerList.get(i);
-		}
-	}
-
-	public IWizardPage getNextPage(IWizardPage page) {
-		IWizardPage expectedPage = super.getNextPage(page);
-		if (expectedPage instanceof IDMExtendedWizardPage) {
-			IDMExtendedWizardPage extendedWizardPage = (IDMExtendedWizardPage) expectedPage;
-			List extendedContext = getDataModel().getExtendedContext();
-			boolean enabled = true;
-			for (int contextCount = 0; enabled && contextCount < extendedContext.size(); contextCount++) {
-				IProject project = (IProject) AdaptabilityUtility.getAdapter(extendedContext.get(contextCount), IProject.class);
-				if (null != project && !IEnablementManager.INSTANCE.getIdentifier(extendedWizardPage.getGroupID(), project).isEnabled()) {
-					enabled = false;
-				}
-			}
-			if (!enabled)
-				return getNextPage(expectedPage);
-		}
-		String expectedPageName = (null == expectedPage) ? null : expectedPage.getName();
-		String nextPageName = null;
-		for (int i = 0; null != extendedPageHandlers && i < extendedPageHandlers.length; i++) {
-			nextPageName = extendedPageHandlers[i].getNextPage(page.getName(), expectedPageName);
-			if (null != nextPageName) {
-				if (nextPageName.equals(IDMExtendedPageHandler.SKIP_PAGE)) {
-					return getNextPage(expectedPage);
-				} else if (nextPageName.startsWith(IDMExtendedPageHandler.PAGE_AFTER)) {
-					String tempNextPageName = nextPageName.substring(IDMExtendedPageHandler.PAGE_AFTER.length());
-					IWizardPage tempNextPage = getPage(tempNextPageName);
-					return null == tempNextPage ? null : super.getNextPage(tempNextPage);
-				}
-				return getPage(nextPageName);
-			}
-		}
-		return expectedPage;
-	}
-
-	public IWizardPage getPreviousPage(IWizardPage page) {
-		IWizardPage expectedPage = super.getPreviousPage(page);
-		String expectedPageName = (null == expectedPage) ? null : expectedPage.getName();
-		String previousPageName = null;
-		for (int i = 0; null != extendedPageHandlers && i < extendedPageHandlers.length; i++) {
-			previousPageName = extendedPageHandlers[i].getPreviousPage(page.getName(), expectedPageName);
-			if (null != previousPageName) {
-				if (previousPageName.equals(IDMExtendedPageHandler.SKIP_PAGE)) {
-					return getPreviousPage(expectedPage);
-				} else if (previousPageName.startsWith(IDMExtendedPageHandler.PAGE_AFTER)) {
-					String tempPreviousPageName = previousPageName.substring(IDMExtendedPageHandler.PAGE_AFTER.length());
-					IWizardPage tempPreviousPage = getPage(tempPreviousPageName);
-					return null == tempPreviousPage ? null : super.getPreviousPage(tempPreviousPage);
-				}
-				return getPage(previousPageName);
-			}
-		}
-		return expectedPage;
-	}
-
-	public boolean canFinish() {
-		if (!super.canFinish() || !getDataModel().isValid()) {
-			return false;
-		}
-		for (int i = 0; null != extendedPages && i < extendedPages.length; i++) {
-			if (!extendedPages[i].canPageFinish()) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	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() {
-		IUndoableOperation op = null;
-		boolean wasSuccessful = false;
-		try {
-			if (prePerformFinish()) {
-				storeDefaultSettings();
-				op = createOperation();
-				if (op != null) {
-					RunnableOperationWrapper runnable = WTPUIPlugin.getRunnableWithProgress(op);
-					try {
-						getContainer().run(runForked(), isCancelable(), runnable);
-						postPerformFinish();
-					} catch (InvocationTargetException e) {
-						Logger.getLogger().logError(e);
-						ErrorDialog.openError(getShell(), WTPCommonUIResourceHandler.getString("WTPWizard_UI_0", new Object[]{getWindowTitle()}), WTPCommonUIResourceHandler.getString("WTPWizard_UI_1", new Object[]{getWindowTitle()}), e, 0, false); //$NON-NLS-1$ //$NON-NLS-2$
-						wasSuccessful = false;
-						return wasSuccessful;
-					} catch (InterruptedException e) {
-						Logger.getLogger().logError(e);
-						wasSuccessful = false;
-						return wasSuccessful;
-					}
-					wasSuccessful = isSuccessfulFinish(runnable.getStatus());
-				}
-			}
-			return wasSuccessful;
-		} finally {
-			if (!wasSuccessful) {
-				resetAfterFinishError();
-			}
-		}
-	}
-
-	protected boolean isSuccessfulFinish(IStatus status) {
-		return status.isOK();
-	}
-
-	/**
-	 * 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;
-	}
-
-	private IUndoableOperation createOperation() {
-		ExtendableOperationImpl baseOperation = (ExtendableOperationImpl) getDataModel().getDefaultOperation();
-		for (int i = 0; null != extendedPages && i < extendedPages.length; i++) {
-			IDataModelOperation op = extendedPages[i].createOperation();
-			if (op != null) {
-				baseOperation.appendOperation(op);
-			}
-		}
-		return baseOperation;
-	}
-
-	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();
-		}
-	}
-
-	public void addPage(IWizardPage page) {
-		if (getDataModel().isProperty(WTPWizardSkipPageDataModel.SKIP_PAGES) && null != page.getName()) {
-			List pagesToSkip = (List) getDataModel().getProperty(WTPWizardSkipPageDataModel.SKIP_PAGES);
-			if (null != pagesToSkip && pagesToSkip.contains(page.getName())) {
-				return;
-			}
-		}
-		super.addPage(page);
-	}
-}
\ 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/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 76cdd74..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/DataModelWizardPage.java
+++ /dev/null
@@ -1,391 +0,0 @@
-package org.eclipse.wst.common.frameworks.internal.datamodel.ui;
-
-/*
- * Licensed Material - Property of IBM (C) Copyright IBM Corp. 2001, 2002 - All Rights Reserved. US
- * Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP
- * Schedule Contract with IBM Corp.
- */
-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.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.help.WorkbenchHelp;
-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;
-
-	/**
-	 * 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));
-		}
-	}
-
-	/**
-	 * 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)
-			WorkbenchHelp.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 {
-			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/IDMExtendedPageHandler.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/IDMExtendedPageHandler.java
deleted file mode 100644
index 7319f8a..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/IDMExtendedPageHandler.java
+++ /dev/null
@@ -1,57 +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.datamodel.ui;
-
-/**
- * This interface is EXPERIMENTAL and is subject to substantial changes.
- */
-public interface IDMExtendedPageHandler {
-
-	/**
-	 * 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);
-}
\ 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/IDMExtendedWizardPage.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/IDMExtendedWizardPage.java
deleted file mode 100644
index b8615f2..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/IDMExtendedWizardPage.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.frameworks.internal.datamodel.ui;
-
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
-
-/**
- * This interface is EXPERIMENTAL and is subject to substantial changes.
- */
-public interface IDMExtendedWizardPage extends IWizardPage {
-
-	IDataModelOperation createOperation();
-
-	boolean canPageFinish();
-
-	String getGroupID();
-
-	void setGroupID(String id);
-
-}
\ 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/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 d4fd69a..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, 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 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$
-
-}
\ 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/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 5433335..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardExtensionFactory.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.operation.extensionui;
-
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.IDMExtendedPageHandler;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.IDMExtendedWizardPage;
-
-/**
- * This interface is EXPERIMENTAL and is subject to substantial changes.
- */
-public abstract class DMWizardExtensionFactory {
-
-	public DMWizardExtensionFactory() {
-		super();
-	}
-
-	public abstract IDMExtendedWizardPage[] createPageGroup(IDataModel dataModel, String pageGroupID);
-
-	/*
-	 * this is optional
-	 */
-	public IDMExtendedPageHandler createPageHandler(IDataModel dataModel, String pageGroupID) {
-		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/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 a70818a..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageElement.java
+++ /dev/null
@@ -1,227 +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.operation.extensionui;
-
-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.IDMExtendedPageHandler;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.IDMExtendedWizardPage;
-import org.eclipse.wst.common.frameworks.internal.enablement.IdentifiableComparator;
-
-public class DMWizardPageElement extends AbstractRegistryDescriptor implements Comparable {
-	/** Type designation for an {@link ExtendedEditorPage} */
-	public static final int EXTENDED_EDITOR_PAGE = 0;
-	/** Type designation for a nested editor */
-	public static final int NESTED_EDITOR = 1;
-	static final String[] EMPTY_STRING_ARRAY = new String[0];
-	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_GROUP_ID = "groupID"; //$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 pageInsertionID;
-	private int loadOrder;
-	private static int loadOrderCounter;
-
-
-	private int type;
-
-	public DMWizardPageElement(IConfigurationElement element1) {
-		super(element1);
-		pluginID = element1.getDeclaringExtension().getDeclaringPluginDescriptor().getUniqueIdentifier();
-		wizardID = element1.getAttribute(ATT_WIZARD_ID);
-		pageGroupID = element1.getAttribute(ATT_PAGE_ID);
-		readAllowsExtendedPageAfter(element1);
-		pageInsertionID = element1.getAttribute(ATT_PAGE_INSERTION_ID);
-		readFactory(element1);
-		validateSettings();
-		loadOrder = loadOrderCounter++;
-	}
-
-	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 IDMExtendedPageHandler createPageHandler(IDataModel dataModel) {
-		if (wizardPageFactoryElement != null)
-			return wizardPageFactoryElement.createPageHandler(dataModel);
-		return null;
-	}
-
-	public IDMExtendedWizardPage[] createPageGroup(IDataModel dataModel) {
-		if (wizardPageFactoryElement != null)
-			return wizardPageFactoryElement.createPageGroup(dataModel);
-		return null;
-	}
-
-
-	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;
-	}
-
-	/**
-	 * @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();
-	}
-
-}
\ 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/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 091bbf2..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageExtensionManager.java
+++ /dev/null
@@ -1,277 +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.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.getPluginRegistry().getExtensionPoint(ORG_ECLIPSE_UI, "exportWizards"), //$NON-NLS-1$
-					Platform.getPluginRegistry().getExtensionPoint(ORG_ECLIPSE_UI, "importWizards"), //$NON-NLS-1$
-					Platform.getPluginRegistry().getExtensionPoint(ORG_ECLIPSE_UI, "newWizards"), //$NON-NLS-1$
-					Platform.getPluginRegistry().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().getDeclaringPluginDescriptor().getUniqueIdentifier();
-				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("WizardPageExtensionManager_UI_0", new Object[]{parentElement.getPageID()})); //$NON-NLS-1$
-				Logger.getLogger().logError(WTPCommonUIResourceHandler.getString("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("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.getString("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("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;
-	}
-}
\ 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/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 68fedc8..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageFactoryElement.java
+++ /dev/null
@@ -1,88 +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.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.IDMExtendedPageHandler;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.IDMExtendedWizardPage;
-
-/**
- * @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 IDMExtendedPageHandler createPageHandler(IDataModel dataModel) {
-		if (!isPageFactoryInitialized)
-			initPageFactory();
-		if (wizardPageFactory == null)
-			return null;
-
-		IDMExtendedPageHandler handler = wizardPageFactory.createPageHandler(dataModel, pageGroupID);
-		return handler;
-	}
-
-	public IDMExtendedWizardPage[] createPageGroup(IDataModel dataModel) {
-		if (!isPageFactoryInitialized)
-			initPageFactory();
-
-		if (wizardPageFactory == null)
-			return null;
-
-		IDMExtendedWizardPage[] pages = wizardPageFactory.createPageGroup(dataModel, pageGroupID);
-		for (int i = 0; i < pages.length; i++) {
-			pages[i].setGroupID(pageGroupID);
-		}
-		return pages;
-	}
-
-	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;
-		}
-	}
-
-
-}
\ 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/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 2b4534b..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DataModelWizardExtensionReader.java
+++ /dev/null
@@ -1,86 +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.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-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";
-	private static final String ELEMENT = "DataModelWizard";
-	private static final String ATTRIBUTE_ID = "id";
-	private static final String ATTRIBUTE_CLASS = "class";
-
-	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));
-		}
-		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));
-		}
-		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));
-		}
-		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);
-		}
-		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 2a1f77b..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/ExtensibleViewRegistry.java
+++ /dev/null
@@ -1,173 +0,0 @@
-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.wst.common.frameworks.internal.ui.WTPUIPlugin;
-
-import org.eclipse.jem.util.RegistryReader;
-
-/*
- * Licensed Material - Property of IBM (C) Copyright IBM Corp. 2001, 2002 - All
- * Rights Reserved. US Government Users Restricted Rights - Use, duplication or
- * disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
- */
-
-/**
- * @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;
-		}
-	}
-
-}
\ 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/IActionWTPOperation.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/IActionWTPOperation.java
deleted file mode 100644
index 8970381..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/IActionWTPOperation.java
+++ /dev/null
@@ -1,139 +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 10, 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;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.runtime.CoreException;
-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.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IActionDelegate;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.wst.common.frameworks.internal.operations.NonConflictingRule;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperation;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPCommonUIResourceHandler;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPUIPlugin;
-
-
-/**
- * @author mdelder
- *  
- */
-public class IActionWTPOperation extends WTPOperation {
-
-	private static final ISchedulingRule nonconflictingRule = new NonConflictingRule();
-
-	boolean done;
-
-	/**
-	 *  
-	 */
-	public IActionWTPOperation() {
-		super();
-	}
-
-	/**
-	 * @param operationDataModel
-	 */
-	public IActionWTPOperation(WTPOperationDataModel operationDataModel) {
-		super(operationDataModel);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperation#execute(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	protected void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException {
-
-		final IAction action = (IAction) getOperationDataModel().getProperty(IActionWTPOperationDataModel.IACTION);
-		if (action == null)
-			throw new CoreException(new Status(IStatus.WARNING, WTPUIPlugin.PLUGIN_ID, 0, WTPCommonUIResourceHandler.getString("IActionWTPOperation_UI_0"), null)); //$NON-NLS-1$
-
-		final ISelection selection = (IStructuredSelection) getOperationDataModel().getProperty(IActionWTPOperationDataModel.ISTRUCTURED_SELECTION);
-		final ISelectionProvider selectionProvider = (ISelectionProvider) getOperationDataModel().getProperty(IActionWTPOperationDataModel.ISELECTION_PROVIDER);
-
-		/*
-		 * if(selectionProvider != null) selection = (selection != null) ? selection :
-		 * selectionProvider.getSelection();
-		 */
-		Shell shell = (Shell) getOperationDataModel().getProperty(IActionWTPOperationDataModel.SHELL);
-		done = false;
-
-		Runnable executeAction = new Runnable() {
-
-			public void run() {
-				try {
-					if (action instanceof IActionDelegate) {
-						((IActionDelegate) action).selectionChanged(action, selection);
-						((IActionDelegate) action).run(action);
-					} else if (action instanceof IViewActionDelegate) {
-						((IViewActionDelegate) action).selectionChanged(action, selection);
-						((IActionDelegate) action).run(action);
-					} /*else if (action instanceof SelectionDispatchAction) {
-						((SelectionDispatchAction) action).update(selection);
-						((SelectionDispatchAction) action).run();
-					} */
-					  else if (action instanceof ISelectionChangedListener) {
-					   	((ISelectionChangedListener)action).selectionChanged(new SelectionChangedEvent(selectionProvider, selection)); 
-					   	action.run(); 
-					}
-
-
-				} catch (RuntimeException e) {
-					e.printStackTrace();
-				} finally {
-					getOperationDataModel().dispose();
-					done = true;
-				}
-			}
-		};
-
-		Display current = Display.getCurrent();
-		if (current != null) {
-			executeAction.run();
-		} else {
-			shell.getDisplay().asyncExec(executeAction);
-		}
-
-		while (!done) {
-			Thread.sleep(100);
-		}
-	}
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperation#getSchedulingRule()
-	 */
-	protected ISchedulingRule getSchedulingRule() {
-		return nonconflictingRule;
-	}
-
-}
\ 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/IActionWTPOperationDataModel.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/IActionWTPOperationDataModel.java
deleted file mode 100644
index eded3bd..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/IActionWTPOperationDataModel.java
+++ /dev/null
@@ -1,179 +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 10, 2004
- *
- */
-package org.eclipse.wst.common.frameworks.internal.operation.extensionui;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IActionDelegate;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperation;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
-
-
-
-/**
- * @author mdelder
- *  
- */
-public class IActionWTPOperationDataModel extends WTPOperationDataModel implements IPropertyChangeListener {
-
-	public static final String IACTION = "IActionWTPOperationDataModel.IACTION"; //$NON-NLS-1$
-	public static final String ISTRUCTURED_SELECTION = "IActionWTPOperationDataModel.ISTRUCTURED_SELECTION"; //$NON-NLS-1$
-	public static final String ISELECTION_PROVIDER = "IActionWTPOperationDataModel.ISELECTION_PROVIDER"; //$NON-NLS-1$
-	public static final String SHELL = "IActionWTPOperationDataModel.SHELL"; //$NON-NLS-1$
-	public static final String ACTION_RAN_SUCCESSFULLY = "IActionWTPOperationDataModel.ACTION_RAN_SUCCESSFULLY"; //$NON-NLS-1$
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperationDataModel#initValidBaseProperties()
-	 */
-	protected void initValidBaseProperties() {
-		super.initValidBaseProperties();
-		addValidBaseProperty(IACTION);
-		addValidBaseProperty(ISTRUCTURED_SELECTION);
-		addValidBaseProperty(ISELECTION_PROVIDER);
-		addValidBaseProperty(SHELL);
-		addValidBaseProperty(ACTION_RAN_SUCCESSFULLY);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperationDataModel#getDefaultOperation()
-	 */
-	public WTPOperation getDefaultOperation() {
-		return new IActionWTPOperation(this);
-	}
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperationDataModel#isResultProperty(java.lang.String)
-	 */
-	protected boolean isResultProperty(String propertyName) {
-		if (ACTION_RAN_SUCCESSFULLY.equals(propertyName))
-			return true;
-		return super.isResultProperty(propertyName);
-	}
-
-	/**
-	 * @param action
-	 * @param selection
-	 * @param provider
-	 * @return
-	 */
-	public static WTPOperationDataModel createDataModel(IActionDelegate action, IStructuredSelection selection, ISelectionProvider provider, Shell shell) {
-		WTPOperationDataModel dataModel = new IActionWTPOperationDataModel();
-		dataModel.setProperty(IACTION, action);
-		dataModel.setProperty(ISTRUCTURED_SELECTION, selection);
-		dataModel.setProperty(ISELECTION_PROVIDER, provider);
-		dataModel.setProperty(SHELL, shell);
-		return dataModel;
-	}
-
-	/**
-	 * @param action
-	 * @param selection
-	 * @param provider
-	 * @return
-	 */
-	public static WTPOperationDataModel createDataModel(Action action, IStructuredSelection selection, ISelectionProvider provider, Shell shell) {
-		WTPOperationDataModel dataModel = new IActionWTPOperationDataModel();
-		dataModel.setProperty(IACTION, action);
-		dataModel.setProperty(ISTRUCTURED_SELECTION, selection);
-		dataModel.setProperty(ISELECTION_PROVIDER, provider);
-		dataModel.setProperty(SHELL, shell);
-		return dataModel;
-	}
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperationDataModel#doSetProperty(java.lang.String,
-	 *      java.lang.Object)
-	 */
-	protected boolean doSetProperty(String propertyName, Object propertyValue) {
-
-
-		if (IACTION.equals(propertyName)) {
-
-			IAction oldAction = (IAction) getProperty(IACTION);
-			if (oldAction != null)
-				oldAction.removePropertyChangeListener(this);
-
-			boolean result = super.doSetProperty(propertyName, propertyValue);
-
-			IAction newAction = (IAction) getProperty(IACTION);
-			if (newAction != null)
-				newAction.addPropertyChangeListener(this);
-
-			return result;
-		}
-		return super.doSetProperty(propertyName, propertyValue);
-	}
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperationDataModel#getDefaultProperty(java.lang.String)
-	 */
-	protected Object getDefaultProperty(String propertyName) {
-		if (ACTION_RAN_SUCCESSFULLY.equals(propertyName))
-			return Boolean.TRUE;
-		return super.getDefaultProperty(propertyName);
-	}
-
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperationDataModel#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-		IAction action = (IAction) getProperty(IACTION);
-		if (action != null)
-			action.removePropertyChangeListener(this);
-	}
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-	 */
-	public void propertyChange(PropertyChangeEvent event) {
-		IAction action = (IAction) getProperty(IACTION);
-		if (action == null || action != event.getSource())
-			return;
-		// TODO MDE Implement this method
-		//notifyListeners(event.getProperty(), 0, event.getOldValue(), event.getNewValue());
-		if (IAction.RESULT.equals(event.getProperty())) {
-			setProperty(ACTION_RAN_SUCCESSFULLY, event.getNewValue());
-		}
-
-	}
-
-}
\ 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/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 b144f92..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/IExtensibleViewFactory.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.eclipse.wst.common.frameworks.internal.operation.extensionui;
-
-/*
- * Licensed Material - Property of IBM 
- * (C) Copyright IBM Corp. 2001, 2002 - All Rights Reserved. 
- * US Government Users Restricted Rights - Use, duplication or disclosure 
- * restricted by GSA ADP Schedule Contract with IBM Corp. 
- */
-
-/**
- * @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/operation/extensionui/MasterDescriptor.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/MasterDescriptor.java
deleted file mode 100644
index f905f82..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/MasterDescriptor.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 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;
-
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.internal.ActionExpression;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPCommonUIResourceHandler;
-
-import org.eclipse.jem.util.logger.proxy.Logger;
-
-public class MasterDescriptor extends SlaveDescriptor {
-
-	public static final String MASTER_OPERATION = "masterOperation"; //$NON-NLS-1$
-
-	public static final String ATT_EXTENDED_OPERATION_ID = "extendedGenericId"; //$NON-NLS-1$
-
-	public static final String SELECTION_ENABLEMENT = "selectionEnablement"; //$NON-NLS-1$
-
-	private static final String ATT_POPULATOR_CLASS = "populatorClass"; //$NON-NLS-1$
-
-	private static final String ATT_ALWAYS_EXECUTE = "alwaysExecute"; //$NON-NLS-1$
-
-	private ActionExpression enablement;
-
-	private String extendedOperationId;
-
-	private WTPOperationDataModelUICreator creator;
-
-	private boolean alwaysExecute;
-
-
-	public MasterDescriptor(IConfigurationElement element) {
-		super(element);
-		init();
-	}
-
-	private void init() {
-		this.extendedOperationId = getElement().getAttribute(ATT_EXTENDED_OPERATION_ID);
-		if (null == extendedOperationId)
-			Logger.getLogger().log(WTPCommonUIResourceHandler.getString("MasterDescriptor_UI_0", new Object[]{ATT_EXTENDED_OPERATION_ID})); //$NON-NLS-1$
-
-
-		if (Boolean.valueOf(getElement().getAttribute(ATT_ALWAYS_EXECUTE)).booleanValue())
-			alwaysExecute = true;
-
-		IConfigurationElement[] elements = getElement().getChildren(SELECTION_ENABLEMENT);
-		if (elements.length == 1)
-			this.enablement = new ActionExpression(elements[0]);
-		else
-			Logger.getLogger().log(WTPCommonUIResourceHandler.getString("MasterDescriptor_ERROR_2")); //$NON-NLS-1$
-
-	}
-
-	/**
-	 * @return Returns the extendedOperationId.
-	 */
-	public String getExtendedOperationId() {
-		return extendedOperationId;
-	}
-
-
-	public boolean isEnabledFor(IStructuredSelection selection) {
-		if (getEnablement() == null)
-			return true;
-		boolean result = false;
-		for (Iterator itr = selection.iterator(); itr.hasNext();) {
-			result = getEnablement().isEnabledFor(itr.next());
-			if (result)
-				break;
-		}
-		return result;
-	}
-
-	public WTPOperationDataModelUICreator getCreator() {
-		if (creator == null) {
-			try {
-				creator = (WTPOperationDataModelUICreator) getElement().createExecutableExtension(ATT_POPULATOR_CLASS);
-			} catch (CoreException e) {
-				Logger.getLogger().logError(e);
-			}
-		}
-		return creator;
-	}
-
-	protected ActionExpression getEnablement() {
-		return enablement;
-	}
-
-
-	/**
-	 * @return Returns the alwaysExecute.
-	 */
-	public boolean isAlwaysExecute() {
-		return alwaysExecute;
-	}
-}
\ 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/PasteActionOperation.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/PasteActionOperation.java
deleted file mode 100644
index c09631c..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/PasteActionOperation.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 Aug 27, 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.operation.extensionui;
-
-
-/**
- * @author mdelder
- *  
- */
-public class PasteActionOperation extends IActionWTPOperation {
-
-	public PasteActionOperation() {
-		super();
-	}
-
-	public PasteActionOperation(PasteActionOperationDataModel opMdl) {
-		super(opMdl);
-	}
-
-}
\ 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/PasteActionOperationDataModel.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/PasteActionOperationDataModel.java
deleted file mode 100644
index dc12e79..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/PasteActionOperationDataModel.java
+++ /dev/null
@@ -1,290 +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 26, 2004
- */
-package org.eclipse.wst.common.frameworks.internal.operation.extensionui;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IActionDelegate;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperation;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
-
-//TODO This class has code commented out to get compile errors cleanup for Eclipse 3.1 as the internal classes ReorgResult and PasteActions have been removed in 3.1 - VKB
-
-/**
- * @author mdelder
- * 
- * TODO To change the template for this generated type comment go to Window - Preferences - Java -
- * Code Style - Code Templates
- * 
- */
-public class PasteActionOperationDataModel extends IActionWTPOperationDataModel {
-
-	/**
-	 * Result Property. A java.util.Map of old-types-to-new-types
-	 */
-	public static final String REFACTORED_RESOURCES = "PasteActionOperationDataModel.REFACTORED_RESOURCES"; //$NON-NLS-1$
-	public static final String DESTINATION = "PasteActionOperationDataModel.DESTINATION"; //$NON-NLS-1$
-	private Map prepasteSnapshot = new HashMap();
-	//TODO Needs Clean up of compile errors for Eclipse 3.1 - VKB
-	//private ReorgResult cachedResult;
-
-	/**
-	 * @param action
-	 * @param selection
-	 * @param provider
-	 * @return
-	 */
-	public static WTPOperationDataModel createDataModel(IActionDelegate action, IStructuredSelection selection, ISelectionProvider provider, Shell shell) {
-		WTPOperationDataModel dataModel = new PasteActionOperationDataModel();
-		dataModel.setProperty(IACTION, action);
-		dataModel.setProperty(ISTRUCTURED_SELECTION, selection);
-		dataModel.setProperty(ISELECTION_PROVIDER, provider);
-		dataModel.setProperty(SHELL, shell);
-		return dataModel;
-	}
-
-	/**
-	 * @param action
-	 * @param selection
-	 * @param provider
-	 * @return
-	 */
-	public static WTPOperationDataModel createDataModel(Action action, IStructuredSelection selection, ISelectionProvider provider, Shell shell) {
-		WTPOperationDataModel dataModel = new PasteActionOperationDataModel();
-		dataModel.setProperty(IACTION, action);
-		dataModel.setProperty(ISTRUCTURED_SELECTION, selection);
-		dataModel.setProperty(ISELECTION_PROVIDER, provider);
-		dataModel.setProperty(SHELL, shell);
-		return dataModel;
-	}
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.operation.extension.ui.IActionWTPOperationDataModel#initValidBaseProperties()
-	 */
-	protected void initValidBaseProperties() {
-		super.initValidBaseProperties();
-		addValidBaseProperty(REFACTORED_RESOURCES);
-		addValidBaseProperty(DESTINATION);
-	}
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperationDataModel#getDefaultOperation()
-	 */
-	public WTPOperation getDefaultOperation() {
-		return new PasteActionOperation(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.operation.extension.ui.IActionWTPOperationDataModel#isResultProperty(java.lang.String)
-	 */
-	protected boolean isResultProperty(String propertyName) {
-		if (REFACTORED_RESOURCES.equals(propertyName) || DESTINATION.equals(propertyName))
-			return true;
-		return super.isResultProperty(propertyName);
-	}
-
-	
-	/*
-	 * (non-Javadoc)
-	 * TODO Needs Clean up of compile errors for Eclipse 3.1 - VKB
-	 * @see org.eclipse.wst.common.frameworks.internal.operation.extension.ui.IActionWTPOperationDataModel#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-	 */
-//	public void propertyChange(PropertyChangeEvent event) {
-//		if (PasteAction.PASTE_PRE_NOTIFICATION.equals(event.getProperty())) {
-//
-//			ReorgResult result = (ReorgResult) event.getNewValue();
-//			updatePrepasteSnapshot(result);
-//		} else if (PasteAction.PASTE_RESULT_NOTIFICATION.equals(event.getProperty())) {
-//			//System.out.println("Caching result");
-//			cachedResult = (ReorgResult) event.getNewValue();
-//		} else if (IAction.RESULT.equals(event.getProperty()) && cachedResult != null) {
-//			//System.out.println("Applying cached result");
-//			fillMapAsNecessary(cachedResult);
-//
-//			Map refactorMap = cachedResult.getNameChanges();
-//			setProperty(REFACTORED_RESOURCES, refactorMap);
-//
-//			Object destination = cachedResult.getDestination();
-//			if (cachedResult.getResourcesToCopy().length == 1) {
-//				if (cachedResult.getResourcesToCopy()[0].equals(destination))
-//					destination = cachedResult.getResourcesToCopy()[0].getParent();
-//			} else if (cachedResult.getJavaElementsToCopy().length == 1) {
-//				if (cachedResult.getJavaElementsToCopy()[0].equals(destination))
-//					destination = cachedResult.getJavaElementsToCopy()[0].getParent();
-//			}
-//			setProperty(DESTINATION, destination);
-//			cachedResult = null;
-//
-//		}
-//		super.propertyChange(event);
-//	}
-	
-//	TODO Needs Clean up of compile errors for Eclipse 3.1 - VKB
-
-//	protected void updatePrepasteSnapshot(ReorgResult result) {
-//
-//		resetPrepasteSnapshot();
-//
-//		IContainer container = getContainerFromResult(result);
-//		if (container == null)
-//			return;
-//
-//		IResource resourceExisting = null;
-//
-//		IResource[] resources = result.getResourcesToCopy();
-//		if (resources != null) {
-//			for (int i = 0; i < resources.length; i++) {
-//				resourceExisting = getCorrespondingFileOrFolder(resources[i], new Path(resources[i].getName()), container);
-//				if (resourceExisting.exists())
-//					prepasteSnapshot.put(resourceExisting, new Long(resourceExisting.getModificationStamp()));
-//			}
-//		}
-//
-//		IJavaElement[] elements = result.getJavaElementsToCopy();
-//		if (elements != null) {
-//			for (int i = 0; i < elements.length; i++) {
-//				try {
-//					resourceExisting = getCorrespondingFileOrFolder(elements[i].getCorrespondingResource(), new Path(elements[i].getCorrespondingResource().getName()), container);
-//					if (resourceExisting != null && resourceExisting.exists())
-//						prepasteSnapshot.put(resourceExisting, new Long(resourceExisting.getModificationStamp()));
-//				} catch (JavaModelException e) {
-//				}
-//			}
-//		}
-//	}
-
-	/**
-	 *  
-	 */
-	private void resetPrepasteSnapshot() {
-		if (prepasteSnapshot == null)
-			prepasteSnapshot = new HashMap();
-		else
-			prepasteSnapshot.clear();
-	}
-	
-//	TODO Needs Clean up of compile errors for Eclipse 3.1 - VKB
-
-//	protected void fillMapAsNecessary(ReorgResult result) {
-//
-//		IContainer container = getContainerFromResult(result);
-//
-//		if (container == null)
-//			return;
-//
-//		/*
-//		 * If you Ctrl+C -> Ctrl+V a Project, you get no pre-notification and the prepasteSnapshot
-//		 * is null
-//		 */
-//		if (prepasteSnapshot == null)
-//			prepasteSnapshot = new HashMap();
-//
-//		Map nameChanges = result.getNameChanges();
-//
-//		IResource resourceExisting = null;
-//
-//		IResource[] resources = result.getResourcesToCopy();
-//		if (resources != null) {
-//			for (int i = 0; i < resources.length; i++) {
-//				resourceExisting = getCorrespondingFileOrFolder(resources[i], new Path(resources[i].getName()), container);
-//
-//				if (prepasteSnapshot.containsKey(resourceExisting)) {
-//					Long timestamp = (Long) prepasteSnapshot.get(resourceExisting);
-//					if (timestamp.longValue() != resourceExisting.getModificationStamp())
-//						nameChanges.put(resources[i], resourceExisting);
-//				} else
-//					nameChanges.put(resources[i], resourceExisting);
-//			}
-//		}
-//
-//		IJavaElement[] elements = result.getJavaElementsToCopy();
-//		if (elements != null) {
-//			for (int i = 0; i < elements.length; i++) {
-//				try {
-//					resourceExisting = getCorrespondingFileOrFolder(elements[i].getCorrespondingResource(), new Path(elements[i].getCorrespondingResource().getName()), container);
-//
-//					if (prepasteSnapshot.containsKey(resourceExisting)) {
-//						Long timestamp = (Long) prepasteSnapshot.get(resourceExisting);
-//						if (timestamp.longValue() != resourceExisting.getModificationStamp())
-//							nameChanges.put(elements[i].getCorrespondingResource(), resourceExisting);
-//					} else
-//						nameChanges.put(elements[i].getCorrespondingResource(), resourceExisting);
-//				} catch (JavaModelException e) {
-//				}
-//			}
-//		}
-//		resetPrepasteSnapshot();
-//	}
-//
-//	private IContainer getContainerFromResult(ReorgResult result) {
-//
-//		Object destination = result.getDestination();
-//
-//		IContainer container = null;
-//		if (result.getDestination() instanceof IContainer) {
-//			container = (IContainer) destination;
-//		} else if (destination instanceof IJavaElement) {
-//			IJavaElement containerElement = (IJavaElement) destination;
-//			IPackageFragment fragment = null;
-//			IPackageFragmentRoot fragmentRoot = null;
-//			switch (containerElement.getElementType()) {
-//				case IJavaElement.PACKAGE_FRAGMENT :
-//					fragment = (IPackageFragment) containerElement;
-//					break;
-//				case IJavaElement.PACKAGE_FRAGMENT_ROOT :
-//					fragmentRoot = (IPackageFragmentRoot) containerElement;
-//					break;
-//
-//			}
-//			try {
-//				if (fragmentRoot == null ^ fragment == null) {
-//					container = (fragmentRoot != null) ? (IContainer) fragmentRoot.getCorrespondingResource() : (IContainer) fragment.getCorrespondingResource();
-//				}
-//			} catch (JavaModelException e1) {
-//			}
-//		}
-//		return container;
-//	}
-
-	private IResource getCorrespondingFileOrFolder(IResource existing, IPath expectedPath, IContainer container) {
-		IResource resourceExisting = null;
-		switch (existing.getType()) {
-			case IResource.FOLDER :
-				resourceExisting = container.getFolder(expectedPath);
-				break;
-			case IResource.FILE :
-				resourceExisting = container.getFile(expectedPath);
-				break;
-		}
-		return resourceExisting;
-	}
-
-
-}
\ 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/PostPasteActionOperation.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/PostPasteActionOperation.java
deleted file mode 100644
index 644f68e..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/PostPasteActionOperation.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 Aug 27, 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.operation.extensionui;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.Map;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperation;
-
-
-
-/**
- * @author mdelder
- * 
- * TODO To change the template for this generated type comment go to Window - Preferences - Java -
- * Code Style - Code Templates
- */
-public class PostPasteActionOperation extends WTPOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperation#execute(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	protected void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException {
-		PasteActionOperationDataModel dataMdl = (PasteActionOperationDataModel) getOperationDataModel();
-
-		Map refactoredResourcesMap = (Map) dataMdl.getProperty(PasteActionOperationDataModel.REFACTORED_RESOURCES);
-		System.out.println(getClass().getName());
-		System.out.println("Map:" + refactoredResourcesMap); //$NON-NLS-1$
-
-		Object destination = dataMdl.getProperty(PasteActionOperationDataModel.DESTINATION);
-		System.out.println("Destination:" + destination); //$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/operation/extensionui/SlaveDescriptor.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/SlaveDescriptor.java
deleted file mode 100644
index 3222164..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/SlaveDescriptor.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 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;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperation;
-
-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 SlaveDescriptor {
-
-	public static final String SLAVE_OPERATION = "slaveOperation"; //$NON-NLS-1$
-
-	public static final String ATT_OPERATION_CLASS = "operationClass"; //$NON-NLS-1$
-	public static final String ATT_ID = "id"; //$NON-NLS-1$ 
-	private static final String ATT_OVERRIDE_ID = "overrideId"; //$NON-NLS-1$
-	public static final String ATT_NAME = "name"; //$NON-NLS-1$
-	public static final String ATT_DESCRIPTION = "description"; //$NON-NLS-1$
-
-	private String id;
-	private String name;
-	private String description;
-	private String operationClass;
-	private String overrideId;
-	private final IConfigurationElement element;
-
-	public SlaveDescriptor(IConfigurationElement element) {
-		this.element = element;
-		init();
-	}
-
-	private void init() {
-		this.id = this.element.getAttribute(ATT_ID);
-		this.overrideId = this.element.getAttribute(ATT_OVERRIDE_ID);
-		this.name = this.element.getAttribute(ATT_NAME);
-		this.description = this.element.getAttribute(ATT_DESCRIPTION);
-		this.operationClass = this.element.getAttribute(ATT_OPERATION_CLASS);
-	}
-
-	public String getDescription() {
-		return description;
-	}
-
-	public String getName() {
-		return name;
-	}
-
-	public WTPOperation createOperation() {
-		try {
-			return (WTPOperation) this.element.createExecutableExtension(ATT_OPERATION_CLASS);
-		} catch (CoreException e) {
-			Logger.getLogger().logError(e);
-		}
-		return null;
-	}
-
-	/**
-	 * @return Returns the element.
-	 */
-	protected IConfigurationElement getElement() {
-		return element;
-	}
-
-	/**
-	 * @return Returns the operationClass.
-	 */
-	public String getOperationClass() {
-		return operationClass;
-	}
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return getClass() + "[name=" + getName() + ", operationClass=" + getOperationClass() + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-	}
-
-	/**
-	 * @return Returns the id.
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * @return Returns the overrideId.
-	 */
-	public String getOverrideId() {
-		return overrideId;
-	}
-}
\ 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/UIOperationExtensionRegistry.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/UIOperationExtensionRegistry.java
deleted file mode 100644
index 96ff3b2..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/UIOperationExtensionRegistry.java
+++ /dev/null
@@ -1,187 +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.operation.extensionui;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jem.util.RegistryReader;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.wst.common.frameworks.internal.operations.OperationExtensionRegistry;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPUIPlugin;
-
-/**
- * @author mdelder
- * 
- * TODO To change the template for this generated type comment go to Window - Preferences - Java -
- * Code Generation - Code and Comments
- */
-public class UIOperationExtensionRegistry extends RegistryReader {
-
-	public static final UIOperationExtensionRegistry INSTANCE = new UIOperationExtensionRegistry();
-
-	public static final String EXTENSION_POINT = "wtpuiAction"; //$NON-NLS-1$
-
-	private Map slaveDescriptorMap;
-
-	private Map masterDescriptorMap;
-
-	private HashMap overriddingDescriptorMap;
-
-	static {
-		INSTANCE.readRegistry();
-	}
-
-	protected UIOperationExtensionRegistry() {
-		super(WTPUIPlugin.PLUGIN_ID, EXTENSION_POINT);
-	}
-
-	public MasterDescriptor[] getExtendedUIOperations(String extendedOperationId, IStructuredSelection selection) {
-		if (selection == null || selection.isEmpty())
-			return new MasterDescriptor[0];
-		List enabledExtendedOperations = new ArrayList();
-		List descs = getMasterDescriptorsById(extendedOperationId);
-		MasterDescriptor descriptor = null;
-		for (Iterator itr = descs.iterator(); itr.hasNext();) {
-			descriptor = (MasterDescriptor) itr.next();
-			if (descriptor.isEnabledFor(selection) && !isOverridden(descriptor, selection))
-				enabledExtendedOperations.add(descriptor);
-		}
-		if (enabledExtendedOperations.size() == 0)
-			return new MasterDescriptor[0];
-		MasterDescriptor[] enabledExtendedOperationsArray = new MasterDescriptor[enabledExtendedOperations.size()];
-		enabledExtendedOperations.toArray(enabledExtendedOperationsArray);
-		return enabledExtendedOperationsArray;
-	}
-
-	/**
-	 * @param descriptor
-	 * @return
-	 */
-	protected boolean isOverridden(MasterDescriptor descriptor, IStructuredSelection selection) {
-		MasterDescriptor overriddingDescriptor = getOverriddingDescriptor(descriptor);
-		if (overriddingDescriptor == null)
-			return false;
-		return overriddingDescriptor.isEnabledFor(selection);
-	}
-
-	/**
-	 * @param descriptor
-	 * @return
-	 */
-	protected MasterDescriptor getOverriddingDescriptor(MasterDescriptor descriptor) {
-		return (MasterDescriptor) getOverriddingDescriptorMap().get(descriptor.getId());
-	}
-
-	/**
-	 * @return
-	 */
-	protected Map getOverriddingDescriptorMap() {
-		if (overriddingDescriptorMap == null)
-			overriddingDescriptorMap = new HashMap();
-		return overriddingDescriptorMap;
-	}
-
-	public SlaveDescriptor[] getSlaveDescriptors(String parentOperationClass) {
-		String[] slaves = OperationExtensionRegistry.getRegisteredOperations(parentOperationClass);
-		List slaveDescriptors = new ArrayList();
-		SlaveDescriptor slaveDescriptor = null;
-		for (int i = 0; null != slaves && i < slaves.length; i++) {
-			slaveDescriptor = getSlaveDescriptor(slaves[i]);
-			if (slaveDescriptor != null)
-				slaveDescriptors.add(slaveDescriptor);
-		}
-		SlaveDescriptor[] slaveDescriptorsArray = new SlaveDescriptor[slaveDescriptors.size()];
-		slaveDescriptors.toArray(slaveDescriptorsArray);
-		return slaveDescriptorsArray;
-	}
-
-	/**
-	 * @param string
-	 * @return
-	 */
-	public SlaveDescriptor getSlaveDescriptor(String operationClass) {
-		return (SlaveDescriptor) getSlaveDescriptorMap().get(operationClass);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.RegistryReader#readElement(org.eclipse.core.runtime.IConfigurationElement)
-	 */
-	public boolean readElement(IConfigurationElement element) {
-		if (MasterDescriptor.MASTER_OPERATION.equals(element.getName())) {
-			MasterDescriptor md = new MasterDescriptor(element);
-			addDescriptor(md);
-			if (md.getOverrideId() != null && md.getOverrideId().length() > 0)
-				getOverriddingDescriptorMap().put(md.getOverrideId(), md);
-		} else if (SlaveDescriptor.SLAVE_OPERATION.equals(element.getName())) {
-			addDescriptor(new SlaveDescriptor(element));
-		} else {
-			return false;
-		}
-		return true;
-	}
-
-	/**
-	 * @param descriptor
-	 */
-	protected void addDescriptor(MasterDescriptor descriptor) {
-		getMasterDescriptorsById(descriptor.getExtendedOperationId()).add(descriptor);
-	}
-
-	/**
-	 * @param descriptor
-	 */
-	protected void addDescriptor(SlaveDescriptor descriptor) {
-		getSlaveDescriptorMap().put(descriptor.getOperationClass(), descriptor);
-	}
-
-	/**
-	 * @param string
-	 * @return
-	 */
-	protected List getMasterDescriptorsById(String extendedOperationId) {
-		List descs = (List) getMasterDescriptorMap().get(extendedOperationId);
-		if (descs == null) {
-			getMasterDescriptorMap().put(extendedOperationId, (descs = new ArrayList()));
-		}
-		return descs;
-	}
-
-	/**
-	 * @return
-	 */
-	protected Map getMasterDescriptorMap() {
-		if (masterDescriptorMap == null)
-			masterDescriptorMap = new HashMap();
-		return masterDescriptorMap;
-	}
-
-	/**
-	 * @return Returns the slaveDescriptorMap.
-	 */
-	protected Map getSlaveDescriptorMap() {
-		if (slaveDescriptorMap == null)
-			slaveDescriptorMap = new HashMap();
-		return slaveDescriptorMap;
-	}
-}
\ 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/WTPActionContentProvider.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/WTPActionContentProvider.java
deleted file mode 100644
index 2cd231f..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/WTPActionContentProvider.java
+++ /dev/null
@@ -1,108 +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;
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * @author mdelder
- * 
- * TODO To change the template for this generated type comment go to Window - Preferences - Java -
- * Code Generation - Code and Comments
- */
-public class WTPActionContentProvider implements ITreeContentProvider {
-
-	/**
-	 *  
-	 */
-	public WTPActionContentProvider() {
-		super();
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
-	 */
-	public Object[] getChildren(Object parentElement) {
-		IOperationNode[] children = null;
-		if (parentElement instanceof IOperationNode)
-			children = ((IOperationNode) parentElement).getChildren();
-		return (children != null) ? WTPOptionalOperationDataModel.filterRequiredChildren(children) : new Object[0];
-	}
-
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object element) {
-
-		if (element instanceof IOperationNode)
-			return ((IOperationNode) element).getParent();
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-	 */
-	public boolean hasChildren(Object element) {
-
-		return getChildren(element).length != 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-	 */
-	public Object[] getElements(Object inputElement) {
-		IOperationNode[] elements = null;
-		if (inputElement != null && inputElement instanceof WTPOptionalOperationDataModel) {
-			IOperationNode root = ((WTPOptionalOperationDataModel) inputElement).getOperationTree();
-			if (root != null)
-				elements = root.getChildren();
-		}
-		return (elements != null) ? WTPOptionalOperationDataModel.filterRequiredChildren(elements) : new Object[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-	 */
-	public void dispose() {
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-	 *      java.lang.Object, java.lang.Object)
-	 */
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-	}
-
-}
\ No 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/WTPActionDialog.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/WTPActionDialog.java
deleted file mode 100644
index a973f45..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/WTPActionDialog.java
+++ /dev/null
@@ -1,286 +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.operation.extensionui;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeViewerListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TreeExpansionEvent;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.ui.help.WorkbenchHelp;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModelEvent;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModelListener;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPCommonUIResourceHandler;
-
-
-/**
- * @author mdelder
- * 
- * TODO To change the template for this generated type comment go to Window - Preferences - Java -
- * Code Generation - Code and Comments
- */
-public class WTPActionDialog extends Dialog implements WTPOperationDataModelListener {
-
-	private ITreeViewerListener actionTreeListener;
-
-	private ICheckStateListener checkStateListener;
-
-	private ISelectionChangedListener updateDescriptionSelectionListener;
-
-	private CheckboxTreeViewer checkboxTreeViewer;
-
-	Text descriptionText;
-
-	private final WTPOptionalOperationDataModel operationDataModel;
-
-	/**
-	 * This action's id, or <code>null</code> if none.
-	 */
-	private String id;
-
-	/**
-	 * @param arg0
-	 */
-	public WTPActionDialog(Shell arg0, WTPOptionalOperationDataModel operationDataModel) {
-		super(arg0);
-		this.operationDataModel = operationDataModel;
-		this.operationDataModel.addListener(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		return super.createContents(parent);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		getShell().setText(WTPCommonUIResourceHandler.getString("WTPActionDialog_UI_0")); //$NON-NLS-1$
-		Composite superComposite = (Composite) super.createDialogArea(parent);
-
-		Composite composite = new Composite(superComposite, SWT.NONE);
-
-		GridLayout layout = new GridLayout();
-		layout.marginHeight = 0; //convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
-		layout.marginWidth = 0; //convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
-		layout.verticalSpacing = 0; //convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
-		layout.horizontalSpacing = 0; //convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
-		layout.numColumns = 1;
-		composite.setLayout(layout);
-		composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		// set infopop based on id if id is set
-		if (getId() != null)
-			WorkbenchHelp.setHelp(composite, getId());
-		Label availableFiltersLabel = new Label(composite, SWT.BOLD);
-		GridData availableFiltersLabelGridData = new GridData(GridData.FILL_HORIZONTAL);
-		availableFiltersLabelGridData.heightHint = convertHeightInCharsToPixels(1);
-		availableFiltersLabel.setLayoutData(availableFiltersLabelGridData);
-		availableFiltersLabel.setText(WTPCommonUIResourceHandler.getString("WTPActionDialog_UI_0")); //$NON-NLS-1$
-
-		checkboxTreeViewer = new CheckboxTreeViewer(composite, SWT.CHECK | SWT.BORDER);
-
-		checkboxTreeViewer.setContentProvider(new WTPActionContentProvider());
-		checkboxTreeViewer.setLabelProvider(new WTPActionLabelProvider());
-
-		checkboxTreeViewer.setInput(this.operationDataModel);
-
-		Tree tree = checkboxTreeViewer.getTree();
-		GridLayout treeLayout = new GridLayout();
-		treeLayout.marginHeight = 0; //convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
-		treeLayout.marginWidth = 0; //convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
-		treeLayout.verticalSpacing = 0; //convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
-		treeLayout.horizontalSpacing = 0; //convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
-		treeLayout.numColumns = 1;
-		GridData treeGridData = new GridData(GridData.FILL_HORIZONTAL);
-		treeGridData.widthHint = convertHorizontalDLUsToPixels(225);
-		treeGridData.heightHint = convertVerticalDLUsToPixels(150);
-		tree.setLayout(treeLayout);
-		tree.setLayoutData(treeGridData);
-
-		descriptionText = new Text(composite, SWT.BORDER | SWT.WRAP);
-		GridData descriptionTextGridData = new GridData(GridData.FILL_HORIZONTAL);
-		descriptionTextGridData.heightHint = convertHeightInCharsToPixels(3);
-		descriptionText.setLayoutData(descriptionTextGridData);
-		descriptionText.setBackground(superComposite.getBackground());
-
-		initListeners();
-		updateCheckedItems();
-
-		return composite;
-	}
-
-	/**
-	 *  
-	 */
-	protected void initListeners() {
-		checkboxTreeViewer.addCheckStateListener(getCheckStateListener());
-		checkboxTreeViewer.addSelectionChangedListener(getSelectionListener());
-		checkboxTreeViewer.addTreeListener(getActionTreeListener());
-	}
-
-	/**
-	 * @return
-	 */
-	protected ICheckStateListener getCheckStateListener() {
-		if (checkStateListener == null)
-			checkStateListener = new CheckStateListener();
-		return checkStateListener;
-	}
-
-
-
-	public class CheckStateListener implements ICheckStateListener {
-
-		public void checkStateChanged(CheckStateChangedEvent event) {
-			boolean checked = event.getChecked();
-			IOperationNode node = (IOperationNode) event.getElement();
-			node.setChecked(checked);
-		}
-	}
-
-	public class TreeViewerListener implements ITreeViewerListener {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ITreeViewerListener#treeCollapsed(org.eclipse.jface.viewers.TreeExpansionEvent)
-		 */
-		public void treeCollapsed(TreeExpansionEvent event) {
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ITreeViewerListener#treeExpanded(org.eclipse.jface.viewers.TreeExpansionEvent)
-		 */
-		public void treeExpanded(TreeExpansionEvent event) {
-		}
-	}
-
-	public class SelectionChangedListener implements ISelectionChangedListener {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-		 */
-		public void selectionChanged(SelectionChangedEvent event) {
-
-			IStructuredSelection structuredSelection = (IStructuredSelection) event.getSelection();
-			Object element = structuredSelection.getFirstElement();
-			String text = ""; //$NON-NLS-1$
-			if (element instanceof IOperationNode)
-				text = ((IOperationNode) element).getDescription();
-			descriptionText.setText(text != null ? text : ""); //$NON-NLS-1$
-		}
-
-	}
-
-	/**
-	 * @return
-	 */
-	private ISelectionChangedListener getSelectionListener() {
-		if (updateDescriptionSelectionListener == null)
-			updateDescriptionSelectionListener = new SelectionChangedListener();
-		return updateDescriptionSelectionListener;
-	}
-
-	/**
-	 * @return
-	 */
-	private ITreeViewerListener getActionTreeListener() {
-		if (actionTreeListener == null)
-			actionTreeListener = new TreeViewerListener();
-		return actionTreeListener;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperationDataModelListener#propertyChanged(org.eclipse.wst.common.frameworks.internal.operation.WTPOperationDataModelEvent)
-	 */
-	public void propertyChanged(WTPOperationDataModelEvent event) {
-		switch (event.getFlag()) {
-			case WTPOperationDataModelEvent.PROPERTY_CHG :
-				if (WTPOptionalOperationDataModel.OPERATION_TREE.equals(event.getPropertyName()))
-					updateCheckedItems();
-				break;
-		}
-	}
-
-	/**
-	 *  
-	 */
-	private void updateCheckedItems() {
-		IOperationNode root = (IOperationNode) this.operationDataModel.getProperty(WTPOptionalOperationDataModel.OPERATION_TREE);
-		updateCheckedState(root);
-
-	}
-
-	/**
-	 * @param root
-	 */
-	private void updateCheckedState(IOperationNode root) {
-		if (root == null)
-			return;
-
-		IOperationNode[] children = root.getChildren();
-		if (children == null)
-			return;
-		for (int i = 0; i < children.length; i++) {
-			checkboxTreeViewer.setChecked(children[i], children[i].isChecked());
-			boolean disabled = (children[i].getParent() != null) ? children[i].getParent().isChecked() : false;
-			checkboxTreeViewer.setGrayed(children[i], disabled);
-			updateCheckedState(children[i]);
-		}
-	}
-
-	/**
-	 * @return Returns the id.
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * @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.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/WTPActionLabelProvider.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/WTPActionLabelProvider.java
deleted file mode 100644
index 06bfdc4..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/WTPActionLabelProvider.java
+++ /dev/null
@@ -1,98 +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;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @author mdelder
- * 
- * TODO To change the template for this generated type comment go to Window - Preferences - Java -
- * Code Generation - Code and Comments
- */
-public class WTPActionLabelProvider implements ILabelProvider {
-
-	/**
-	 *  
-	 */
-	public WTPActionLabelProvider() {
-		super();
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-	 */
-	public void addListener(ILabelProviderListener listener) {
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
-	 */
-	public void dispose() {
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object,
-	 *      java.lang.String)
-	 */
-	public boolean isLabelProperty(Object element, String property) {
-
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-	 */
-	public void removeListener(ILabelProviderListener listener) {
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
-	 */
-	public Image getImage(Object element) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-	 */
-	public String getText(Object element) {
-		if (element instanceof IOperationNode)
-			return ((IOperationNode) element).getName();
-
-		return element.toString();
-	}
-
-}
\ 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/WTPOperationDataModelUICreator.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/WTPOperationDataModelUICreator.java
deleted file mode 100644
index e8109ac..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/WTPOperationDataModelUICreator.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 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.operation.extensionui;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IWorkbenchSite;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
-
-
-
-/**
- * @author mdelder
- * 
- * TODO To change the template for this generated type comment go to Window - Preferences - Java -
- * Code Generation - Code and Comments
- */
-public interface WTPOperationDataModelUICreator {
-
-	WTPOperationDataModel createDataModel(String extendedOperationId, String operationClass, IStructuredSelection selection, IWorkbenchSite site);
-}
\ 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/WTPOptionalOperationDataModel.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/WTPOptionalOperationDataModel.java
deleted file mode 100644
index 15e8dbd..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/WTPOptionalOperationDataModel.java
+++ /dev/null
@@ -1,325 +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
- * 
- */
-package org.eclipse.wst.common.frameworks.internal.operation.extensionui;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IWorkbenchSite;
-import org.eclipse.wst.common.frameworks.internal.operations.ComposedOperation;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperation;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPCommonUIResourceHandler;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPUIPlugin;
-
-
-/**
- * @author jsholl
- *  
- */
-public class WTPOptionalOperationDataModel extends WTPOperationDataModel {
-
-
-
-	/**
-	 * String, this is required along with a STRUCTURED_SELECTION unless MASTER_OPERATION_LIST is
-	 * set
-	 */
-	public static final String EXTENDED_OPERATION_ID = "WTPOptionalOperationDataModel.EXTENDED_OPERATION_ID"; //$NON-NLS-1$
-
-	/**
-	 * IStructuredSelection, this is required along with a EXTENDED_OPERATION_ID unless
-	 * MASTER_OPERATION_LIST is set
-	 */
-	public static final String STRUCTURED_SELECTION = "WTPOptionalOperationDataModel.STRUCTURED_SELECTION"; //$NON-NLS-1$
-
-	/**
-	 * List of MasterDescriptor, required unless both EXTENDED_OPERATION_ID and STRUCTURED_SELECTION
-	 * are set
-	 */
-	public static final String MASTER_OPERATION_LIST = "WTPOptionalOperationDataModel.MASTER_OPERATION_LIST"; //$NON-NLS-1$
-
-	/**
-	 * A root IOperationNode whose operation is null and children are the contents of the
-	 * MASTER_OPERATION_LIST
-	 */
-	public static final String OPERATION_TREE = "WTPOptionalOperationDataModel.OPERATION_TREE"; //$NON-NLS-1$
-
-	/**
-	 * Optional. Allow the WTPOperationDataModelUICreators access to the workbench site for
-	 * additional initializations.
-	 */
-	public static final String IWORKBENCH_SITE = "IWORKBENCH_SITE"; //$NON-NLS-1$
-
-	public static WTPOptionalOperationDataModel createDataModel(String extendedOperationId, IStructuredSelection selection) {
-		WTPOptionalOperationDataModel dataModel = new WTPOptionalOperationDataModel();
-		dataModel.setProperty(EXTENDED_OPERATION_ID, extendedOperationId);
-		dataModel.setProperty(STRUCTURED_SELECTION, selection);
-		return dataModel;
-	}
-
-	private class OperationNode implements IOperationNode {
-
-		private WTPOperationDataModel dataModel = null;
-
-		private SlaveDescriptor descriptor = null;
-
-		private List children = null;
-
-		private OperationNode parent = null;
-
-		private boolean checked = false;
-
-		public OperationNode(OperationNode parent, SlaveDescriptor descriptor) {
-			this.parent = parent;
-			this.descriptor = descriptor;
-			verifyRoot();
-		}
-
-		private void verifyRoot() {
-			if (null == parent) {
-				return;
-			}
-			IOperationNode root = getOperationTree();
-			OperationNode node = this;
-			while (node.parent != null) {
-				node = node.parent;
-			}
-			if (node != root) {
-				throw new RuntimeException();
-			}
-		}
-
-		public String getName() {
-			return descriptor.getName();
-		}
-
-		public String getDescription() {
-			return descriptor.getDescription();
-		}
-
-		public WTPOperationDataModel getDataModel() {
-			IWorkbenchSite site = (IWorkbenchSite) getProperty(IWORKBENCH_SITE);
-			if (dataModel == null) {
-				IOperationNode root = getOperationTree();
-				if (this.parent == root) {
-					MasterDescriptor masterDescriptor = (MasterDescriptor) descriptor;
-					dataModel = masterDescriptor.getCreator().createDataModel(masterDescriptor.getExtendedOperationId(), masterDescriptor.getOperationClass(), getStructuredSelection(), site);
-				} else
-					dataModel = parent.getDataModel();
-			}
-			return dataModel;
-		}
-
-		public WTPOperation getOperation() {
-			WTPOperation operation = descriptor.createOperation();
-			WTPOperationDataModel dataModel1 = getDataModel();
-			if (dataModel1 != null) {
-				if (operation == null)
-					operation = dataModel.getDefaultOperation();
-				else
-					operation.setOperationDataModel(dataModel);
-			}
-			return operation;
-		}
-
-		public IOperationNode[] getChildren() {
-			verifyRoot();
-			return getChildren(true);
-		}
-
-		public IOperationNode[] getChildren(boolean expandChildren) {
-			if (expandChildren && null == children && null != parent) {
-				children = new ArrayList();
-				SlaveDescriptor[] slaveDescriptors = UIOperationExtensionRegistry.INSTANCE.getSlaveDescriptors(descriptor.getOperationClass());
-				for (int i = 0; null != slaveDescriptors && i < slaveDescriptors.length; i++) {
-					OperationNode child = new OperationNode(this, slaveDescriptors[i]);
-					child.checked = checked;
-					addChild(child);
-				}
-			}
-			if (null == children) {
-				return null;
-			}
-			OperationNode[] childNodes = new OperationNode[children.size()];
-			children.toArray(childNodes);
-			return childNodes;
-		}
-
-		public void clearChildren() {
-			if (null != children) {
-				children.clear();
-			}
-		}
-
-		public void addChild(OperationNode childNode) {
-			if (null == children) {
-				children = new ArrayList();
-			}
-			children.add(childNode);
-		}
-
-		public boolean isChecked() {
-			verifyRoot();
-			if (descriptor instanceof MasterDescriptor && ((MasterDescriptor) descriptor).isAlwaysExecute())
-				return true;
-			return checked;
-		}
-
-		public void setChecked(boolean checked) {
-			if (descriptor instanceof MasterDescriptor && ((MasterDescriptor) descriptor).isAlwaysExecute())
-				return;
-			internalSetChecked(checked);
-			Object root = getProperty(OPERATION_TREE);
-			notifyListeners(OPERATION_TREE);
-		}
-
-		public IOperationNode getParent() {
-			return parent;
-		}
-
-		protected void internalSetChecked(boolean checked1) {
-			this.checked = checked1;
-			if (checked) {
-				OperationNode[] children1 = (OperationNode[]) getChildren(false);
-				for (int i = 0; null != children && i < children1.length; i++)
-					children1[i].internalSetChecked(checked);
-			} else {
-				if (this.parent != null)
-					this.parent.internalSetChecked(checked);
-			}
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.wst.common.frameworks.internal.operation.extension.ui.IOperationNode#isAlwaysExecute()
-		 */
-		public boolean isAlwaysExecute() {
-			if (descriptor instanceof MasterDescriptor && ((MasterDescriptor) descriptor).isAlwaysExecute())
-				return true;
-			return false;
-		}
-	}
-
-	protected void init() {
-		super.init();
-		setProperty(OPERATION_TREE, new OperationNode(null, null));
-	}
-
-	protected void initValidBaseProperties() {
-		super.initValidBaseProperties();
-		addValidBaseProperty(MASTER_OPERATION_LIST);
-		addValidBaseProperty(OPERATION_TREE);
-		addValidBaseProperty(STRUCTURED_SELECTION);
-		addValidBaseProperty(EXTENDED_OPERATION_ID);
-		addValidBaseProperty(IWORKBENCH_SITE);
-	}
-
-	IStructuredSelection getStructuredSelection() {
-		return (IStructuredSelection) getProperty(STRUCTURED_SELECTION);
-	}
-
-	public IOperationNode getOperationTree() {
-		return (IOperationNode) getProperty(OPERATION_TREE);
-	}
-
-	public static IOperationNode[] getOptionalChildren(IOperationNode node) {
-		IOperationNode[] children = node.getChildren();
-		children = filterRequiredChildren(children);
-		return children;
-	}
-
-	/**
-	 * @param children
-	 * @return
-	 */
-	public static IOperationNode[] filterRequiredChildren(IOperationNode[] children) {
-		List filteredChildren = new ArrayList(Arrays.asList(children));
-		for (int i = 0; i < children.length; i++)
-			if (children[i].isAlwaysExecute())
-				filteredChildren.remove(children[i]);
-		filteredChildren.toArray((children = new IOperationNode[filteredChildren.size()]));
-		return children;
-	}
-
-	protected boolean doSetProperty(String propertyName, Object propertyValue) {
-		boolean returnVal = super.doSetProperty(propertyName, propertyValue);
-		if (propertyName.equals(STRUCTURED_SELECTION) || propertyName.equals(EXTENDED_OPERATION_ID)) {
-			String extendedOperationID = getStringProperty(EXTENDED_OPERATION_ID);
-			IStructuredSelection selection = (IStructuredSelection) getProperty(STRUCTURED_SELECTION);
-			setProperty(MASTER_OPERATION_LIST, UIOperationExtensionRegistry.INSTANCE.getExtendedUIOperations(extendedOperationID, selection));
-		}
-		if (propertyName.equals(MASTER_OPERATION_LIST)) {
-			OperationNode rootNode = (OperationNode) getOperationTree();
-			rootNode.clearChildren();
-			MasterDescriptor[] descriptors = (MasterDescriptor[]) propertyValue;
-			if (null != descriptors) {
-				for (int i = 0; i < descriptors.length; i++) {
-					OperationNode child = new OperationNode(rootNode, descriptors[i]);
-					child.setChecked(true);
-					rootNode.addChild(child);
-				}
-			}
-			notifyListeners(OPERATION_TREE);
-		}
-		return returnVal;
-	}
-
-	public WTPOperation getDefaultOperation() {
-		ComposedOperation operation = new ComposedOperation();
-		OperationNode root = (OperationNode) getOperationTree();
-		addOperationIfNecessary(operation, root);
-		return operation;
-	}
-
-	private void addOperationIfNecessary(ComposedOperation operation, OperationNode node) {
-		if (node.isAlwaysExecute() || node.isChecked()) {
-			WTPOperation op = node.getOperation();
-			if (op != null)
-				operation.addRunnable(op);
-		} else {
-			IOperationNode[] children = node.getChildren(false);
-			for (int i = 0; null != children && i < children.length; i++)
-				addOperationIfNecessary(operation, (OperationNode) children[i]);
-		}
-	}
-
-	private boolean hasSelectedNodes(OperationNode node) {
-		if (node.isChecked()) {
-			return true;
-		}
-		boolean foundSelection = false;
-		OperationNode[] children = (OperationNode[]) node.getChildren(false);
-		for (int i = 0; !foundSelection && null != children && i < children.length; i++) {
-			foundSelection = hasSelectedNodes(children[i]);
-		}
-		return foundSelection;
-	}
-
-	protected IStatus doValidateProperty(String propertyName) {
-		if (propertyName.equals(OPERATION_TREE)) {
-			OperationNode root = (OperationNode) getOperationTree();
-			if (root.isChecked()) {
-				return WTPUIPlugin.createErrorStatus(WTPCommonUIResourceHandler.getString("WTPOptionalOperationDataModel_UI_0")); //$NON-NLS-1$
-			} else if (!hasSelectedNodes(root)) {
-				return WTPUIPlugin.createErrorStatus(WTPCommonUIResourceHandler.getString("WTPOptionalOperationDataModel_UI_1"));} //$NON-NLS-1$
-		}
-		return super.doValidateProperty(propertyName);
-	}
-}
\ 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/WizardExtensionFactory.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/WizardExtensionFactory.java
deleted file mode 100644
index 56b0a25..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/WizardExtensionFactory.java
+++ /dev/null
@@ -1,33 +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.operation.extensionui;
-
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
-import org.eclipse.wst.common.frameworks.internal.ui.IExtendedPageHandler;
-import org.eclipse.wst.common.frameworks.internal.ui.IExtendedWizardPage;
-
-
-/**
- * This interface is EXPERIMENTAL and is subject to substantial changes.
- */
-public abstract class WizardExtensionFactory {
-
-	public WizardExtensionFactory() {
-		super();
-	}
-
-	public abstract IExtendedWizardPage[] createPageGroup(WTPOperationDataModel dataModel, String pageGroupID);
-
-	/*
-	 * this is optional
-	 */
-	public IExtendedPageHandler createPageHandler(WTPOperationDataModel dataModel, String pageGroupID) {
-		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/operation/extensionui/WizardPageElement.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/WizardPageElement.java
deleted file mode 100644
index 44e037c..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/WizardPageElement.java
+++ /dev/null
@@ -1,228 +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.operation.extensionui;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.wst.common.frameworks.internal.AbstractRegistryDescriptor;
-import org.eclipse.wst.common.frameworks.internal.enablement.IdentifiableComparator;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
-import org.eclipse.wst.common.frameworks.internal.ui.IExtendedPageHandler;
-import org.eclipse.wst.common.frameworks.internal.ui.IExtendedWizardPage;
-
-import org.eclipse.jem.util.logger.proxy.Logger;
-
-public class WizardPageElement extends AbstractRegistryDescriptor implements Comparable {
-	/** Type designation for an {@link ExtendedEditorPage} */
-	public static final int EXTENDED_EDITOR_PAGE = 0;
-	/** Type designation for a nested editor */
-	public static final int NESTED_EDITOR = 1;
-	static final String[] EMPTY_STRING_ARRAY = new String[0];
-	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_GROUP_ID = "groupID"; //$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 WizardPageFactoryElement wizardPageFactoryElement;
-	protected String pluginID;
-	protected String wizardID;
-	public String pageGroupID;
-	protected String wizardFactoryElement;
-	protected boolean allowsExtendedPagesAfter;
-	protected String pageInsertionID;
-	private int loadOrder;
-	private static int loadOrderCounter;
-
-
-	private int type;
-
-	public WizardPageElement(IConfigurationElement element1) {
-		super(element1);
-		pluginID = element1.getDeclaringExtension().getDeclaringPluginDescriptor().getUniqueIdentifier();
-		wizardID = element1.getAttribute(ATT_WIZARD_ID);
-		pageGroupID = element1.getAttribute(ATT_PAGE_ID);
-		readAllowsExtendedPageAfter(element1);
-		pageInsertionID = element1.getAttribute(ATT_PAGE_INSERTION_ID);
-		readFactory(element1);
-		validateSettings();
-		loadOrder = loadOrderCounter++;
-	}
-
-	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 WizardPageFactoryElement(factories[0], pageGroupID);
-		}
-	}
-
-	public IExtendedPageHandler createPageHandler(WTPOperationDataModel dataModel) {
-		if (wizardPageFactoryElement != null)
-			return wizardPageFactoryElement.createPageHandler(dataModel);
-		return null;
-	}
-
-	public IExtendedWizardPage[] createPageGroup(WTPOperationDataModel dataModel) {
-		if (wizardPageFactoryElement != null)
-			return wizardPageFactoryElement.createPageGroup(dataModel);
-		return null;
-	}
-
-
-	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;
-	}
-
-	/**
-	 * @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 WizardPageFactoryElement getWizardPageFactoryElement() {
-		return wizardPageFactoryElement;
-	}
-
-	/**
-	 * @param wizardPageFactoryElement
-	 *            The wizardPageFactoryElement to set.
-	 */
-	public void setWizardPageFactoryElement(WizardPageFactoryElement 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();
-	}
-
-}
\ 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/WizardPageExtensionManager.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/WizardPageExtensionManager.java
deleted file mode 100644
index 631a2e3..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/WizardPageExtensionManager.java
+++ /dev/null
@@ -1,278 +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.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.wst.common.frameworks.internal.enablement.EnablementManager;
-import org.eclipse.wst.common.frameworks.internal.ui.WTPCommonUIResourceHandler;
-
-import org.eclipse.jem.util.RegistryReader;
-import org.eclipse.jem.util.logger.proxy.Logger;
-
-public class WizardPageExtensionManager {
-
-	public static final String ORG_ECLIPSE_UI = "org.eclipse.ui"; //$NON-NLS-1$
-
-	protected static WizardPageExtensionManager instance = null;
-
-	HashMap wizardPluginIDMap = null;
-
-	TreeMap wizardPageElements = null;
-
-	//private TreeSet wizardExtPageElements = null;
-	List nonSyncedPageElementList = null;
-
-	private WizardPageExtensionReader reader = null;
-
-	private WizardPageExtensionManager() {
-		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.getPluginRegistry().getExtensionPoint(ORG_ECLIPSE_UI, "exportWizards"), //$NON-NLS-1$
-					Platform.getPluginRegistry().getExtensionPoint(ORG_ECLIPSE_UI, "importWizards"), //$NON-NLS-1$
-					Platform.getPluginRegistry().getExtensionPoint(ORG_ECLIPSE_UI, "newWizards"), //$NON-NLS-1$
-					Platform.getPluginRegistry().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().getDeclaringPluginDescriptor().getUniqueIdentifier();
-				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, WizardPageElement.ELEMENT_PAGE_GROUP);
-		}
-
-		public boolean readElement(IConfigurationElement element) {
-			if (!WizardPageElement.ELEMENT_PAGE_GROUP.equals(element.getName()))
-				return false;
-			WizardPageElement newElement = new WizardPageElement(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, WizardPageElement newElement) {
-			if (newElement.pageInsertionID == null) {
-				pageMap.put(newElement, new TreeSet());
-			} else {
-				String elementName = newElement.pageInsertionID;
-				WizardPageElement parentElement = getPageElement(elementName, pageMap);
-				insertExtPageElement(pageMap, parentElement, newElement);
-			}
-
-			newElement.getPageInsertionID();
-
-		}
-
-		private void insertExtPageElement(TreeMap pageMap, WizardPageElement parentElement, WizardPageElement newElement) {
-			if (parentElement == null) {
-				nonSyncedPageElementList.add(newElement);
-				return;
-			}
-			if (!parentElement.allowsExtendedPagesAfter()) {
-				Logger.getLogger().logError(WTPCommonUIResourceHandler.getString("WizardPageExtensionManager_UI_0", new Object[]{parentElement.getPageID()})); //$NON-NLS-1$
-				Logger.getLogger().logError(WTPCommonUIResourceHandler.getString("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 WizardPageElement getPageElement(String elementName, TreeMap map) {
-			Set keySet = map.keySet();
-			for (Iterator iter = keySet.iterator(); iter.hasNext();) {
-				WizardPageElement element = (WizardPageElement) iter.next();
-				if (element.getPageID().equals(elementName))
-					return element;
-			}
-			return null;
-
-		}
-
-		private TreeMap createPageMapEntry(WizardPageElement 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 WizardPageElement[] getPageElements(String wizardID) {
-		TreeMap elementMap = (TreeMap) wizardPageElements.get(wizardID);
-		if (elementMap == null || elementMap.isEmpty()) {
-			return new WizardPageElement[0];
-		}
-		ArrayList alreadyVistedList = new ArrayList(elementMap.size());
-		Set allPageElementsList = elementMap.keySet();
-		ArrayList orderedPageList = new ArrayList(elementMap.size());
-
-		for (Iterator iter = allPageElementsList.iterator(); iter.hasNext();) {
-			WizardPageElement element = (WizardPageElement) 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 WizardPageElement[] getPageArray(ArrayList orderedPageList) {
-		WizardPageElement[] pageElements = new WizardPageElement[orderedPageList.size()];
-		for (int i = 0; i < orderedPageList.size(); i++) {
-			pageElements[i] = (WizardPageElement) 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();) {
-			WizardPageElement element = (WizardPageElement) iter.next();
-			if (alreadyVistedList.contains(element)) {
-				Logger.getLogger().logError(WTPCommonUIResourceHandler.getString("WizardPageExtensionManager_UI_2", new Object[]{element.getPageID(), WizardPageElement.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++) {
-			WizardPageElement element = (WizardPageElement) 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, WizardPageElement newElement) {
-		boolean insertNotFound = true;
-		for (Iterator iter = pageMap.keySet().iterator(); iter.hasNext();) {
-			WizardPageElement element = (WizardPageElement) 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.getString("WizardPageExtensionManager_UI_3")); //$NON-NLS-1$
-		}
-
-	}
-
-	private void logMissingClassError() {
-		Logger logger = Logger.getLogger();
-		for (int i = 0; i < nonSyncedPageElementList.size(); i++) {
-			WizardPageElement element = (WizardPageElement) nonSyncedPageElementList.get(i);
-			logger.logError(WTPCommonUIResourceHandler.getString("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 WizardPageExtensionManager getInstance() {
-		if (instance == null) {
-			instance = new WizardPageExtensionManager();
-		}
-		return instance;
-	}
-}
\ 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/WizardPageFactoryElement.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/WizardPageFactoryElement.java
deleted file mode 100644
index 2456dee..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/WizardPageFactoryElement.java
+++ /dev/null
@@ -1,88 +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.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.internal.ConfigurationElementWrapper;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
-import org.eclipse.wst.common.frameworks.internal.ui.IExtendedPageHandler;
-import org.eclipse.wst.common.frameworks.internal.ui.IExtendedWizardPage;
-
-/**
- * @author schacher
- * 
- * To change the template for this generated type comment go to Window>Preferences>Java>Code
- * Generation>Code and Comments
- */
-public class WizardPageFactoryElement extends ConfigurationElementWrapper {
-
-	static final String ATT_CLASS_NAME = "className"; //$NON-NLS-1$
-
-	protected String className;
-	protected WizardExtensionFactory wizardPageFactory;
-	protected boolean isPageFactoryInitialized;
-	protected String pageGroupID;
-
-	/**
-	 * @param element
-	 */
-	public WizardPageFactoryElement(IConfigurationElement element, String pageGroupID) {
-		super(element);
-		className = element.getAttribute(ATT_CLASS_NAME);
-		this.pageGroupID = pageGroupID;
-	}
-
-	public IExtendedPageHandler createPageHandler(WTPOperationDataModel dataModel) {
-		if (!isPageFactoryInitialized)
-			initPageFactory();
-		if (wizardPageFactory == null)
-			return null;
-
-		IExtendedPageHandler handler = wizardPageFactory.createPageHandler(dataModel, pageGroupID);
-		return handler;
-	}
-
-	public IExtendedWizardPage[] createPageGroup(WTPOperationDataModel dataModel) {
-		if (!isPageFactoryInitialized)
-			initPageFactory();
-
-		if (wizardPageFactory == null)
-			return null;
-
-		IExtendedWizardPage[] pages = wizardPageFactory.createPageGroup(dataModel, pageGroupID);
-		for (int i = 0; i < pages.length; i++) {
-			pages[i].setGroupID(pageGroupID);
-		}
-		return pages;
-	}
-
-	private void initPageFactory() {
-		try {
-			wizardPageFactory = (WizardExtensionFactory) 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;
-		}
-	}
-
-
-}
\ 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 4751e0d..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/AbstractWTPUIPlugin.java
+++ /dev/null
@@ -1,64 +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 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);
-	}
-}
\ 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/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/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 9cd3cf1..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/ErrorDialog.java
+++ /dev/null
@@ -1,187 +0,0 @@
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-/*
- * Licensed Material - Property of IBM (C) Copyright IBM Corp. 2002 - All
- * Rights Reserved. US Government Users Restricted Rights - Use, duplication or
- * disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
- */
-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;
-	}
-}
\ 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/ExtendedWizardPage.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/ExtendedWizardPage.java
deleted file mode 100644
index 96ca761..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/ExtendedWizardPage.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.frameworks.internal.ui;
-
-import org.eclipse.core.internal.runtime.Assert;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
-
-/**
- * This class is EXPERIMENTAL and is subject to substantial changes.
- */
-public abstract class ExtendedWizardPage extends WTPWizardPage implements IExtendedWizardPage {
-
-	private String id;
-
-	protected ExtendedWizardPage(WTPOperationDataModel model, String pageName) {
-		super(model, pageName);
-	}
-
-	/**
-	 * @return Returns the id.
-	 */
-	public final String getGroupID() {
-		return id;
-	}
-
-	/**
-	 * Will only set the id once. Further invocations will be ignored.
-	 * 
-	 * @param id
-	 *            The id to set.
-	 */
-	public final void setGroupID(String id) {
-		Assert.isTrue(this.id == null, WTPCommonUIResourceHandler.getString("ExtendedWizardPage_ERROR_0")); //$NON-NLS-1$
-		Assert.isNotNull(id, WTPCommonUIResourceHandler.getString("ExtendedWizardPage_ERROR_1")); //$NON-NLS-1$
-		this.id = id;
-	}
-}
\ 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/FlexibleJavaProjectPreferencePage.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/FlexibleJavaProjectPreferencePage.java
deleted file mode 100644
index 0cb328d..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/FlexibleJavaProjectPreferencePage.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.wst.common.frameworks.internal.FlexibleJavaProjectPreferenceUtil;
-
-
-public class FlexibleJavaProjectPreferencePage extends PreferencePage implements IWorkbenchPreferencePage, SelectionListener{
-
-	Button alloMultipleButton = null;
-	
-	protected Control createContents(Composite parent) {
-
-		Composite composite = new Composite(parent, SWT.NONE);	
-		RowLayout rowLayout = new RowLayout();
-		rowLayout.justify = false;
-		rowLayout.marginLeft = 5;
-		rowLayout.marginRight = 5;
-		rowLayout.spacing = 5;
-		composite.setLayout(rowLayout);
-
-		alloMultipleButton = new Button(composite, SWT.CHECK);
-		alloMultipleButton.setText("Allow Multiple modules per project");
-		alloMultipleButton.setEnabled(true);
-		
-		boolean val = FlexibleJavaProjectPreferenceUtil.getMultipleModulesPerProjectProp();
-		
-		alloMultipleButton.setSelection(val);
-
-		alloMultipleButton.addSelectionListener(this);
-		return composite;
-	}
-	
-	public void init(IWorkbench workbench) {
-	}
-
-	public void widgetSelected(SelectionEvent e) {
-		FlexibleJavaProjectPreferenceUtil.setMultipleModulesPerProjectProp( alloMultipleButton.getSelection() );
-	}
-
-	public void widgetDefaultSelected(SelectionEvent e) {
-
-	}
-    protected void performDefaults() {
-		FlexibleJavaProjectPreferenceUtil.setMultipleModulesPerProjectProp( false );
-    }	
-
-}
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 62d4cec..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/GenericWizardNode.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-/*
- * Licensed Material - Property of IBM 
- * (C) Copyright IBM Corp. 2002 - All Rights Reserved. 
- * US Government Users Restricted Rights - Use, duplication or disclosure 
- * restricted by GSA ADP Schedule Contract with IBM Corp. 
- */
-
-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/IExtendedPageHandler.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/IExtendedPageHandler.java
deleted file mode 100644
index f637635..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/IExtendedPageHandler.java
+++ /dev/null
@@ -1,57 +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.ui;
-
-/**
- * This interface is EXPERIMENTAL and is subject to substantial changes.
- */
-public interface IExtendedPageHandler {
-
-	/**
-	 * return this as the page name if the expectedNextPageName or expectedPreviousPageName should
-	 * be skipped
-	 */
-	public static final String SKIP_PAGE = "IExtendedPageHandler.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 = "IExtendedPageHandler.PAGE_AFTER"; //$NON-NLS-1$
-
-	/**
-	 * same as PAGE_AFTER, except for returing the page before.
-	 */
-	public static final String PAGE_BEFORE = "IExtendedPageHandler.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);
-}
\ 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/IExtendedWizardPage.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/IExtendedWizardPage.java
deleted file mode 100644
index 6b73103..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/IExtendedWizardPage.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.frameworks.internal.ui;
-
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperation;
-
-/**
- * This interface is EXPERIMENTAL and is subject to substantial changes.
- */
-public interface IExtendedWizardPage extends IWizardPage {
-
-	WTPOperation createOperation();
-
-	boolean canPageFinish();
-
-	String getGroupID();
-
-	void setGroupID(String id);
-
-}
\ 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 ce56714..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/ListenerList.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-/*
- * Licensed Material - Property of IBM (C) Copyright IBM Corp. 2001, 2002 - All Rights Reserved. US
- * Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP
- * Schedule Contract with IBM Corp.
- */
-
-
-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 3faf52d..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/NewProjectGroup.java
+++ /dev/null
@@ -1,141 +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 3, 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.io.File;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.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.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.wst.common.frameworks.internal.operations.ProjectCreationDataModel;
-
-/**
- * @author DABERG
- * 
- * To change the template for this generated type comment go to Window>Preferences>Java>Code
- * Generation>Code and Comments
- */
-public class NewProjectGroup {
-	private ProjectCreationDataModel 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.getString("Name_"); //$NON-NLS-1$
-	private String defBrowseButtonLabel = WTPCommonUIResourceHandler.getString("Browse_");//$NON-NLS-1$
-	private static final String defDirDialogLabel = "Directory"; //$NON-NLS-1$
-
-	private WTPDataModelSynchHelper synchHelper;
-
-	/**
-	 * @param parent
-	 * @param style
-	 */
-	public NewProjectGroup(Composite parent, int style, ProjectCreationDataModel model) {
-		this.model = model;
-		synchHelper = new WTPDataModelSynchHelper(model);
-		buildComposites(parent);
-	}
-
-	/**
-	 * Create the controls within this composite
-	 */
-	public void buildComposites(Composite parent) {
-		createProjectNameGroup(parent);
-		createProjectLocationGroup(parent);
-		projectNameField.setFocus();
-	}
-
-	/**
-	 *  
-	 */
-	private void createProjectNameGroup(Composite parent) {
-		// set up project name label
-		Label projectNameLabel = new Label(parent, SWT.NONE);
-		projectNameLabel.setText(defProjectNameLabel);
-		GridData data = new GridData();
-		projectNameLabel.setLayoutData(data);
-		// set up project name entry field
-		projectNameField = new Text(parent, SWT.BORDER);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.widthHint = SIZING_TEXT_FIELD_WIDTH;
-		projectNameField.setLayoutData(data);
-		new Label(parent, SWT.NONE); // pad
-		synchHelper.synchText(projectNameField, ProjectCreationDataModel.PROJECT_NAME, new Control[]{projectNameLabel});
-	}
-
-	/**
-	 *  
-	 */
-	private void createProjectLocationGroup(Composite parent) {
-		//		set up location path label
-		Label locationPathLabel = new Label(parent, SWT.NONE);
-		locationPathLabel.setText(WTPCommonUIResourceHandler.getString("Project_location_"));//$NON-NLS-1$
-		GridData data = new GridData();
-		locationPathLabel.setLayoutData(data);
-		// set up location path entry field
-		locationPathField = new Text(parent, SWT.BORDER | SWT.READ_ONLY);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.widthHint = SIZING_TEXT_FIELD_WIDTH;
-		locationPathField.setLayoutData(data);
-		// set up browse button
-		browseButton = new Button(parent, SWT.PUSH);
-		browseButton.setText(defBrowseButtonLabel);
-		browseButton.setLayoutData((new GridData(GridData.FILL_HORIZONTAL)));
-		browseButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				handleLocationBrowseButtonPressed();
-			}
-		});
-		browseButton.setEnabled(true);
-		synchHelper.synchText(locationPathField, ProjectCreationDataModel.PROJECT_LOCATION, null);
-	}
-
-	/**
-	 * Open an appropriate directory browser
-	 */
-	protected void handleLocationBrowseButtonPressed() {
-		DirectoryDialog dialog = new DirectoryDialog(locationPathField.getShell());
-		dialog.setMessage(defDirDialogLabel);
-		String dirName = model.getStringProperty(ProjectCreationDataModel.PROJECT_LOCATION);
-		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(ProjectCreationDataModel.PROJECT_LOCATION, selectedDirectory);
-		}
-	}
-
-	public void dispose() {
-		model.removeListener(synchHelper);
-		synchHelper.dispose();
-		model = 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/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 a52cbe9..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/OverlayIcon.java
+++ /dev/null
@@ -1,117 +0,0 @@
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-/*
- * Licensed Material - Property of IBM (C) Copyright IBM Corp. 2000, 2001, 2002 - All Rights
- * Reserved. US Government Users Restricted Rights - Use, duplication or disclosure restricted by
- * GSA ADP Schedule Contract with IBM Corp.
- */
-
-
-
-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;
-	}
-}
\ 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/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 7340bd2..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/RunnableOperationWrapper.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.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);
-		} catch (ExecutionException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-	}
-
-	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 18c434d..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/RunnableWithProgressWrapper.java
+++ /dev/null
@@ -1,76 +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.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;
-	}
-}
\ 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/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 b4a9398..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/SaveHandlerUI.java
+++ /dev/null
@@ -1,125 +0,0 @@
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-/*
- * Licensed Material - Property of IBM (C) Copyright IBM Corp. 2001, 2002 - All Rights Reserved. US
- * Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP
- * Schedule Contract with IBM Corp.
- */
-
-
-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.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/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 0106d52..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/TimedKeyListener.java
+++ /dev/null
@@ -1,131 +0,0 @@
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-/*
- * Licensed Material - Property of IBM 
- * (C) Copyright IBM Corp. 2001, 2002 - All Rights Reserved. 
- * US Government Users Restricted Rights - Use, duplication or disclosure 
- * restricted by GSA ADP Schedule Contract with IBM Corp. 
- */
-
-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 72b1ab6..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/TimedModifyListener.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-/*
- * Licensed Material - Property of IBM 
- * (C) Copyright IBM Corp. 2001, 2002 - All Rights Reserved. 
- * US Government Users Restricted Rights - Use, duplication or disclosure 
- * restricted by GSA ADP Schedule Contract with IBM Corp. 
- */
-
-/**
- * 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 6ffd237..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/Timer.java
+++ /dev/null
@@ -1,250 +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.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("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("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;
-	}
-}
\ 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/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 3ca9284..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/TimerQueue.java
+++ /dev/null
@@ -1,229 +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.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.getString("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();
-	}
-}
\ 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/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 912ca4d..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, 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 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();
-	}
-
-
-
-}
\ 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/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 38b5829..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, 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 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);
-	}
-}
\ 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/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 b596e8a..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/UIOperationHandler.java
+++ /dev/null
@@ -1,193 +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.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";//EMFWorkbenchUIResourceHandler.getString("Information_UI__UI_");
-																   // //$NON-NLS-1$
-	// //$NON-NLS-1$ = "Information"
-	final public static String DEFAULT_ERROR = "Error";// EMFWorkbenchUIResourceHandler.getString("Error_UI_");
-													   // //$NON-NLS-1$
-	// //$NON-NLS-1$ = "Error"
-	final public static String DEFAULT_CONFIRM = "Confirm";//EMFWorkbenchUIResourceHandler.getString("Confirm_UI_");
-														   // //$NON-NLS-1$
-	// //$NON-NLS-1$ = "Confirm"
-	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();
-	}
-
-
-}
\ 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/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 e9ba323..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/UITesterImpl.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 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;
-import org.eclipse.ui.internal.Workbench;
-
-
-/**
- * @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() || ((Workbench) PlatformUI.getWorkbench()).isClosing();
-		} catch (RuntimeException e) {
-			return false;
-		}
-	}
-
-}
\ 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/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 926f899..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/ValidationStatus.java
+++ /dev/null
@@ -1,163 +0,0 @@
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-/*
- * Licensed Material - Property of IBM 
- * (C) Copyright IBM Corp. 2001, 2002 - All Rights Reserved. 
- * US Government Users Restricted Rights - Use, duplication or disclosure 
- * restricted by GSA ADP Schedule Contract with IBM Corp. 
- */
-
-
-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 00eb1f0..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPCommonUIResourceHandler.java
+++ /dev/null
@@ -1,76 +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 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 java.text.MessageFormat;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * @author vijayb
- * 
- * TODO To change the template for this generated type comment go to Window - Preferences - Java -
- * Code Style - Code Templates
- */
-public class WTPCommonUIResourceHandler {
-
-	private static ResourceBundle fgResourceBundle;
-
-	/**
-	 * Returns the resource bundle used by all classes in this Project
-	 */
-	public static ResourceBundle getResourceBundle() {
-		try {
-			return ResourceBundle.getBundle("wtpcommonui"); //$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.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPDataModelSynchHelper.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPDataModelSynchHelper.java
deleted file mode 100644
index 8a13020..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPDataModelSynchHelper.java
+++ /dev/null
@@ -1,555 +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.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.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.internal.operations.WTPOperationDataModel;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModelEvent;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModelListener;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPPropertyDescriptor;
-
-/**
- * This class is EXPERIMENTAL and is subject to substantial changes.
- */
-public class WTPDataModelSynchHelper implements WTPOperationDataModelListener {
-	protected WTPOperationDataModel 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);
-				WTPPropertyDescriptor[] descriptors = dataModel.getValidPropertyDescriptors(propertyName);
-				String description = combo.getText();
-				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) {
-				WTPPropertyDescriptor[] 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 WTPDataModelSynchHelper(WTPOperationDataModel 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(WTPOperationDataModelEvent event) {
-		String propertyName = event.getPropertyName();
-		int flag = event.getFlag();
-		if (flag == WTPOperationDataModelEvent.ENABLE_CHG)
-			setEnablement(propertyName, event.isEnabled().booleanValue());
-		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 WTPOperationDataModelListener for the flag values.
-	 */
-	public void synchUIWithModel(String propertyName, int flag) {
-		if (null != propertyToWidgetHash && propertyToWidgetHash.containsKey(propertyName)) {
-			try {
-				dataModel.setIgnorePropertyChanges(true);
-				currentWidget = (Widget) propertyToWidgetHash.get(propertyName);
-				if (currentWidget != null && currentWidget != currentWidgetFromEvent) {
-					ignoreModifyEvent = true;
-					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(propertyName);
-				}
-			} finally {
-				currentWidget = null;
-				dataModel.setIgnorePropertyChanges(false);
-			}
-		}
-	}
-
-	/**
-	 * @param control
-	 */
-	private void setEnablement(String propertyName) {
-		if (currentWidget == null)
-			return;
-		Boolean enabled = dataModel.isEnabled(propertyName);
-		if (enabled != null)
-			setEnablement((Control) currentWidget, enabled.booleanValue());
-	}
-
-	/**
-	 * @param control
-	 * @param enabled
-	 */
-	private void setEnablement(Control control, boolean enabled) {
-		if (control.isEnabled() != enabled)
-			control.setEnabled(enabled);
-		setDependentControlEnablement(control, enabled);
-	}
-
-	private void setEnablement(String propertyName, boolean enabled) {
-		if (propertyToWidgetHash != null) {
-			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 == WTPOperationDataModelEvent.VALID_VALUES_CHG || combo.getItemCount() == 0) {
-			// Display properties should only fire if the contents change.
-			WTPPropertyDescriptor[] 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, WTPOperationDataModelEvent.PROPERTY_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, WTPOperationDataModelEvent.PROPERTY_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
-	 * WTPOperationDataModel.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 WTPOperationDataModel getDataModel() {
-		return dataModel;
-	}
-
-	public void dispose() {
-		dataModel.removeListener(this);
-		checkboxSelectionListener = null;
-		currentWidget = null;
-		modifyTextListener = null;
-		propertyToWidgetHash = null;
-		timedModifyListener = null;
-		widgetToDepControls = null;
-		widgetToPropertyHash = 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/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/WTPOperationAction.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPOperationAction.java
deleted file mode 100644
index 47cd071..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPOperationAction.java
+++ /dev/null
@@ -1,225 +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 29, 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 java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IActionDelegate;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchSite;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.common.frameworks.internal.operation.extensionui.MasterDescriptor;
-import org.eclipse.wst.common.frameworks.internal.operation.extensionui.UIOperationExtensionRegistry;
-import org.eclipse.wst.common.frameworks.internal.operation.extensionui.WTPOptionalOperationDataModel;
-import org.eclipse.wst.common.frameworks.internal.operations.ComposedOperation;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperation;
-
-import org.eclipse.jem.util.logger.proxy.Logger;
-
-/**
- * @author mdelder
- * 
- * TODO To change the template for this generated type comment go to Window - Preferences - Java -
- * Code Generation - Code and Comments
- */
-public class WTPOperationAction extends Action implements IActionDelegate, IViewActionDelegate {
-
-	private IStructuredSelection selection;
-
-	private IViewPart viewPart;
-
-	private IWorkbenchSite workbenchSite;
-
-	public WTPOperationAction() {
-	}
-
-	public WTPOperationAction(String id, String name) {
-		super(name);
-		init(id, null);
-	}
-
-	public WTPOperationAction(String id, String name, ImageDescriptor imgDescriptor) {
-		super(name, imgDescriptor);
-		init(id, null);
-	}
-
-	public WTPOperationAction(String id, String name, IWorkbenchSite site) {
-		super(name);
-		init(id, site);
-	}
-
-	public WTPOperationAction(String id, String name, ImageDescriptor imgDescriptor, IWorkbenchSite site) {
-		super(name, imgDescriptor);
-		init(id, site);
-	}
-
-	/**
-	 * @param id
-	 * @param site
-	 */
-	private void init(String id, IWorkbenchSite site) {
-		this.setId(id);
-		this.setWorkbenchSite(site);
-	}
-
-	/**
-	 * @param selection
-	 * @return
-	 */
-	protected boolean updateSelection(IAction action, IStructuredSelection selection1) {
-		this.selection = selection1;
-		MasterDescriptor[] masters = UIOperationExtensionRegistry.INSTANCE.getExtendedUIOperations(action.getId(), selection);
-		action.setEnabled(masters.length > 0);
-		return masters.length > 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		run(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public final void run(IAction action) {
-
-		if (action == null)
-			return;
-
-		WTPOptionalOperationDataModel operationDataModel = WTPOptionalOperationDataModel.createDataModel(action.getId(), this.selection);
-		operationDataModel.setProperty(WTPOptionalOperationDataModel.IWORKBENCH_SITE, getWorkbenchSite());
-
-		executeCompoundOperation(operationDataModel);
-	}
-
-	/**
-	 * @return
-	 */
-	public IWorkbenchSite getWorkbenchSite() {
-		if (workbenchSite != null)
-			return workbenchSite;
-		if (viewPart != null)
-			return viewPart.getSite();
-		return null;
-	}
-
-	/**
-	 * @param shell
-	 * @param operationDataModel
-	 * @param exec
-	 */
-	protected void executeCompoundOperation(WTPOptionalOperationDataModel operationDataModel) {
-		Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
-		try {
-			WTPOperation operation = operationDataModel.getDefaultOperation();
-			operationDataModel.setOperationValidationEnabled(true);
-			final List runnables = ((ComposedOperation) operation).getRunnables();
-			/*
-			 * PlatformUI.getWorkbench().getProgressService().run(true, false, new
-			 * IRunnableWithProgress() {
-			 * 
-			 * 
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.operation.IRunnableWithProgress#run(org.eclipse.core.runtime.IProgressMonitor)
-			 * 
-			 * public void run(IProgressMonitor monitor) throws InvocationTargetException,
-			 * InterruptedException {
-			 */
-			/* monitor.beginTask("Executing compound operation", runnables.size()); */
-			SubProgressMonitor submonitor = null;
-			for (int i = 0; i < runnables.size(); i++) {
-				final WTPOperation op = (WTPOperation) runnables.get(i);
-				if (op != null) {
-					/* submonitor = new SubProgressMonitor(monitor, 3); */
-					op.run(submonitor);
-				}
-				/* monitor.worked(1); */
-			}
-			/* monitor.done(); */
-			/*
-			 * } });
-			 */
-			/* operation.run(new NullProgressMonitor()); */
-			status = operation.getStatus();
-			if (!status.isOK()) {
-				ErrorDialog.openError(shell, WTPCommonUIResourceHandler.getString("WTPOperationAction_UI_0"), WTPCommonUIResourceHandler.getString("WTPOperationAction_UI_1"), status); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-
-		} catch (Exception e) {
-			Logger.getLogger().logError(e);
-			status = new Status(IStatus.ERROR, WTPUIPlugin.PLUGIN_ID, 0, e.toString(), e);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection1) {
-		if (selection1 instanceof IStructuredSelection)
-			setEnabled(updateSelection(action, (IStructuredSelection) selection1));
-		else {
-			action.setEnabled(false);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	public void init(IViewPart view) {
-		this.viewPart = view;
-	}
-
-	/**
-	 * @param workbenchSite
-	 *            The workbenchSite to set.
-	 */
-	public void setWorkbenchSite(IWorkbenchSite workbenchSite) {
-		this.workbenchSite = workbenchSite;
-	}
-
-	protected IStatus status;
-
-	/**
-	 * @return Returns the status.
-	 */
-	public IStatus getStatus() {
-		return status;
-	}
-}
\ 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/WTPOptionalOperationAction.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPOptionalOperationAction.java
deleted file mode 100644
index a2d36d3..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPOptionalOperationAction.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
- *******************************************************************************/
-/*
- * Created on Apr 29, 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.core.runtime.Status;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchSite;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.common.frameworks.internal.operation.extensionui.IOperationNode;
-import org.eclipse.wst.common.frameworks.internal.operation.extensionui.WTPActionDialog;
-import org.eclipse.wst.common.frameworks.internal.operation.extensionui.WTPOptionalOperationDataModel;
-
-
-/**
- * @author mdelder
- * 
- * TODO To change the template for this generated type comment go to Window - Preferences - Java -
- * Code Generation - Code and Comments
- */
-public class WTPOptionalOperationAction extends WTPOperationAction {
-
-	public WTPOptionalOperationAction() {
-	}
-
-
-	public WTPOptionalOperationAction(String id, String name) {
-		super(id, name);
-	}
-
-	public WTPOptionalOperationAction(String id, String name, ImageDescriptor imgDescriptor) {
-		super(id, name, imgDescriptor);
-	}
-
-
-	public WTPOptionalOperationAction(String id, String name, IWorkbenchSite site) {
-		super(id, name, site);
-	}
-
-	public WTPOptionalOperationAction(String id, String name, ImageDescriptor imgDescriptor, IWorkbenchSite site) {
-		super(id, name, imgDescriptor, site);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.ui.WTPOperationAction#executeCompoundOperation(org.eclipse.wst.common.frameworks.internal.operation.extension.ui.WTPOptionalOperationDataModel)
-	 */
-	protected void executeCompoundOperation(WTPOptionalOperationDataModel operationDataModel) {
-		if (operationDataModel != null) {
-			IOperationNode root = (IOperationNode) operationDataModel.getProperty(WTPOptionalOperationDataModel.OPERATION_TREE);
-			if (WTPOptionalOperationDataModel.getOptionalChildren(root).length > 0) {
-				Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
-				WTPActionDialog optionalDialog = new WTPActionDialog(shell, operationDataModel);
-				optionalDialog.setId(getId());
-				if (optionalDialog.open() == Window.OK)
-					super.executeCompoundOperation(operationDataModel);
-				else
-					status = Status.CANCEL_STATUS;
-			} else
-				super.executeCompoundOperation(operationDataModel);
-		}
-	}
-}
\ 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 a5fe912..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, 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.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;
-	}
-}
\ 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/WTPWizard.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPWizard.java
deleted file mode 100644
index 62b5dd8..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPWizard.java
+++ /dev/null
@@ -1,390 +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.ui;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.util.Assert;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.wst.common.frameworks.internal.enablement.EnablementManager;
-import org.eclipse.wst.common.frameworks.internal.operation.extensionui.WizardPageElement;
-import org.eclipse.wst.common.frameworks.internal.operation.extensionui.WizardPageExtensionManager;
-import org.eclipse.wst.common.frameworks.internal.operations.FailSafeComposedOperation;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperation;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
-
-import org.eclipse.jem.util.logger.proxy.Logger;
-
-
-/**
- * This class is EXPERIMENTAL and is subject to substantial changes.
- */
-public abstract class WTPWizard extends Wizard {
-
-	private IExtendedWizardPage[] extendedPages = null;
-	private IExtendedPageHandler[] extendedPageHandlers = null;
-
-
-	protected WTPOperationDataModel model;
-
-	public WTPWizard(WTPOperationDataModel model) {
-		this.model = model;
-	}
-
-	public WTPWizard() {
-		this.model = createDefaultModel();
-	}
-
-	/**
-	 * Return a new default WTPOperationDataModel.
-	 * 
-	 * @return
-	 */
-	protected abstract WTPOperationDataModel createDefaultModel();
-
-	/**
-	 * @return the wizard ID that clients should extend to add to this wizard
-	 */
-	public String getWizardID() {
-		return this.getClass().getName();
-	}
-	
-	/**
-	 * The <code>Wizard</code> implementation of this <code>IWizard</code> method creates all
-	 * the pages controls using <code>IDialogPage.createControl</code>. Subclasses should
-	 * reimplement this method if they want to delay creating one or more of the pages lazily. The
-	 * framework ensures that the contents of a page will be created before attempting to show it.
-	 */
-	public void createPageControls(Composite pageContainer) {
-		IWizardPage[] pages = getPages();
-		// the default behavior is to create all the pages controls
-		for (int i = 0; i < pages.length; i++) {
-			if (isExtendedPage(pages[i])) {
-				try {
-					pages[i].createControl(pageContainer);
-				} catch (Exception e) {
-					Logger.getLogger().logError(e);
-					continue;
-				}
-			} else {
-				pages[i].createControl(pageContainer);
-			}
-			// page is responsible for ensuring the created control is
-			// accessable
-			// via getControl.
-			Assert.isNotNull(pages[i].getControl());
-		}
-	}
-
-	protected boolean isExtendedPage(IWizardPage page) {
-		for (int i = 0; null != extendedPages && i < extendedPages.length; i++) {
-			if (page == extendedPages[i]) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-
-	/**
-	 * This is finalized to handle the adding of extended pages. Clients should override
-	 * doAddPages() to add their pages.
-	 */
-	public final void addPages() {
-		doAddPages();
-		addExtensionPages();
-	}
-
-	/**
-	 * Subclasses should override this method to add pages.
-	 */
-	protected void doAddPages() {
-
-	}
-
-	private void addExtensionPages() {
-		String wizardID = getWizardID();
-		WizardPageElement wizElement = null;
-		if (wizardID == null)
-			return;
-		WizardPageElement[] elements = WizardPageExtensionManager.getInstance().getPageElements(getWizardID());
-		IExtendedWizardPage[] extendedPagesLocal = null;
-		IExtendedPageHandler extendedPageHandler = null;
-		List extendedPagesList = new ArrayList();
-		List extendedPageHandlerList = new ArrayList();
-		for (int i = 0; i < elements.length; i++) {
-			wizElement = elements[i];
-			try {
-				extendedPagesLocal = wizElement.createPageGroup(model);
-				if (null != extendedPagesLocal) {
-					for (int j = 0; j < extendedPagesLocal.length; j++) {
-						addPage(extendedPagesLocal[j]);
-						extendedPagesList.add(extendedPagesLocal[j]);
-					}
-				}
-				extendedPageHandler = wizElement.createPageHandler(model);
-				if (null != extendedPageHandler && !extendedPageHandlerList.contains(extendedPageHandler)) {
-					extendedPageHandlerList.add(extendedPageHandler);
-				}
-			} catch (RuntimeException runtime) {
-				Logger.getLogger().logError(WTPCommonUIResourceHandler.getString("ExtendableWizard_UI_0", new Object[]{wizElement.getPluginID(), wizElement.pageGroupID})); //$NON-NLS-1$
-				Logger.getLogger().logError(runtime);
-			}
-		}
-		extendedPages = new IExtendedWizardPage[extendedPagesList.size()];
-		for (int i = 0; i < extendedPages.length; i++) {
-			extendedPages[i] = (IExtendedWizardPage) extendedPagesList.get(i);
-		}
-		extendedPageHandlers = new IExtendedPageHandler[extendedPageHandlerList.size()];
-		for (int i = 0; i < extendedPageHandlers.length; i++) {
-			extendedPageHandlers[i] = (IExtendedPageHandler) extendedPageHandlerList.get(i);
-		}
-
-	}
-
-	public IWizardPage getNextPage(IWizardPage page) {
-		IWizardPage expectedPage = super.getNextPage(page);
-		if (expectedPage instanceof IExtendedWizardPage) {
-			IExtendedWizardPage extendedWizardPage = (IExtendedWizardPage) expectedPage;
-			if (!EnablementManager.INSTANCE.getIdentifier(extendedWizardPage.getGroupID(), getModel().getTargetProject()).isEnabled())
-				return getNextPage(expectedPage);
-		}
-		String expectedPageName = (null == expectedPage) ? null : expectedPage.getName();
-		String nextPageName = null;
-		for (int i = 0; null != extendedPageHandlers && i < extendedPageHandlers.length; i++) {
-			nextPageName = extendedPageHandlers[i].getNextPage(page.getName(), expectedPageName);
-			if (null != nextPageName) {
-				if (nextPageName.equals(IExtendedPageHandler.SKIP_PAGE)) {
-					return getNextPage(expectedPage);
-				} else if (nextPageName.startsWith(IExtendedPageHandler.PAGE_AFTER)) {
-					String tempNextPageName = nextPageName.substring(IExtendedPageHandler.PAGE_AFTER.length());
-					IWizardPage tempNextPage = getPage(tempNextPageName);
-					return null == tempNextPage ? null : super.getNextPage(tempNextPage);
-				}
-				return getPage(nextPageName);
-			}
-		}
-		return expectedPage;
-	}
-
-	public IWizardPage getPreviousPage(IWizardPage page) {
-		IWizardPage expectedPage = super.getPreviousPage(page);
-		String expectedPageName = (null == expectedPage) ? null : expectedPage.getName();
-		String previousPageName = null;
-		for (int i = 0; null != extendedPageHandlers && i < extendedPageHandlers.length; i++) {
-			previousPageName = extendedPageHandlers[i].getPreviousPage(page.getName(), expectedPageName);
-			if (null != previousPageName) {
-				if (previousPageName.equals(IExtendedPageHandler.SKIP_PAGE)) {
-					return getPreviousPage(expectedPage);
-				} else if (previousPageName.startsWith(IExtendedPageHandler.PAGE_AFTER)) {
-					String tempPreviousPageName = previousPageName.substring(IExtendedPageHandler.PAGE_AFTER.length());
-					IWizardPage tempPreviousPage = getPage(tempPreviousPageName);
-					return null == tempPreviousPage ? null : super.getPreviousPage(tempPreviousPage);
-				}
-				return getPage(previousPageName);
-			}
-		}
-		return expectedPage;
-	}
-
-	public boolean canFinish() {
-		if (!super.canFinish() || !model.isValid()) {
-			return false;
-		}
-		for (int i = 0; null != extendedPages && i < extendedPages.length; i++) {
-			if (!extendedPages[i].canPageFinish()) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	protected void resetAfterFinishError() {
-		IWizardPage[] pages = getPages();
-		for (int i = 0; i < pages.length; i++) {
-			WTPWizardPage wtpPage = (WTPWizardPage) pages[i];
-			wtpPage.validatePage(true);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.IWizard#performFinish()
-	 */
-	public final boolean performFinish() {
-		WTPOperation op = null;
-		boolean wasSuccessful = false;
-		try {
-			model.setProperty(WTPOperationDataModel.UI_OPERATION_HANLDER, new UIOperationHandler(getShell()));
-			if (prePerformFinish()) {
-				storeDefaultSettings();
-				op = createOperation();
-				if (!model.getBooleanProperty(WTPOperationDataModel.RUN_OPERATION)) {
-					model.setProperty(WTPOperationDataModel.CACHED_DELAYED_OPERATION, op);
-					wasSuccessful = isSuccessfulFinish(op);
-					return wasSuccessful;
-				}
-				if (op != null) {
-					IRunnableWithProgress runnable = WTPUIPlugin.getRunnableWithProgress(op);
-					try {
-						getContainer().run(runForked(), isCancelable(), runnable);
-						postPerformFinish();
-					} catch (InvocationTargetException e) {
-						Logger.getLogger().logError(e);
-						ErrorDialog.openError(getShell(), WTPCommonUIResourceHandler.getString("WTPWizard_UI_0", new Object[]{getWindowTitle()}), WTPCommonUIResourceHandler.getString("WTPWizard_UI_1", new Object[]{getWindowTitle()}), e, 0, false); //$NON-NLS-1$ //$NON-NLS-2$
-						wasSuccessful = false;
-						return wasSuccessful;
-					} catch (InterruptedException e) {
-						Logger.getLogger().logError(e);
-						wasSuccessful = false;
-						return wasSuccessful;
-					}
-				}
-			}
-			wasSuccessful = isSuccessfulFinish(op);
-			return wasSuccessful;
-		} finally {
-			if (!wasSuccessful) {
-				resetAfterFinishError();
-			}
-		}
-	}
-
-	/**
-	 * @param op
-	 * @return
-	 */
-	protected boolean isSuccessfulFinish(WTPOperation op) {
-		return op != null;
-	}
-
-	/**
-	 * 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 WTPWizardPage)
-			((WTPWizardPage) 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;
-	}
-
-
-	/**
-	 * This is the base operation the wizard will run when finished. If the wizard is extended, then
-	 * this operation will run first followed by any extensions.
-	 * 
-	 * @return
-	 */
-	protected WTPOperation createBaseOperation() {
-		return model.getDefaultOperation();
-	}
-
-	/**
-	 * Returs the operation this wizard is going to run. This is final to handle extended pages;
-	 * subclasses should override createBaseOperation.
-	 * 
-	 * @return
-	 */
-	protected final WTPOperation createOperation() {
-		WTPOperation baseOperation = createBaseOperation();
-		FailSafeComposedOperation composedOperation = null;
-		for (int i = 0; null != extendedPages && i < extendedPages.length; i++) {
-			WTPOperation op = extendedPages[i].createOperation();
-			if (op != null) {
-				if (composedOperation == null) {
-					composedOperation = new FailSafeComposedOperation();
-					composedOperation.append(baseOperation);
-				}
-				composedOperation.append(op);
-			}
-		}
-		return composedOperation != null ? composedOperation : baseOperation;
-	}
-
-	/**
-	 * @return Returns the model.
-	 */
-	public WTPOperationDataModel getModel() {
-		return model;
-	}
-
-	public void dispose() {
-		super.dispose();
-		if (null != model) {
-			model.dispose();
-		}
-	}
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.Wizard#getNextPage(org.eclipse.jface.wizard.IWizardPage)
-	 */
-
-
-	public void addPage(IWizardPage page) {
-		if (model.isProperty(WTPWizardSkipPageDataModel.SKIP_PAGES) && null != page.getName()) {
-			List pagesToSkip = (List) model.getProperty(WTPWizardSkipPageDataModel.SKIP_PAGES);
-			if (null != pagesToSkip && pagesToSkip.contains(page.getName())) {
-				return;
-			}
-		}
-		super.addPage(page);
-	}
-}
\ 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/WTPWizardPage.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPWizardPage.java
deleted file mode 100644
index 8a8dd4f..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPWizardPage.java
+++ /dev/null
@@ -1,390 +0,0 @@
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-/*
- * Licensed Material - Property of IBM (C) Copyright IBM Corp. 2001, 2002 - All Rights Reserved. US
- * Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP
- * Schedule Contract with IBM Corp.
- */
-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.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.help.WorkbenchHelp;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModelEvent;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModelListener;
-
-/**
- * This class is EXPERIMENTAL and is subject to substantial changes.
- */
-public abstract class WTPWizardPage extends WizardPage implements Listener, WTPOperationDataModelListener {
-	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 WTPOperationDataModel model;
-	private Map validationMap;
-	private String[] validationPropertyNames;
-	protected WTPDataModelSynchHelper synchHelper;
-	private String infopopID;
-
-	/**
-	 * J2EEWizardPage constructor comment.
-	 * 
-	 * @param pageName
-	 *            java.lang.String
-	 */
-	protected WTPWizardPage(WTPOperationDataModel model, String pageName) {
-		super(pageName);
-		this.model = model;
-		model.addListener(this);
-		synchHelper = initializeSynchHelper(model);
-	}
-
-	/**
-	 * @return
-	 */
-	public WTPDataModelSynchHelper initializeSynchHelper(WTPOperationDataModel dm) {
-		return new WTPDataModelSynchHelper(dm);
-	}
-
-	/**
-	 * J2EEWizardPage constructor comment.
-	 * 
-	 * @param pageName
-	 *            java.lang.String
-	 * @param title
-	 *            java.lang.String
-	 * @param titleImage
-	 *            org.eclipse.jface.resource.ImageDescriptor
-	 */
-	protected WTPWizardPage(WTPOperationDataModel 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));
-		}
-	}
-
-	/**
-	 * 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)
-			WorkbenchHelp.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 {
-			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(WTPOperationDataModelEvent event) {
-		String propertyName = event.getPropertyName();
-		if (validationPropertyNames != null && (event.getFlag() == WTPOperationDataModelEvent.PROPERTY_CHG || (!isPageComplete() && event.getFlag() == WTPOperationDataModelEvent.VALID_VALUES_CHG))) {
-			for (int i = 0; i < validationPropertyNames.length; i++) {
-				if (validationPropertyNames[i].equals(propertyName)) {
-					validatePage();
-					break;
-				}
-			}
-		}
-	}
-
-	/**
-	 * @return Returns the model.
-	 */
-	protected WTPOperationDataModel getModel() {
-		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/ui/WTPWizardSelectionPage.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPWizardSelectionPage.java
deleted file mode 100644
index 4382c0e..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPWizardSelectionPage.java
+++ /dev/null
@@ -1,144 +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 Jan 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.frameworks.internal.ui;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.wizard.IWizard;
-import org.eclipse.jface.wizard.IWizardNode;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
-
-/**
- * @author DABERG
- * 
- * To change the template for this generated type comment go to Window>Preferences>Java>Code
- * Generation>Code and Comments
- */
-public abstract class WTPWizardSelectionPage extends WTPWizardPage {
-	/**
-	 * @param model
-	 * @param pageName
-	 */
-	public WTPWizardSelectionPage(WTPOperationDataModel model, String pageName) {
-		super(model, pageName);
-	}
-
-	/**
-	 * @param model
-	 * @param pageName
-	 * @param title
-	 * @param titleImage
-	 */
-	public WTPWizardSelectionPage(WTPOperationDataModel model, String pageName, String title, ImageDescriptor titleImage) {
-		super(model, pageName, title, titleImage);
-	}
-
-	/**
-	 * The selected node; <code>null</code> if none.
-	 */
-	private IWizardNode selectedNode = null;
-
-	/**
-	 * List of wizard nodes that have cropped up in the past (element type: <code>IWizardNode</code>).
-	 */
-	private List selectedWizardNodes = new ArrayList();
-
-	/**
-	 * Adds the given wizard node to the list of selected nodes if it is not already in the list.
-	 * 
-	 * @param node
-	 *            the wizard node, or <code>null</code>
-	 */
-	private void addSelectedNode(IWizardNode node) {
-		if (node == null)
-			return;
-
-		if (selectedWizardNodes.contains(node))
-			return;
-
-		selectedWizardNodes.add(node);
-	}
-
-	/**
-	 * The <code>WizardSelectionPage</code> implementation of this <code>IWizardPage</code>
-	 * method returns <code>true</code> if there is a selected node.
-	 */
-	public boolean canFlipToNextPage() {
-		return isPageComplete() && selectedNode != null;
-	}
-
-	/**
-	 * The <code>WizardSelectionPage</code> implementation of an <code>IDialogPage</code> method
-	 * disposes of all nested wizards. Subclasses may extend.
-	 */
-	public void dispose() {
-		super.dispose();
-		// notify nested wizards
-		for (int i = 0; i < selectedWizardNodes.size(); i++) {
-			((IWizardNode) selectedWizardNodes.get(i)).dispose();
-		}
-	}
-
-	/**
-	 * The <code>WizardSelectionPage</code> implementation of this <code>IWizardPage</code>
-	 * method returns the first page of the currently selected wizard if there is one.
-	 */
-	public IWizardPage getNextPage() {
-		if (selectedNode == null)
-			return null;
-
-		boolean isCreated = selectedNode.isContentCreated();
-
-		IWizard wizard = selectedNode.getWizard();
-
-		if (wizard == null) {
-			setSelectedNode(null);
-			return null;
-		}
-
-		if (!isCreated)
-			// Allow the wizard to create its pages
-			wizard.addPages();
-
-		return wizard.getStartingPage();
-	}
-
-	/**
-	 * Returns the currently selected wizard node within this page.
-	 * 
-	 * @return the wizard node, or <code>null</code> if no node is selected
-	 */
-	public IWizardNode getSelectedNode() {
-		return selectedNode;
-	}
-
-	/**
-	 * Sets or clears the currently selected wizard node within this page.
-	 * 
-	 * @param node
-	 *            the wizard node, or <code>null</code> to clear
-	 */
-	protected void setSelectedNode(IWizardNode node) {
-		addSelectedNode(node);
-		selectedNode = node;
-		if (isCurrentPage())
-			getContainer().updateButtons();
-	}
-}
\ 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/WTPWizardSkipPageDataModel.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPWizardSkipPageDataModel.java
deleted file mode 100644
index 22532f4..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPWizardSkipPageDataModel.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 May 25, 2004
- *
- */
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-import java.util.Collections;
-
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperation;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
-
-
-/**
- * @author jsholl
- *  
- */
-public class WTPWizardSkipPageDataModel extends WTPOperationDataModel {
-
-	/**
-	 * A List of Strings identifying the page id's to skip
-	 */
-	public static final String SKIP_PAGES = "WTPWizardSkipPageDataModel.SKIP_PAGES"; //$NON-NLS-1$
-
-	public WTPOperation getDefaultOperation() {
-		return null;
-	}
-
-	protected void initValidBaseProperties() {
-		super.initValidBaseProperties();
-		addValidBaseProperty(SKIP_PAGES);
-	}
-
-	protected Object getDefaultProperty(String propertyName) {
-		if (propertyName.equals(SKIP_PAGES)) {
-			return Collections.EMPTY_LIST;
-		}
-		return super.getDefaultProperty(propertyName);
-	}
-
-}
\ 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/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 82aea76..0000000
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WorkspaceModifyComposedOperation.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package org.eclipse.wst.common.frameworks.internal.ui;
-
-/*
- * Licensed Material - Property of IBM 
- * (C) Copyright IBM Corp. 2001, 2002 - All Rights Reserved. 
- * US Government Users Restricted Rights - Use, duplication or disclosure 
- * restricted by GSA ADP Schedule Contract with IBM Corp. 
- */
-
-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 da6dc6b..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.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<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 ce4d9ca..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/.cvsignore
+++ /dev/null
@@ -1,5 +0,0 @@
-bin
-build.xml
-temp.folder
-common_core.jar
-common.jar
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/build.properties b/plugins/org.eclipse.wst.common.frameworks/build.properties
deleted file mode 100644
index 69bbf71..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/build.properties
+++ /dev/null
@@ -1,20 +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
-###############################################################################
-output.common_core.jar = bin/
-bin.includes = plugin.xml,\
-               common_core.jar,\
-               common.jar,\
-               .options
-jars.compile.order = common_core.jar,\
-                     common.jar
-src.includes = schema/
-source.common_core.jar = src-non_workbench/
-source.common.jar = 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 aaae1d3..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/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.frameworks"><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"/><package name="org.eclipse.wst.common.frameworks.datamodel"></package><package name="org.eclipse.wst.common.frameworks.datamodel.properties"></package></component>
\ No newline at end of file
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 0c058e1..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/plugin.properties
+++ /dev/null
@@ -1,11 +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
-###############################################################################
-provider=Eclipse.org
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 cf1a540..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/plugin.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="org.eclipse.wst.common.frameworks"
-   name="org.eclipse.wst.common.frameworks"
-   version="1.0.0"
-   description="This is a holding place for common frameworks used by components used in WTP currently it includes the following frameworks: operation/data model,function groups framework"
-   class="org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin"
-   provider-name="%provider">
-
-   <runtime>
-      <library name="common.jar">
-         <export name="*"/>
-      </library>
-      <library name="common_core.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.core.resources"/>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.eclipse.core.commands" export="true"/>
-      <import plugin="org.eclipse.jem.util" export="true"/>
-   </requires>
-
-
-   <extension-point id="ExtendableOperation" name="Extendable Operation" schema="schema/ExtendableOperation.exsd"/>
-   <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="validationSelectionHandler" name="validationSelectionHandler" schema="schema/validationSelectionHandler.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.eclispe.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 1f28e21..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/schema/DataModelProviderExtension.exsd
+++ /dev/null
@@ -1,149 +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="DataModelProvider"/>
-      </appInfo>
-      <documentation>
-         [Enter description of this extension point.]
-      </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>
-                  
-               </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="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>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/plugins/org.eclipse.wst.common.frameworks/schema/ExtendableOperation.exsd b/plugins/org.eclipse.wst.common.frameworks/schema/ExtendableOperation.exsd
deleted file mode 100644
index af71234..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/schema/ExtendableOperation.exsd
+++ /dev/null
@@ -1,108 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="com.ibm.etools.j2ee">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="com.ibm.etools.j2ee" id="ExtendableOperation" name="ExtendabledOperation"/>
-      </appInfo>
-      <documentation>
-         [Enter description of this extension point.]
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="extendableOperation"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="extendableOperation">
-      <complexType>
-         <sequence>
-         </sequence>
-         <attribute name="class" 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>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         
-      </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 1af334f..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/schema/OperationExtension.exsd
+++ /dev/null
@@ -1,115 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="com.ibm.etools.j2ee.com.ibm.etools.operations">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="com.ibm.etools.j2ee.com.ibm.etools.operations" id="extension" name="OperationExtension"/>
-      </appInfo>
-      <documentation>
-         [Enter description of this extension point.]
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="operationExtension"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </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>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         
-      </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 42ce152..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/schema/WTPActivityBridgeHelper.exsd
+++ /dev/null
@@ -1,99 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="com.ibm.wtp.common">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.common.frameworks" id="WTPActivityBridge" name="WTPActivityBridge"/>
-      </appInfo>
-      <documentation>
-         [Enter description of this extension point.]
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="WTPActivityBridgeHelper"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="WTPActivityBridgeHelper">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         
-      </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 aafd7e3..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/schema/functionGroup.exsd
+++ /dev/null
@@ -1,184 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="com.ibm.etools.emf.workbench">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="com.ibm.etools.emf.workbench" id="group" name="Grouping for function contribution"/>
-      </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>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="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>
-         6.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;code&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;extension&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;point=&quot;com.ibm.wtp.common.functionGroup&quot;&amp;gt;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;functionGroup&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name=&quot;Acme&amp;nbsp;Co.&amp;nbsp;Function&amp;nbsp;Extension&quot;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;functionGroupID=&quot;com.acme.acmepro&quot;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;description=&quot;The&amp;nbsp;AcmePro&amp;nbsp;Extensions&amp;nbsp;add&amp;nbsp;integration&amp;nbsp;to&amp;nbsp;the&amp;nbsp;Acme&amp;nbsp;Web&amp;nbsp;Server.&quot;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;enabledByDefault=&quot;true&quot;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;icon=&quot;...&quot;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url=&quot;http://www.acme.com/&quot;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/&amp;gt;&lt;br&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/extension&amp;gt;&lt;br&gt;
-&lt;/code&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         WTP Function Groups can be referenced through com.ibm.wtp.common.group.WTPFunctionGroupRegistry.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/plugins/org.eclipse.wst.common.frameworks/schema/validationSelectionHandler.exsd b/plugins/org.eclipse.wst.common.frameworks/schema/validationSelectionHandler.exsd
deleted file mode 100644
index 283f7b9..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/schema/validationSelectionHandler.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">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.common.frameworks" id="validationSelectionHandler" name="validationSelectionHandler"/>
-      </appInfo>
-      <documentation>
-         [Enter description of this extension point.]
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="validationSelectionHandler" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="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>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         
-      </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 58eb27b..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/AbstractDataModelOperation.java
+++ /dev/null
@@ -1,91 +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.core.commands.operations.AbstractOperation;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * 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 = AbstractDataModelProvider.OK_STATUS;
-
-	private String id;
-
-	/**
-	 * The IDataModel used by this IDataModelOperation
-	 */
-	protected IDataModel model;
-
-	/**
-	 * Default constructor.
-	 */
-	public AbstractDataModelOperation() {
-		super("");
-	}
-
-	/**
-	 * Constructor taking an IDataModel
-	 * 
-	 * @param model
-	 *            the IDataModel used to drive this operation
-	 */
-	public AbstractDataModelOperation(IDataModel model) {
-		super(""); // TODO add a label property to IDataModel???
-		this.model = model;
-		this.id = model.getID();
-	}
-
-	/**
-	 * 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;
-	}
-}
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 8bf4993..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/AbstractDataModelProvider.java
+++ /dev/null
@@ -1,431 +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 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;
-
-	/**
-	 * <p>
-	 * A utility method for combining property arrays.
-	 * </p>
-	 * 
-	 * @param props1
-	 *            a first property array
-	 * @param props2
-	 *            a second property array
-	 * @return a new property array containing the contents of the first and second property arrays.
-	 */
-	protected static String[] combineProperties(String[] props1, String[] props2) {
-		String[] properties = new String[props1.length + props2.length];
-		System.arraycopy(props1, 0, properties, 0, props1.length);
-		System.arraycopy(props2, 0, properties, props1.length, props2.length);
-		return properties;
-	}
-
-	/**
-	 * <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) {
-		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);
-	}
-
-	/**
-	 * This method only serves as a migration reminder. Clients migratating from
-	 * WTPOperationDataModel should rename this method.
-	 * 
-	 * @deprecated replace with getValidPropertyDescriptors
-	 * @param propertyName
-	 * @return
-	 */
-	protected final void doGetValidPropertyDescriptors(String propertyName) {
-	}
-
-	/**
-	 * This method only serves as a migration reminder. Clients migratating from
-	 * WTPOperationDataModel should rename this method.
-	 * 
-	 * @deprecated replace with getPropertyDescriptor
-	 * @param propertyName
-	 * @return
-	 */
-	protected final void doGetPropertyDescriptor(String propertyName) {
-	}
-
-	/**
-	 * This method only serves as a migration reminder. Clients migratating from
-	 * WTPOperationDataModel should delete this method.
-	 * 
-	 * @deprecated
-	 * @param propertyName
-	 * @return
-	 */
-	protected final void doGetProperty(String propertyName) {
-	}
-
-	/**
-	 * This method only serves as a migration reminder. Clients migratating from
-	 * WTPOperationDataModel should rename this method.
-	 * 
-	 * @deprecated replace with propertySet
-	 * @param propertyName
-	 * @return
-	 */
-	protected final void doSetProperty(String propertyName, Object propertyValue) {
-	}
-
-	/**
-	 * This method only serves as a migration reminder. Clients migratating from
-	 * WTPOperationDataModel should rename this method.
-	 * 
-	 * @deprecated replace with validate
-	 * @param propertyName
-	 * @return
-	 */
-	protected final void doValidateProperty(String propertyName) {
-	}
-
-	/**
-	 * This method only serves as a migration reminder. Clients migratating from
-	 * WTPOperationDataModel should rename this method.
-	 * 
-	 * @deprecated replace with init
-	 * @param propertyName
-	 * @return
-	 */
-	protected final void initValidBaseProperties() {
-	}
-
-	/**
-	 * This method only serves as a migration reminder. Clients migratating from
-	 * WTPOperationDataModel should rename this method.
-	 * 
-	 * @deprecated replace with init
-	 * @param propertyName
-	 * @return
-	 */
-	protected final void initNestedModels() {
-	}
-
-	/**
-	 * This method only serves as a migration reminder. Clients migratating from
-	 * WTPOperationDataModel should rename this method.
-	 * 
-	 * @deprecated replace with isPropertyEnabled
-	 * @param propertyName
-	 * @return
-	 */
-	protected final void basicIsEnabled(String propertyName) {
-	}
-
-	/**
-	 * This method only serves as a migration reminder. Clients migratating from
-	 * WTPOperationDataModel should delete this method.
-	 * 
-	 * @deprecated replace with isPropertyEnabled
-	 * @param propertyName
-	 * @return
-	 */
-	protected final void isResultProperty(String 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 ff07a4f..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, 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.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);
-	}
-}
\ No newline at end of file
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 79134be..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/DataModelPropertyDescriptor.java
+++ /dev/null
@@ -1,136 +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$
-	}
-}
\ 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 7c37928..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/IDataModel.java
+++ /dev/null
@@ -1,721 +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
- * 
- * @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.
-	 * </p>
-	 * 
-	 * @see IDataModelProvider#getDefaultOperation()
-	 * 
-	 * @return the default operation
-	 */
-	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
-	 * 
-	 * @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 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 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 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, then 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 1483f7b..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/IDataModelOperation.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.datamodel;
-
-import org.eclipse.core.commands.operations.IUndoableOperation;
-
-/**
- * <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();
-
-}
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 da96b9e..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/IDataModelProperties.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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.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 {
-
-}
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 980fef7..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/IDataModelProvider.java
+++ /dev/null
@@ -1,118 +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 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 String[] 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/properties/IFlexibleProjectCreationDataModelProperties.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/properties/IFlexibleProjectCreationDataModelProperties.java
deleted file mode 100644
index c1cb0ad..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/properties/IFlexibleProjectCreationDataModelProperties.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.eclipse.wst.common.frameworks.datamodel.properties;
-
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelProperties;
-/**
- * <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
- * 
- * @since 1.0
- */
-public interface IFlexibleProjectCreationDataModelProperties 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 = "IFlexibleProjectCreationDataModelProperties.PROJECT_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 PROJECT_LOCATION = "IFlexibleProjectCreationDataModelProperties.PROJECT_LOCATION"; //$NON-NLS-1$
-    /**
-     * 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.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 70930c3..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, 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 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();
-	}
-}
\ No newline at end of file
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/ExceptionHelper.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/ExceptionHelper.java
deleted file mode 100644
index 56e276c..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/ExceptionHelper.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.eclipse.wst.common.frameworks.internal;
-
-/*
- * Licensed Material - Property of IBM 
- * (C) Copyright IBM Corp. 2001, 2002 - All Rights Reserved. 
- * US Government Users Restricted Rights - Use, duplication or disclosure 
- * restricted by GSA ADP Schedule Contract with IBM Corp. 
- */
-
-
-
-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/FlexibleJavaProjectPreferenceConstants.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/FlexibleJavaProjectPreferenceConstants.java
deleted file mode 100644
index 4d27340..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/FlexibleJavaProjectPreferenceConstants.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.eclipse.wst.common.frameworks.internal;
-
-public interface FlexibleJavaProjectPreferenceConstants {
-	public static final String ALLOW_MULTIPLE_MODULES = "ALLOW_MULTIPLE_MODULES_PER_PROJECT"; //$NON-NLS-1$
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/FlexibleJavaProjectPreferenceUtil.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/FlexibleJavaProjectPreferenceUtil.java
deleted file mode 100644
index cf56553..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/FlexibleJavaProjectPreferenceUtil.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.eclipse.wst.common.frameworks.internal;
-
-import org.eclipse.core.runtime.Preferences;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
-
-
-
-public class FlexibleJavaProjectPreferenceUtil{
-	
-	public static boolean getMultipleModulesPerProjectProp(){
-	
-		Preferences prefs = WTPCommonPlugin.getDefault().getPluginPreferences();
-		return prefs.getBoolean(FlexibleJavaProjectPreferenceConstants.ALLOW_MULTIPLE_MODULES);
-	}
-	
-	public static void setMultipleModulesPerProjectProp(boolean val){
-		Preferences prefs = WTPCommonPlugin.getDefault().getPluginPreferences();
-		prefs.setValue(FlexibleJavaProjectPreferenceConstants.ALLOW_MULTIPLE_MODULES, val);
-		WTPCommonPlugin.getDefault().savePluginPreferences();
-	}
-}
\ 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 743f026..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/ISaveHandler.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.eclipse.wst.common.frameworks.internal;
-
-/*
- * Licensed Material - Property of IBM 
- * (C) Copyright IBM Corp. 2001, 2002 - All Rights Reserved. 
- * US Government Users Restricted Rights - Use, duplication or disclosure 
- * restricted by GSA ADP Schedule Contract with IBM Corp. 
- */
-
-
-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/IValidationSelectionHandler.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/IValidationSelectionHandler.java
deleted file mode 100644
index f5601f9..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/IValidationSelectionHandler.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Created on Nov 23, 2004
- */
-package org.eclipse.wst.common.frameworks.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.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 8fb86d7..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/IWrappedException.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.eclipse.wst.common.frameworks.internal;
-
-/*
- * Licensed Material - Property of IBM 
- * (C) Copyright IBM Corp. 2001, 2002 - All Rights Reserved. 
- * US Government Users Restricted Rights - Use, duplication or disclosure 
- * restricted by GSA ADP Schedule Contract with IBM Corp. 
- */
-
-
-/**
- * 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/SaveFailedException.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/SaveFailedException.java
deleted file mode 100644
index d6d0f48..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/SaveFailedException.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package org.eclipse.wst.common.frameworks.internal;
-
-
-/*
- * Licensed Material - Property of IBM 
- * (C) Copyright IBM Corp. 2001, 2002 - All Rights Reserved. 
- * US Government Users Restricted Rights - Use, duplication or disclosure 
- * restricted by GSA ADP Schedule Contract with IBM Corp. 
- */
-
-
-/**
- * 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 94a3cdc..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/SaveHandlerHeadless.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package org.eclipse.wst.common.frameworks.internal;
-
-/*
- * Licensed Material - Property of IBM 
- * (C) Copyright IBM Corp. 2001, 2002 - All Rights Reserved. 
- * US Government Users Restricted Rights - Use, duplication or disclosure 
- * restricted by GSA ADP Schedule Contract with IBM Corp. 
- */
-
-
-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 9809e1b..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/SaveHandlerRegister.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.eclipse.wst.common.frameworks.internal;
-
-import org.eclipse.jem.util.UIContextDetermination;
-
-/*
- * Licensed Material - Property of IBM (C) Copyright IBM Corp. 2001, 2002 - All
- * Rights Reserved. US Government Users Restricted Rights - Use, duplication or
- * disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
- */
-
-/**
- * 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;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/ValidationSelectionHandlerRegistryReader.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/ValidationSelectionHandlerRegistryReader.java
deleted file mode 100644
index 85760ef..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/ValidationSelectionHandlerRegistryReader.java
+++ /dev/null
@@ -1,87 +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.common.frameworks.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.common.frameworks.internal.plugin.WTPCommonPlugin;
-
-/**
- * @author jlanuti
- *
- * TODO To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Style - Code Templates
- */
-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(WTPCommonPlugin.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.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 baf4485..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/WTPPlugin.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 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.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 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);
-	}
-	
-}
\ No newline at end of file
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 8a882eb..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, 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 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;
-	}
-
-
-}
\ No newline at end of file
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 a2363d2..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/WTPResourceHandler.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package org.eclipse.wst.common.frameworks.internal;
-
-import java.text.MessageFormat;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/*
- * Licensed Material - Property of IBM 
- * (C) Copyright IBM Corp. 2001, 2002 - All Rights Reserved. 
- * US Government Users Restricted Rights - Use, duplication or disclosure 
- * restricted by GSA ADP Schedule Contract with IBM Corp. 
- */
-
-/**
- * @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 e53c51c..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/WrappedException.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package org.eclipse.wst.common.frameworks.internal;
-
-/*
- * Licensed Material - Property of IBM (C) Copyright IBM Corp. 2001, 2002 - All Rights Reserved. US
- * Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP
- * Schedule Contract with IBM Corp.
- */
-
-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 e1f769e..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/WrappedRuntimeException.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package org.eclipse.wst.common.frameworks.internal;
-
-
-/*
- * Licensed Material - Property of IBM (C) Copyright IBM Corp. 2001, 2002 - All Rights Reserved. US
- * Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP
- * Schedule Contract with IBM Corp.
- */
-
-
-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 3e7fe82..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/activities/WTPActivityBridge.java
+++ /dev/null
@@ -1,108 +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.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.IPluginDescriptor;
-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.getPluginRegistry().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();
-		IPluginDescriptor descriptor = extension.getDeclaringPluginDescriptor();
-		StringBuffer buf = new StringBuffer();
-		buf.append("Plugin " + descriptor.getUniqueIdentifier() + ", extension " + extension.getExtensionPointUniqueIdentifier()); //$NON-NLS-1$ //$NON-NLS-2$
-		buf.append("\n" + text); //$NON-NLS-1$
-		Logger.getLogger().logError(buf.toString());
-	}
-}
\ No newline at end of file
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 128d6eb..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";
-
-	private static final String PROVIDER_ELEMENT = "DataModelProvider";
-	private static final String DEFINES_TYPE_ELEMENT = "ProviderDefinesType";
-	private static final String IMPLEMENTS_TYPE_ELEMENT = "ProviderImplementsType";
-
-	private static final String ATTRIBUTE_ID = "id";
-	private static final String ATTRIBUTE_CLASS = "class";
-	private static final String ATTRIBUTE_PROVIDER_TYPE = "providerType";
-	private static final String ATTRIBUTE_PROVIDER_ID = "providerID";
-	private static final String ATTRIBUTE_FG = "functionGroupID";
-
-	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));
-			}
-			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));
-			}
-			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));
-			}
-			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));
-			}
-			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));
-			}
-			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));
-			}
-			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));
-		}
-		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));
-		}
-		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));
-		}
-		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));
-		}
-		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 9547c83..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/datamodel/DataModelImpl.java
+++ /dev/null
@@ -1,446 +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.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.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-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.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 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);
-		String[] propertyNames = dataModelProvider.getPropertyNames();
-		HashSet properties = new HashSet();
-		for (int i = 0; null != propertyNames && i < propertyNames.length; i++) {
-			properties.add(propertyNames[i]);
-		}
-		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 ? new DataModelPropertyDescriptor[0] : 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;
-			} else
-				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() {
-		return new ExtendableOperationImpl(provider.getDefaultOperation());
-	}
-
-	public String toString() {
-		return "IDataModel, provider=" + provider.toString();
-	}
-
-	public String getID() {
-		String id = provider.getID();
-		return null != id ? id : "";
-	}
-}
\ No newline at end of file
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 9ba4911..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/datamodel/ExtendableOperationImpl.java
+++ /dev/null
@@ -1,227 +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.datamodel;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.IUndoContext;
-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.Status;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
-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.DMComposedExtendedOperationHolder;
-import org.eclipse.wst.common.frameworks.internal.operations.DMOperationExtensionRegistry;
-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 OperationStatus opStatus;
-
-	public ExtendableOperationImpl(IDataModelOperation rootOperation) {
-		this.rootOperation = rootOperation;
-	}
-
-	private DMComposedExtendedOperationHolder initializeExtensionOperations() {
-		return DMOperationExtensionRegistry.getExtensions(rootOperation);
-	}
-
-	public IStatus redo(IProgressMonitor monitor, IAdaptable info) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public IStatus undo(IProgressMonitor monitor, IAdaptable info) {
-		// TODO Auto-generated method stub
-		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);
-	}
-
-	public IStatus execute(IProgressMonitor monitor, IAdaptable info) {
-		DMComposedExtendedOperationHolder extOpHolder = initializeExtensionOperations();
-		IStatus preOpStatus = runPreOps(monitor, extOpHolder, info);
-		try {
-			addStatus(rootOperation.execute(monitor, info));
-		} catch (ExecutionException e1) {
-			// TODO Auto-generated catch block
-			e1.printStackTrace();
-		}
-
-		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);
-			}
-		}
-		return opStatus;
-	}
-
-	private IStatus runPreOps(IProgressMonitor pm, DMComposedExtendedOperationHolder extOpHolder, IAdaptable info) {
-		IStatus preOpStatus = null;
-		if ((extOpHolder != null) && extOpHolder.hasPreOps()) {
-			preOpStatus = runExtendedOps(extOpHolder.getPreOps(), pm, info);
-		}
-		return preOpStatus;
-	}
-
-	private IStatus runPostOps(IProgressMonitor pm, DMComposedExtendedOperationHolder 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;
-		for (int i = 0; i < opList.size(); i++) {
-			nestedOp = (IDataModelOperation) opList.get(i);
-			try {
-				opId = nestedOp.getID();
-				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.execute(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() {
-		// TODO Auto-generated method stub
-	}
-
-	public boolean canExecute() {
-		return rootOperation.canExecute();
-	}
-
-	public boolean canRedo() {
-		return rootOperation.canRedo();
-	}
-
-	public boolean canUndo() {
-		return rootOperation.canUndo();
-	}
-
-	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();
-	}
-}
\ No newline at end of file
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 ee23cf9..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, 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 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;
-	}
-
-}
\ No newline at end of file
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 932a7b7..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, 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.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 dde57b0..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, 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 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;
-	}
-
-}
\ No newline at end of file
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 3816622..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, 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 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;
-	}
-
-}
\ No newline at end of file
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 30005a7..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, 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 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$
-	}
-}
\ No newline at end of file
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 4aeb6cf..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/EnablementManager.java
+++ /dev/null
@@ -1,172 +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 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);
-		}
-	}
-
-}
\ No newline at end of file
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 7d720c7..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/FunctionGroup.java
+++ /dev/null
@@ -1,158 +0,0 @@
-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.wst.common.frameworks.internal.WTPResourceHandler;
-
-import org.eclipse.jem.util.logger.proxy.Logger;
-
-/*
- * Licensed Material - Property of IBM (C) Copyright IBM Corp. 2001, 2002 - All
- * Rights Reserved. US Government Users Restricted Rights - Use, duplication or
- * disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
- */
-
-/**
- * @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;
-	}
-
-}
\ No newline at end of file
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 70f7eb1..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, 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 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;
-	}
-}
\ No newline at end of file
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 9938db9..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/FunctionGroupRegistry.java
+++ /dev/null
@@ -1,251 +0,0 @@
-package org.eclipse.wst.common.frameworks.internal.enablement;
-
-/*
- * Licensed Material - Property of IBM (C) Copyright IBM Corp. 2001, 2002 - All
- * Rights Reserved. US Government Users Restricted Rights - Use, duplication or
- * disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
- */
-
-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.wst.common.frameworks.internal.WTPResourceHandler;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
-
-import org.eclipse.jem.util.RegistryReader;
-import org.eclipse.jem.util.logger.proxy.Logger;
-
-/**
- * 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;
-
-	}
-
-}
\ No newline at end of file
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 27e167c..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, 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 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);
-
-
-}
\ No newline at end of file
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 903b3d9..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, 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 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);
-}
\ No newline at end of file
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 e480f72..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, 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 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);
-
-
-}
\ No newline at end of file
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 06dbbcd..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, 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 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);
-
-}
\ No newline at end of file
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 395683a..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, 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;
-
-
-/**
- * @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();
-}
\ No newline at end of file
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 21bc0d9..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, 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;
-
-
-/**
- * @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;
-	}
-}
\ No newline at end of file
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 44b7c9c..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/Util.java
+++ /dev/null
@@ -1,352 +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;
-
-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() {
-	}
-}
\ No newline at end of file
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 8e57fbf..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ComposedExtendedOperationHolder.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.frameworks.internal.operations;
-
-import java.util.ArrayList;
-
-
-
-
-
-public class ComposedExtendedOperationHolder {
-
-	private ArrayList preOps = null;
-	private ArrayList postOps = null;
-
-	/**
-	 *  
-	 */
-	protected ComposedExtendedOperationHolder() {
-		super();
-	}
-
-	protected void addPreOperation(WTPOperation preOp) {
-		if (preOps == null) {
-			preOps = new ArrayList();
-		}
-		preOps.add(preOp);
-	}
-
-	protected void addPostOperation(WTPOperation postOp) {
-		if (postOps == null) {
-			postOps = new ArrayList();
-		}
-		postOps.add(postOp);
-	}
-
-	public boolean hasPreOps() {
-		return preOps != null;
-	}
-
-	public boolean hasPostOps() {
-		return postOps != null;
-	}
-
-	public ArrayList getPostOps() {
-		return postOps;
-	}
-
-	public ArrayList getPreOps() {
-		return preOps;
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ComposedOperation.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ComposedOperation.java
deleted file mode 100644
index 5bb08f4..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ComposedOperation.java
+++ /dev/null
@@ -1,74 +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.operations;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.SubProgressMonitor;
-
-public class ComposedOperation extends WTPOperation {
-
-	protected List fRunnables;
-
-	public ComposedOperation() {
-		super();
-	}
-
-	public ComposedOperation(List nestedRunnablesWithProgress) {
-		super();
-		fRunnables = nestedRunnablesWithProgress;
-	}
-
-	public boolean addRunnable(WTPOperation nestedOp) {
-		return getRunnables().add(nestedOp);
-	}
-
-	public WTPOperation append(WTPOperation op) {
-		this.addRunnable(op);
-		return this;
-	}
-
-	// TODO MDE Make protected
-	public List getRunnables() {
-		if (fRunnables == null)
-			fRunnables = new ArrayList(3);
-		return fRunnables;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.j2ee.operations.IHeadlessRunnableWithProgress#run(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void execute(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-		if (fRunnables == null || fRunnables.isEmpty())
-			return;
-		int size = fRunnables.size();
-		monitor.beginTask("", size);//$NON-NLS-1$
-
-		OperationStatus composedStatus = null;
-		try {
-			for (int i = 0; i < fRunnables.size(); i++) {
-				WTPOperation op = (WTPOperation) fRunnables.get(i);
-				op.run(new SubProgressMonitor(monitor, 1, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK));
-				if (composedStatus == null)
-					composedStatus = new OperationStatus(new IStatus[]{op.getStatus()});
-				else
-					composedStatus.add(op.getStatus());
-			}
-		} finally {
-			if (composedStatus != null)
-				addStatus(composedStatus);
-		}
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/DMComposedExtendedOperationHolder.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/DMComposedExtendedOperationHolder.java
deleted file mode 100644
index 01d3228..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/DMComposedExtendedOperationHolder.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.frameworks.internal.operations;
-
-import java.util.ArrayList;
-
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
-
-
-
-public class DMComposedExtendedOperationHolder {
-
-	private ArrayList preOps = null;
-	private ArrayList postOps = null;
-
-	/**
-	 * 
-	 */
-	protected DMComposedExtendedOperationHolder() {
-		super();
-	}
-
-	protected void addPreOperation(IDataModelOperation preOp) {
-		if (preOps == null) {
-			preOps = new ArrayList();
-		}
-		preOps.add(preOp);
-	}
-
-	protected void addPostOperation(IDataModelOperation postOp) {
-		if (postOps == null) {
-			postOps = new ArrayList();
-		}
-		postOps.add(postOp);
-	}
-
-	public boolean hasPreOps() {
-		return preOps != null;
-	}
-
-	public boolean hasPostOps() {
-		return postOps != null;
-	}
-
-	public ArrayList getPostOps() {
-		return postOps;
-	}
-
-	public ArrayList getPreOps() {
-		return preOps;
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/DMOperationExtensionRegistry.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/DMOperationExtensionRegistry.java
deleted file mode 100644
index 03b0b72..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/DMOperationExtensionRegistry.java
+++ /dev/null
@@ -1,167 +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 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.frameworks.internal.operations;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
-import org.eclipse.wst.common.frameworks.internal.enablement.EnablementManager;
-
-public class DMOperationExtensionRegistry {
-
-	protected static boolean canExtHasRead = false;
-
-	protected static boolean extPointHasRead = false;
-
-	protected static DMOperationExtensionRegistry instance = null;
-
-	protected static HashMap extensibleOperations = null;
-
-	protected static HashMap opExtensions = null;
-
-	protected static OperationExtensibilityReader opExtensibilityReader = null;
-
-	protected static OperationExtensionReader opExtensionReader = null;
-
-	public static String[] getRegisteredOperations(String className) {
-		extensibleOperations = getExtensibility();
-		if (extensibleOperations != null) {
-			String id = (String) extensibleOperations.get(className);
-			if (id == null)
-				return null;
-			if (opExtensions == null)
-				opExtensions = getExtensionPoints();
-			if (opExtensions != null) {
-				Collection ext = (Collection) opExtensions.get(id);
-				if (ext != null)
-					return getClassNames(ext.toArray());
-			}
-		}
-		return null;
-	}
-
-	private static String[] getClassNames(Object[] opExt) {
-		ArrayList classNames = new ArrayList();
-		OperationExtension currentExt = null;
-		for (int i = 0; i < opExt.length; i++) {
-			currentExt = (OperationExtension) opExt[i];
-			/* Only allow extensions which enabled (null project indicates enabled by activity only) */
-			if (EnablementManager.INSTANCE.getIdentifier(currentExt.getExtensionId(), null).isEnabled()) {
-				String className = currentExt.getPreOperationClass();
-				if (null != className) {
-					classNames.add(className);
-				}
-				className = currentExt.getPostOperationClass();
-				if (null != className) {
-					classNames.add(className);
-				}
-			}
-		}
-		String[] array = new String[classNames.size()];
-		classNames.toArray(array);
-		return array;
-	}
-
-	public static DMComposedExtendedOperationHolder getExtensions(String className) {
-		extensibleOperations = getExtensibility();
-		if (extensibleOperations != null) {
-			String id = (String) extensibleOperations.get(className);
-			if (id == null)
-				return null;
-			if (opExtensions == null)
-				opExtensions = getExtensionPoints();
-			if (opExtensions != null) {
-				Collection ext = (Collection) opExtensions.get(id);
-				if (ext != null) {
-					try {
-						return calculateOperationHolder(ext);
-					} catch (CoreException ex) {
-						Logger.getLogger().logError(ex);
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	public static DMComposedExtendedOperationHolder getExtensions(IDataModelOperation op) {
-		return getExtensions(op.getClass().getName());
-	}
-
-	protected String getExtendableOperationId(IDataModelOperation op) {
-		return (String) extensibleOperations.get(op.getClass().getName());
-	}
-
-	private static DMComposedExtendedOperationHolder calculateOperationHolder(Collection ext) throws CoreException {
-		Object[] opExt = ext.toArray();
-		DMComposedExtendedOperationHolder extOperationHolder = new DMComposedExtendedOperationHolder();
-		IDataModelOperation preOp = null;
-		IDataModelOperation postOp = null;
-		OperationExtension currentExt = null;
-		for (int i = 0; i < opExt.length; i++) {
-			currentExt = (OperationExtension) opExt[i];
-			/* Only allow extensions which enabled (null project indicates enabled by activity only) */
-			if (EnablementManager.INSTANCE.getIdentifier(currentExt.getExtensionId(), null).isEnabled()) {
-				preOp = currentExt.getDMPreOperation();
-				if (preOp != null) {
-					extOperationHolder.addPreOperation(preOp);
-				}
-				postOp = currentExt.getDMPostOperation();
-				if (postOp != null) {
-					extOperationHolder.addPostOperation(postOp);
-				}
-			}
-		}
-		return extOperationHolder;
-	}
-
-	private static HashMap getExtensibility() {
-		if (!canExtHasRead) {
-			opExtensibilityReader = new OperationExtensibilityReader();
-			opExtensibilityReader.readRegistry();
-			canExtHasRead = true;
-		}
-		if (opExtensibilityReader == null)
-			return null;
-		return OperationExtensibilityReader.getExtendableOperations();
-	}
-
-	private static HashMap getExtensionPoints() {
-		if (!extPointHasRead) {
-			opExtensionReader = new OperationExtensionReader();
-			opExtensionReader.readRegistry();
-			extPointHasRead = true;
-		}
-		if (opExtensionReader == null)
-			return null;
-		return OperationExtensionReader.getExtensionPoints();
-	}
-
-	/**
-	 * Gets the instance.
-	 * 
-	 * @return Returns a EjbPageExtensionRegistry
-	 */
-	public static DMOperationExtensionRegistry getInstance() {
-		if (instance == null)
-			instance = new DMOperationExtensionRegistry();
-		return instance;
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/FailSafeComposedOperation.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/FailSafeComposedOperation.java
deleted file mode 100644
index c7bfbba..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/FailSafeComposedOperation.java
+++ /dev/null
@@ -1,63 +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 Jan 21, 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.operations;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.List;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.SubProgressMonitor;
-
-import org.eclipse.jem.util.logger.proxy.Logger;
-
-/**
- * @author jsholl
- * 
- * Same as ComposedOperation except the first Operation must run; all others can fail without
- * effecting the ComposedOperation or any other operation following them in the Composed Operation's
- * list.
- */
-public class FailSafeComposedOperation extends ComposedOperation {
-
-	public FailSafeComposedOperation() {
-		super();
-	}
-
-	public FailSafeComposedOperation(List nestedRunnablesWithProgress) {
-		super(nestedRunnablesWithProgress);
-	}
-
-	public 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++) {
-			WTPOperation op = (WTPOperation) fRunnables.get(i);
-			if (i == 0) { //The first one must pass; all others can fail
-				op.run(new SubProgressMonitor(monitor, 1, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK));
-			} else {
-				try {
-					op.run(new SubProgressMonitor(monitor, 1, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK));
-				} catch (InterruptedException e) {
-					throw e;
-				} catch (Exception e) {
-					Logger.getLogger().logError(e);
-				}
-			}
-		}
-	}
-
-}
\ No newline at end of file
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 287b159..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/IHeadlessRunnableWithProgress.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.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;
-}
\ No newline at end of file
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 3399b62..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/IOperationHandler.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package org.eclipse.wst.common.frameworks.internal.operations;
-
-/*
- * Licensed Material - Property of IBM 
- * (C) Copyright IBM Corp. 2001, 2002 - All Rights Reserved. 
- * US Government Users Restricted Rights - Use, duplication or disclosure 
- * restricted by GSA ADP Schedule Contract with IBM Corp. 
- */
-
-/**
- * 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 a2df0e4..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/IProjectCreationProperties.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.frameworks.internal.operations;
-
-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 = "ProjectCreationDataModel.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 = "ProjectCreationDataModel.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 = "ProjectCreationDataModel.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.class.getName() + "PROJECT";
-
-	/**
-	 * IProjectDescription. An non settable property. This is a conveniece for constructiong a
-	 * project description.
-	 */
-	public static final String PROJECT_DESCRIPTION = IProjectCreationProperties.class.getName() + "PROJECT_DESCRIPTION";
-
-}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/NonConflictingRule.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/NonConflictingRule.java
deleted file mode 100644
index a715b4a..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/NonConflictingRule.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 Aug 29, 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.operations;
-
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-
-
-/**
- * @author mdelder
- * 
- * TODO To change the template for this generated type comment go to Window - Preferences - Java -
- * Code Style - Code Templates
- */
-public class NonConflictingRule implements ISchedulingRule {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.jobs.ISchedulingRule#contains(org.eclipse.core.runtime.jobs.ISchedulingRule)
-	 */
-	public boolean contains(ISchedulingRule rule) {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.jobs.ISchedulingRule#isConflicting(org.eclipse.core.runtime.jobs.ISchedulingRule)
-	 */
-	public boolean isConflicting(ISchedulingRule rule) {
-		return false;
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/NullOperationHandler.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/NullOperationHandler.java
deleted file mode 100644
index a068da5..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/NullOperationHandler.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package org.eclipse.wst.common.frameworks.internal.operations;
-
-
-/*
- * Licensed Material - Property of IBM 
- * (C) Copyright IBM Corp. 2001, 2002 - All Rights Reserved. 
- * US Government Users Restricted Rights - Use, duplication or disclosure 
- * restricted by GSA ADP Schedule Contract with IBM Corp. 
- */
-
-/**
- * Simple implementer that ignores messages and always allows actions to continue
- */
-public class NullOperationHandler implements IOperationHandler {
-	/**
-	 * NullOperationHandler constructor comment.
-	 */
-	public NullOperationHandler() {
-		super();
-	}
-
-	/**
-	 * A decision needs to made as to whether an action/operation can continue
-	 */
-	public boolean canContinue(String message) {
-		return true;
-	}
-
-	/**
-	 * A decision needs to made as to whether an action/operation can continue
-	 */
-	public boolean canContinue(String message, String[] items) {
-		return true;
-	}
-
-	/**
-	 * 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(java.lang.String message) {
-		return 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.etools.j2ee.operations.IOperationHandler#canContinueWithAllCheckAllowCancel(java.lang.String)
-	 */
-	public int canContinueWithAllCheckAllowCancel(String message) {
-		return 0;
-	}
-
-	/**
-	 * An error has occurred
-	 */
-	public void error(String message) {
-		System.err.println(message);
-	}
-
-	/**
-	 * An informational message needs to be presented
-	 */
-	public void inform(String message) {
-	}
-
-	/**
-	 * @see com.ibm.etools.j2ee.operations.IOperationHandler#getContext()
-	 */
-	public Object getContext() {
-		return null;
-	}
-
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/OperationExtensibilityReader.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/OperationExtensibilityReader.java
deleted file mode 100644
index b9c4452..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/OperationExtensibilityReader.java
+++ /dev/null
@@ -1,63 +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 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.HashMap;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-
-import org.eclipse.jem.util.RegistryReader;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
-
-
-public class OperationExtensibilityReader extends RegistryReader {
-	static final String ELEMENT_J2EEOPEXT = "extendableOperation"; //$NON-NLS-1$
-	static final String OPERATION_ATTRIBUTE = "class"; //$NON-NLS-1$
-	static final String OPERATION_ID = "id"; //$NON-NLS-1$
-	protected static HashMap extensibleOperations = null;
-
-	public OperationExtensibilityReader() {
-		super(WTPCommonPlugin.PLUGIN_ID, "ExtendableOperation"); //$NON-NLS-1$
-	}
-
-	/**
-	 * readElement() - parse and deal with an extension like: <extendableOperation class =
-	 * "com.ibm.etools.foo.Operation" id ' "" />
-	 */
-	public boolean readElement(IConfigurationElement element) {
-		if (!element.getName().equals(ELEMENT_J2EEOPEXT))
-			return false;
-		String op = element.getAttribute(OPERATION_ATTRIBUTE);
-		String id = element.getAttribute(OPERATION_ID);
-		addExtendableOperation(op, id);
-		return true;
-	}
-
-	/**
-	 * Sets the Extendable Operation
-	 * 
-	 * @param op
-	 * @param id
-	 */
-	private static void addExtendableOperation(String op, String id) {
-		if (extensibleOperations == null)
-			extensibleOperations = new HashMap();
-		extensibleOperations.put(op, id);
-	}
-
-	protected static HashMap getExtendableOperations() {
-		return extensibleOperations;
-	}
-}
\ No newline at end of file
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 3161e07..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/OperationExtension.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.frameworks.internal.operations;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
-
-public class OperationExtension {
-
-	String opID = null;
-
-	IConfigurationElement baseElement = null;
-
-	String preOperationClass = null;
-
-	WTPOperation preOperation = null;
-
-	String postOperationClass = null;
-
-	WTPOperation postOperation = null;
-
-	private 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().getDeclaringPluginDescriptor().getUniqueIdentifier();
-	}
-
-	public String getOpID() {
-		return opID;
-	}
-
-	public String getPostOperationClass() {
-		return postOperationClass;
-	}
-
-	public String getPreOperationClass() {
-		return preOperationClass;
-	}
-
-	public WTPOperation getPostOperation() throws CoreException {
-		if (postOperationClass == null)
-			return null;
-		WTPOperation op = (WTPOperation) baseElement.createExecutableExtension(OperationExtensionReader.ATT_POST_OP);
-		if (op != null)
-			op.setID(getExtensionId());
-		return op;
-	}
-
-	public WTPOperation getPreOperation() throws CoreException {
-		if (preOperationClass == null)
-			return null;
-		WTPOperation op = (WTPOperation) baseElement.createExecutableExtension(OperationExtensionReader.ATT_PRE_OP);
-		if (op != null)
-			op.setID(getExtensionId());
-		return op;
-	}
-
-	public IDataModelOperation getDMPostOperation() throws CoreException {
-		if (postOperationClass == null)
-			return null;
-		IDataModelOperation op = (IDataModelOperation) baseElement.createExecutableExtension(OperationExtensionReader.ATT_POST_OP);
-		if (op != null)
-			op.setID(getExtensionId());
-		return op;
-	}
-
-	public IDataModelOperation getDMPreOperation() throws CoreException {
-		if (preOperationClass == null)
-			return null;
-		IDataModelOperation op = (IDataModelOperation) baseElement.createExecutableExtension(OperationExtensionReader.ATT_PRE_OP);
-		if (op != null)
-			op.setID(getExtensionId());
-		return op;
-	}
-
-	/**
-	 * @return Returns the extensionId.
-	 */
-	public String getExtensionId() {
-		return extensionId;
-	}
-}
\ No newline at end of file
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 a6951df..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/OperationExtensionReader.java
+++ /dev/null
@@ -1,82 +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 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;
-
-	static final String ELEMENT_J2EEOPEXT = "operationExtension"; //$NON-NLS-1$
-	static final String ATT_ID = "id"; //$NON-NLS-1$ 
-	//static final String ATT_OP_TYPE = "operationType"; //$NON-NLS-1$
-	static final String ATT_PRE_OP = "preOperationClass"; //$NON-NLS-1$
-	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) {
-		if (opExtensions == null)
-			opExtensions = new HashMap();
-		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);
-		}
-	}
-
-	protected static HashMap getExtensionPoints() {
-		return opExtensions;
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/OperationExtensionRegistry.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/OperationExtensionRegistry.java
deleted file mode 100644
index afc64d2..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/OperationExtensionRegistry.java
+++ /dev/null
@@ -1,167 +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 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.frameworks.internal.operations;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-
-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 OperationExtensionRegistry {
-
-	protected static boolean canExtHasRead = false;
-
-	protected static boolean extPointHasRead = false;
-
-	protected static OperationExtensionRegistry instance = null;
-
-	protected static HashMap extensibleOperations = null;
-
-	protected static HashMap opExtensions = null;
-
-	protected static OperationExtensibilityReader opExtensibilityReader = null;
-
-	protected static OperationExtensionReader opExtensionReader = null;
-
-	public static String[] getRegisteredOperations(String className) {
-		extensibleOperations = getExtensibility();
-		if (extensibleOperations != null) {
-			String id = (String) extensibleOperations.get(className);
-			if (id == null)
-				return null;
-			if (opExtensions == null)
-				opExtensions = getExtensionPoints();
-			if (opExtensions != null) {
-				Collection ext = (Collection) opExtensions.get(id);
-				if (ext != null)
-					return getClassNames(ext.toArray());
-			}
-		}
-		return null;
-	}
-
-	private static String[] getClassNames(Object[] opExt) {
-		ArrayList classNames = new ArrayList();
-		OperationExtension currentExt = null;
-		for (int i = 0; i < opExt.length; i++) {
-			currentExt = (OperationExtension) opExt[i];
-			/* Only allow extensions which enabled (null project indicates enabled by activity only) */
-			if (EnablementManager.INSTANCE.getIdentifier(currentExt.getExtensionId(), null).isEnabled()) {
-				String className = currentExt.getPreOperationClass();
-				if (null != className) {
-					classNames.add(className);
-				}
-				className = currentExt.getPostOperationClass();
-				if (null != className) {
-					classNames.add(className);
-				}
-			}
-		}
-		String[] array = new String[classNames.size()];
-		classNames.toArray(array);
-		return array;
-	}
-
-	public static ComposedExtendedOperationHolder getExtensions(String className) {
-		extensibleOperations = getExtensibility();
-		if (extensibleOperations != null) {
-			String id = (String) extensibleOperations.get(className);
-			if (id == null)
-				return null;
-			if (opExtensions == null)
-				opExtensions = getExtensionPoints();
-			if (opExtensions != null) {
-				Collection ext = (Collection) opExtensions.get(id);
-				if (ext != null) {
-					try {
-						return calculateOperationHolder(ext);
-					} catch (CoreException ex) {
-						Logger.getLogger().logError(ex);
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	public static ComposedExtendedOperationHolder getExtensions(WTPOperation op) {
-		return getExtensions(op.getClass().getName());
-	}
-
-	protected String getExtendableOperationId(WTPOperation op) {
-		return (String) extensibleOperations.get(op.getClass().getName());
-	}
-
-	private static ComposedExtendedOperationHolder calculateOperationHolder(Collection ext) throws CoreException {
-		Object[] opExt = ext.toArray();
-		ComposedExtendedOperationHolder extOperationHolder = new ComposedExtendedOperationHolder();
-		WTPOperation preOp = null;
-		WTPOperation postOp = null;
-		OperationExtension currentExt = null;
-		for (int i = 0; i < opExt.length; i++) {
-			currentExt = (OperationExtension) opExt[i];
-			/* Only allow extensions which enabled (null project indicates enabled by activity only) */
-			if (EnablementManager.INSTANCE.getIdentifier(currentExt.getExtensionId(), null).isEnabled()) {
-				preOp = currentExt.getPreOperation();
-				if (preOp != null) {
-					extOperationHolder.addPreOperation(preOp);
-				}
-				postOp = currentExt.getPostOperation();
-				if (postOp != null) {
-					extOperationHolder.addPostOperation(postOp);
-				}
-			}
-		}
-		return extOperationHolder;
-	}
-
-	private static HashMap getExtensibility() {
-		if (!canExtHasRead) {
-			opExtensibilityReader = new OperationExtensibilityReader();
-			opExtensibilityReader.readRegistry();
-			canExtHasRead = true;
-		}
-		if (opExtensibilityReader == null)
-			return null;
-		return OperationExtensibilityReader.getExtendableOperations();
-	}
-
-	private static HashMap getExtensionPoints() {
-		if (!extPointHasRead) {
-			opExtensionReader = new OperationExtensionReader();
-			opExtensionReader.readRegistry();
-			extPointHasRead = true;
-		}
-		if (opExtensionReader == null)
-			return null;
-		return OperationExtensionReader.getExtensionPoints();
-	}
-
-	/**
-	 * Gets the instance.
-	 * 
-	 * @return Returns a EjbPageExtensionRegistry
-	 */
-	public static OperationExtensionRegistry getInstance() {
-		if (instance == null)
-			instance = new OperationExtensionRegistry();
-		return instance;
-	}
-
-}
\ No newline at end of file
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 3934d97..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, 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.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);
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ProjectCreationDataModel.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ProjectCreationDataModel.java
deleted file mode 100644
index c8e85f3..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ProjectCreationDataModel.java
+++ /dev/null
@@ -1,211 +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 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 org.eclipse.core.internal.localstore.CoreFileSystemLibrary;
-import org.eclipse.core.internal.resources.Project;
-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.internal.plugin.WTPCommonMessages;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
-
-/**
- * @deprecated
- * @see org.eclipse.wst.common.frameworks.internal.operations.IProjectCreationProperties
- */
-public class ProjectCreationDataModel extends WTPOperationDataModel {
-	/**
-	 * 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 = "ProjectCreationDataModel.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 = "ProjectCreationDataModel.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 = "ProjectCreationDataModel.PROJECT_NATURES"; //$NON-NLS-1$
-
-	public static ProjectCreationDataModel createProjectCreationDataModel(String projectName) {
-		ProjectCreationDataModel dataModel = new ProjectCreationDataModel();
-		dataModel.setProperty(PROJECT_NAME, projectName);
-		return dataModel;
-	}
-
-	public WTPOperation getDefaultOperation() {
-		return new ProjectCreationOperation(this);
-	}
-
-	protected void initValidBaseProperties() {
-		super.initValidBaseProperties();
-		addValidBaseProperty(PROJECT_NAME);
-		addValidBaseProperty(PROJECT_LOCATION);
-		addValidBaseProperty(PROJECT_NATURES);
-	}
-
-	protected Object getDefaultProperty(String propertyName) {
-		if (PROJECT_LOCATION.equals(propertyName)) {
-			return getDefaultLocation();
-		}
-		return super.getDefaultProperty(propertyName);
-	}
-
-	protected boolean doSetProperty(String propertyName, Object propertyValue) {
-		if (propertyValue != null && propertyName.equals(PROJECT_LOCATION)) {
-			IPath path = getRootLocation();
-			if (path.equals(new Path((String) propertyValue))) {
-				setProperty(propertyName, null);
-				return false;
-			}
-		}
-		boolean notify = super.doSetProperty(propertyName, propertyValue);
-		if (propertyName.equals(PROJECT_NAME) && !isSet(PROJECT_LOCATION)) {
-			notifyListeners(PROJECT_NAME);
-			notifyListeners(PROJECT_LOCATION);
-			return false;
-		}
-		return notify;
-	}
-
-	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();
-	}
-
-	public IProjectDescription getProjectDescription() {
-		String projectName = (String) getProperty(PROJECT_NAME);
-		IProjectDescription desc = ResourcesPlugin.getWorkspace().newProjectDescription(projectName);
-		if (isSet(PROJECT_LOCATION)) {
-			String projectLocation = (String) getProperty(ProjectCreationDataModel.PROJECT_LOCATION);
-			desc.setLocation(new Path(projectLocation));
-		}
-		return desc;
-	}
-
-	public IProject getProject() {
-		String projectName = (String) getProperty(PROJECT_NAME);
-		return (null != projectName && projectName.length() > 0) ? ResourcesPlugin.getWorkspace().getRoot().getProject(projectName) : null;
-	}
-
-	protected IStatus doValidateProperty(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 = (String) getProperty(PROJECT_LOCATION);
-			return validateExisting(projectName, projectLoc);
-		}
-		return super.doValidateProperty(propertyName);
-	}
-
-	/**
-	 * @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 (!CoreFileSystemLibrary.isCaseSensitive()) {
-			// now look for a matching case variant in the tree
-			IResource variant = ((Project) getProject()).findExistingResourceVariant(getProject().getFullPath());
-			if (variant != null) {
-				// TODO Fix this string
-				return WTPCommonPlugin.createErrorStatus("Resource already exists with a different case."/*
-																											 * Policy.bind("resources.existsDifferentCase",
-																											 * variant.getFullPath().toString())
-																											 */); //$NON-NLS-1$
-			}
-		}
-
-		return OK_STATUS;
-	}
-
-	private IStatus validateLocation() {
-		if (isSet(PROJECT_LOCATION) && isSet(PROJECT_NAME)) {
-			String loc = (String) getProperty(PROJECT_LOCATION);
-			IWorkspace workspace = ResourcesPlugin.getWorkspace();
-			IPath path = new Path(loc);
-			return workspace.validateProjectLocation(getProject(), path);
-		}
-		return OK_STATUS;
-	}
-}
\ No newline at end of file
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 9b83476..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ProjectCreationDataModelProvider.java
+++ /dev/null
@@ -1,178 +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 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 org.eclipse.core.internal.localstore.CoreFileSystemLibrary;
-import org.eclipse.core.internal.resources.Project;
-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.IDataModel;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonMessages;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
-
-public class ProjectCreationDataModelProvider extends AbstractDataModelProvider implements IProjectCreationProperties {
-
-	public IDataModelOperation getDefaultOperation() {
-		return new ProjectCreationOp(model);
-	}
-    public void init() {
-        super.init();
-        model.setProperty(PROJECT_LOCATION, getDefaultLocation());
-        model.setProperty(PROJECT_DESCRIPTION, getProjectDescription());    
-    }
-	public String[] getPropertyNames() {
-		return new String[]{PROJECT, PROJECT_NAME, PROJECT_LOCATION, PROJECT_NATURES, PROJECT_DESCRIPTION};
-	}
-
-	public Object getDefaultProperty(String propertyName) {
-		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))) {
-				setProperty(propertyName, null);
-				return false;
-			}
-		}
-		if (propertyName.equals(PROJECT_NAME) && !getDataModel().isPropertySet(PROJECT_LOCATION)) {
-			model.notifyPropertyChange(PROJECT_NAME, IDataModel.VALUE_CHG);
-			model.notifyPropertyChange(PROJECT_LOCATION, IDataModel.VALUE_CHG);
-            model.setProperty(PROJECT, getProject());
-			return false;
-		}
-		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(ProjectCreationDataModelProvider.PROJECT_LOCATION);
-			desc.setLocation(new Path(projectLocation));
-		}
-		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 (!CoreFileSystemLibrary.isCaseSensitive()) {
-			// now look for a matching case variant in the tree
-			IResource variant = ((Project) getProject()).findExistingResourceVariant(getProject().getFullPath());
-			if (variant != null) {
-				// TODO Fix this string
-				return WTPCommonPlugin.createErrorStatus("Resource already exists with a different case.");
-			}
-		}
-		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;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ProjectCreationOp.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ProjectCreationOp.java
deleted file mode 100644
index f91a5b8..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ProjectCreationOp.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 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.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-
-public class ProjectCreationOp extends AbstractDataModelOperation {
-
-	public ProjectCreationOp(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(IProjectCreationProperties.PROJECT_DESCRIPTION);
-			IProject project = (IProject) model.getProperty(IProjectCreationProperties.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(IProjectCreationProperties.PROJECT_NATURES);
-			if (null != natureIds) {
-				desc = project.getDescription();
-				desc.setNatureIds(natureIds);
-				project.setDescription(desc, monitor);
-			}
-		} catch (CoreException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		} finally {
-           monitor.done();
-		}
-		if (monitor.isCanceled())
-			throw new OperationCanceledException();
-		return OK_STATUS;
-	}
-
-	public boolean canUndo() {
-		return false;
-	}
-
-	public boolean canRedo() {
-		return false;
-	}
-
-	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;
-	}
-}
\ No newline at end of file
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 b132fb3..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ProjectCreationOperation.java
+++ /dev/null
@@ -1,64 +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 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.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.SubProgressMonitor;
-
-/**
- * @deprecated
- * @see org.eclipse.wst.common.frameworks.internal.operations.IProjectCreationProperties
- */
-public class ProjectCreationOperation extends WTPOperation {
-
-	public ProjectCreationOperation(ProjectCreationDataModel dataModel) {
-		super(dataModel);
-	}
-
-	protected void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException {
-		try {
-			ProjectCreationDataModel dataModel = (ProjectCreationDataModel) operationDataModel;
-
-			IProjectDescription desc = dataModel.getProjectDescription();
-			IProject project = dataModel.getProject();
-			if (!project.exists()) {
-				project.create(desc, new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN));
-			}
-
-			if (monitor.isCanceled())
-				throw new OperationCanceledException();
-			project.open(new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN));
-
-			String[] natureIds = (String[]) dataModel.getProperty(ProjectCreationDataModel.PROJECT_NATURES);
-			if (null != natureIds) {
-				desc = project.getDescription();
-				desc.setNatureIds(natureIds);
-				project.setDescription(desc, monitor);
-			}
-		} finally {
-			monitor.done();
-		}
-		if (monitor.isCanceled())
-			throw new OperationCanceledException();
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/WTPOperation.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/WTPOperation.java
deleted file mode 100644
index 36ede46..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/WTPOperation.java
+++ /dev/null
@@ -1,447 +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.operations;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.List;
-
-import org.eclipse.core.internal.runtime.Assert;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResourceStatus;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-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.enablement.nonui.WFTWrappedException;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
-
-//TODO perhaps this class should be subclassed from a new super class which more closely resembles org.eclipse.ui.actions.WorkspaceModifyOperation
-/**
- * An operation which potentially makes changes to the workspace. All resource modification should
- * be performed using this operation. The primary consequence of using this operation is that events
- * which typically occur as a result of workspace changes (such as the firing of resource deltas,
- * performance of autobuilds, etc.) are deferred until the outermost operation has successfully
- * completed.
- * <p>
- * Subclasses must implement <code>execute</code> to do the work of the operation.
- * </p>
- * This class is EXPERIMENTAL and is subject to substantial changes.
- */
-public abstract class WTPOperation implements IHeadlessRunnableWithProgress {
-
-	/**
-	 * The dataModel used to execute this operation
-	 */
-	protected WTPOperationDataModel operationDataModel;
-
-	private OperationStatus opStatus;
-
-	private String id;
-
-	/**
-	 * Constructor for the operation. Clients should use this constructor instead of the no argument
-	 * constructor.
-	 * 
-	 * @param operationDataModel
-	 */
-	public WTPOperation(WTPOperationDataModel operationDataModel) {
-		setOperationDataModel(operationDataModel);
-	}
-
-	/**
-	 * This no argument constructor should not be used by clients. This is for extended operations.
-	 * 
-	 * ExtendedOperations
-	 */
-	public WTPOperation() {
-	}
-
-	//TODO see if this can be made package visible only.
-	/**
-	 * Note: This method is for internal use only. Clients should not call this method.
-	 * 
-	 * ExtendedOperations
-	 * 
-	 * @param value
-	 *            the operation's id
-	 */
-	public final void setID(String value) {
-		Assert.isTrue(this.id == null, WTPResourceHandler.getString("22")); //$NON-NLS-1$
-		Assert.isNotNull(value, WTPResourceHandler.getString("23")); //$NON-NLS-1$
-		this.id = value;
-	}
-
-	//TODO see if this can be removed
-	/**
-	 * Note: This method is for internal use only. Clients should not call this method.
-	 * 
-	 * ExtendedOperations
-	 * 
-	 * @return the operation's id
-	 */
-	public final String getID() {
-		return this.id;
-	}
-
-	//TODO see if this can be make package visible only.
-	/**
-	 * Note: This method is for internal use only. Clients should not call this method.
-	 * 
-	 * @param operationDataModel
-	 */
-	public final void setOperationDataModel(WTPOperationDataModel operationDataModel) {
-		this.operationDataModel = operationDataModel;
-	}
-
-	/**
-	 * Returns the dataModels used by this operation.
-	 * 
-	 * @return the dataModels used by this operation.
-	 */
-	public final WTPOperationDataModel getOperationDataModel() {
-		return operationDataModel;
-	}
-
-	/**
-	 * Returns the result status of this operation. If this operation net been executed, then it
-	 * will return null.
-	 * 
-	 * @return he result status of this operation.
-	 */
-	public IStatus getStatus() {
-		if (null == opStatus)
-			return WTPCommonPlugin.OK_STATUS;
-		return opStatus;
-	}
-
-	/**
-	 * Performs the steps that are to be treated as a single logical workspace change.
-	 * <p>
-	 * Subclasses must implement this method.
-	 * </p>
-	 * 
-	 * @param monitor
-	 *            the progress monitor to use to display progress and field user requests to cancel
-	 * @exception CoreException
-	 *                if the operation fails due to a CoreException
-	 * @exception InvocationTargetException
-	 *                if the operation fails due to an exception other than CoreException
-	 * @exception InterruptedException
-	 *                if the operation detects a request to cancel, using
-	 *                <code>IProgressMonitor.isCanceled()</code>, it should exit by throwing
-	 *                <code>InterruptedException</code>
-	 */
-	protected abstract void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException;
-
-	/**
-	 * Subclasses should override as necessary to perform any additional initialization before
-	 * executing.
-	 * 
-	 * @param monitor
-	 *            the progress monitor
-	 */
-	protected void initilize(IProgressMonitor monitor) {
-		//Making sure the status objects are initialized
-		//		status = null;
-		opStatus = null;
-	}
-
-	private ComposedExtendedOperationHolder initializeExtensionOperations() {
-		return OperationExtensionRegistry.getExtensions(this);
-	}
-
-	/**
-	 * <p>
-	 * Subclasses should override as necessary to perform any post executiong cleanup. Subclasses,
-	 * should not initialize any resources anywhere other than within either the
-	 * initialize(IProjgressMonitor) or the execute(IProgressMonitor) methods. This method will
-	 * always be called when an operation is run irregardless of whether the execution is
-	 * successful.
-	 * </p>
-	 * <p>
-	 * Clients should never need to call this method
-	 * </p>
-	 * 
-	 * @param monitor
-	 *            the progress monitor
-	 */
-	protected void dispose(IProgressMonitor monitor) {
-	}
-
-	//TODO see if this can be removed
-	/**
-	 * Note: This method is for internal use only. Clients should not call this method.
-	 * 
-	 * @return the workspace
-	 */
-	protected IWorkspace getWorkspace() {
-		return ResourcesPlugin.getWorkspace();
-	}
-
-	//TODO see if this can be removed
-	/**
-	 * Note: This method is for internal use only. Clients should not call this method.
-	 * 
-	 * @param op
-	 *            the to append
-	 * @return A new operation
-	 */
-	public WTPOperation append(WTPOperation op) {
-		ComposedOperation composedOp = new ComposedOperation();
-		composedOp.addRunnable(this);
-		composedOp.addRunnable(op);
-		return composedOp;
-	}
-
-	/**
-	 * Initiates a batch of changes, by invoking the execute() method as a workspace runnable.
-	 * Client should always call this method and never call the execute() method.
-	 * 
-	 * @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 synchronized final void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-		final InvocationTargetException[] iteHolder = new InvocationTargetException[1];
-		try {
-
-			IWorkspaceRunnable workspaceRunnable = new IWorkspaceRunnable() {
-
-				public void run(IProgressMonitor pm) throws CoreException {
-					try {
-						doRun(pm);
-						if (opStatus != null && !opStatus.isOK()) {
-							//TODO do something with the status
-							System.out.println(opStatus.getMessage());
-						}
-					} catch (InvocationTargetException e) {
-						// Pass it outside the workspace runnable
-						iteHolder[0] = e;
-					} catch (InterruptedException e) {
-						// Re-throw as OperationCanceledException, which will
-						// be
-						// caught and re-thrown as InterruptedException below.
-						throw new OperationCanceledException(e.getMessage());
-					}
-				}
-			};
-			ISchedulingRule rule = getSchedulingRule();
-			if (rule == null)
-				ResourcesPlugin.getWorkspace().run(workspaceRunnable, monitor);
-			else
-				ResourcesPlugin.getWorkspace().run(workspaceRunnable, rule, 0, monitor);
-		} catch (CoreException e) {
-			if (e.getStatus().getCode() == IResourceStatus.OPERATION_FAILED)
-				throw new WFTWrappedException(e.getStatus().getException(), e.getMessage());
-			throw new WFTWrappedException(e);
-		} catch (OperationCanceledException e) {
-			throw new InterruptedException(e.getMessage());
-		}
-		// Re-throw the InvocationTargetException, if any occurred
-		if (iteHolder[0] != null) {
-			throw new WFTWrappedException(iteHolder[0].getTargetException(), iteHolder[0].getMessage());
-		}
-	}
-
-	/**
-	 * @return
-	 */
-	protected ISchedulingRule getSchedulingRule() {
-		return null;
-	}
-
-	/**
-	 * Typically clients should call the run(IProgressMonitor) method instead of this method. This
-	 * may be used by subclassed operations during execution to invoke other operations. This method
-	 * runs within the same the same WorkspaceRunnable as the calling operation.
-	 * 
-	 * @param monitor
-	 *            the progress monitor to use to display progress
-	 * @throws CoreException
-	 * @throws InvocationTargetException
-	 * @throws InterruptedException
-	 */
-	public final void doRun(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException {
-		boolean alreadyLocked = operationDataModel == null ? true : operationDataModel.isLocked();
-		boolean operationValidationEnabled = operationDataModel == null ? false : operationDataModel.isOperationValidationEnabled();
-		try {
-			if (!alreadyLocked) {
-				operationDataModel.setLocked(true);
-			}
-			if (operationValidationEnabled) {
-				operationDataModel.setOperationValidationEnabled(false);
-				IStatus status = operationDataModel.validateDataModel();
-				if (!status.isOK()) {
-					//TODO display something to user and remove System.out
-					System.out.println(WTPResourceHandler.getString("24", new Object[]{status.getMessage()})); //$NON-NLS-1$
-					Thread.dumpStack();
-					return;
-				}
-			}
-			initilize(monitor);
-
-			if (!validateEdit())
-				return;
-			//if (getStatus().isOK()) {
-			ComposedExtendedOperationHolder extOpHolder = initializeExtensionOperations();
-			IStatus preOpStatus = runPreOps(monitor, extOpHolder);
-			execute(monitor);
-			IStatus postOpStatus = runPostOps(monitor, extOpHolder);
-			if (null != preOpStatus)
-				addExtendedStatus(preOpStatus);
-			if (null != postOpStatus)
-				addExtendedStatus(postOpStatus);
-			//}
-		} finally {
-			dispose(monitor);
-
-			if (!alreadyLocked) {
-				operationDataModel.setLocked(false);
-			}
-			if (operationValidationEnabled) {
-				operationDataModel.setOperationValidationEnabled(true);
-			}
-
-		}
-		// CoreException and OperationCanceledException are propagated
-	}
-
-	/**
-	 * This method is called when an operation is run after initialize() is called, but before
-	 * execute(). If this method returns <code>true</code> then operation's execution continues,
-	 * otherwise, execution is aborted. Subclasses should override this method to provide any final
-	 * initialization and validation required before execution.
-	 * 
-	 * @return
-	 */
-	protected boolean validateEdit() {
-		return true;
-	}
-
-	//TODO lock down addStatus so it throws runtime exceptions if not called during execute.
-	//TODO make this protected and create a package level accessor for WTPOperationJobAdapter
-	/**
-	 * <p>
-	 * Adds a status to this opererations status. If this operation currently has no status, then
-	 * the specified status becomes the operation's status. If the operation already has a status,
-	 * then that status is converted to a multistatus and the specified status is appendend to it.
-	 * </p>
-	 * <p>
-	 * This method should only be called from the execute() method of subclasses.
-	 * </p>
-	 * 
-	 * @param aStatus
-	 *            the status to add.
-	 */
-	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);
-		}
-	}
-
-	/**
-	 * This is to keep track of extended operation stati. If the main status is WARNING, an extended
-	 * status of ERROR will not make the main status ERROR. If the main status is OK, an extended
-	 * status of ERROR or WARNING will make the main status WARNING.
-	 * 
-	 * @param aStatus
-	 */
-	private void addExtendedStatus(IStatus aStatus) {
-		if (opStatus == null) {
-			opStatus = new OperationStatus(new IStatus[]{WTPCommonPlugin.OK_STATUS});
-		}
-		opStatus.addExtendedStatus(aStatus);
-	}
-
-	private IStatus runPostOps(IProgressMonitor pm, ComposedExtendedOperationHolder extOpHolder) {
-		IStatus postOpStatus = null;
-		if ((extOpHolder != null) && extOpHolder.hasPostOps()) {
-			postOpStatus = runExtendedOps(extOpHolder.getPostOps(), pm);
-		}
-
-		return postOpStatus;
-	}
-
-	private IStatus runPreOps(IProgressMonitor pm, ComposedExtendedOperationHolder extOpHolder) {
-		IStatus preOpStatus = null;
-		if ((extOpHolder != null) && extOpHolder.hasPreOps()) {
-			preOpStatus = runExtendedOps(extOpHolder.getPreOps(), pm);
-		}
-		return preOpStatus;
-	}
-
-	private IStatus runExtendedOps(List opList, IProgressMonitor pm) {
-		WTPOperation op = null;
-		OperationStatus returnStatus = null;
-		IStatus localStatus;
-		String opId = null;
-		for (int i = 0; i < opList.size(); i++) {
-			op = (WTPOperation) opList.get(i);
-			try {
-				opId = op.getID();
-				boolean shouldExtendedRun = true;
-				List extendedContext = (List) operationDataModel.getProperty(WTPOperationDataModel.EXTENDED_CONTEXT);
-				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) {
-					op.setOperationDataModel(operationDataModel);
-					op.doRun(new SubProgressMonitor(pm, IProgressMonitor.UNKNOWN));
-					localStatus = op.getStatus();
-				} else
-					localStatus = null;
-			} catch (Exception e) {
-				localStatus = new Status(IStatus.ERROR, WTPCommonPlugin.PLUGIN_ID, 0, WTPResourceHandler.getString("25", new Object[]{op.getClass().getName()}), e); //$NON-NLS-1$
-			}
-			if (localStatus != null) {
-				if (returnStatus == null) {
-					returnStatus = new OperationStatus(new IStatus[]{localStatus});
-				} else {
-					returnStatus.add(localStatus);
-				}
-			}
-		}
-		return returnStatus;
-	}
-
-	//	protected WTPOperation getRootExtendedOperation() {
-	//		if (this.getRootExtendedOperation() == null)
-	//			return this;
-	//		return this.getRootExtendedOperation();
-	//	}
-
-	//TODO this should be deleted.
-	/**
-	 * Note: This method is for internal use only. Clients should not call this method.
-	 */
-	protected static final void runNestedDefaultOperation(WTPOperationDataModel model, IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-		WTPOperation op = model.getDefaultOperation();
-		if (op != null)
-			op.run(monitor);
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/WTPOperationDataModel.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/WTPOperationDataModel.java
deleted file mode 100644
index 2bc8740..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/WTPOperationDataModel.java
+++ /dev/null
@@ -1,1125 +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.operations;
-
-import java.util.ArrayList;
-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.resources.IProject;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.wst.common.frameworks.internal.WTPResourceHandler;
-
-/**
- * WTPOperationDataModel is an essential piece of both the WTP Operation and WTP Wizard frameworks.
- * WTPOPerationDataModels (DataModels) act as smart property containers used to pass various
- * properties between components. DataModels are smart property containers because they can:
- * <UL>
- * <LI>Compute default values for their properties thus saving clients from needing to populate (or
- * understand) all available properties.</LI>
- * <LI>Modify the computed default values when necessary (e.g. if the default value of property A
- * is based on property B, then A should change when B changes).</LI>
- * <LI>Notify listeners when properties change.</LI>
- * <LI>Check the validity of the of the proptery values (e.g. if a property is supposed to be an
- * Integer < 10)</LI>
- * <LI>Check the validity of the entire property set (e.g if property A is supposed to be an Iteger
- * which is a multiple of the Integer property B).</LI>
- * <LI>Supply an operation to execute.</LI>
- * <LI>Compose and decompose entire DataModels through nesting.</LI>
- * </UL>
- * 
- * <B>PropertyNames </B> Clients interact with DataModels by getting and setting properties
- * (Objects) with PropertyNames. A PropertyName is a String Object uniquely identifing a particular
- * property. The recommended practice for defining PropertyNames is to define them as static final
- * Class level Strings and to use the DataModel instance class name appended with the property name
- * as the value (this should ensure uniqueness and gives a readible value when debugging).
- * 
- * <A NAME="nestedDataModels"> <!-- --> </A>
- * <p>
- * <B>Nested DataModels </B>
- * <p>
- * 
- * 
- * The WTP Wizard framework uses DataModels to hold all the properties displayed to the user through
- * UI controls (e.g. textboxes, comboboxes, etc.). The Wizard framework also relies on DataModels
- * for validation, default values, and the operation executed on finish.
- * 
- * The WTO Operation framework uses DataModels to pass all parameters for execution. The DataModel
- * validation is used to ensure all the properties are valid prior to operation execution.
- * 
- * This class is EXPERIMENTAL and is subject to substantial changes.
- * 
- * @link org.eclipse.wst.common.frameworks.ui.WTPWizard for details on the WTP Wizard framework.
- * @link org.eclipse.wst.common.frameworks.operations.WTPOperation for details on the WTP Operation
- *       framework.
- */
-public abstract class WTPOperationDataModel implements WTPOperationDataModelListener {
-
-	/**
-	 * This property is used by the extended operation framework. Extended operations run within a
-	 * context; e.g. they run within the scope of a project, resource, file, etc. The default value
-	 * for this property is an empty List. Subclasses should configure themselves to return a list
-	 * Objects. Each Object represents a Context which should be adaptable to IProject.
-	 */
-	protected static final String EXTENDED_CONTEXT = "WTPOperationDataModel.EXTENDED_CONTEXT"; //$NON-NLS-1$
-
-	/**
-	 * An unsettable property used soley to trip validation for nested models. Clients only use this
-	 * property for validation purposes and never get or set its value. Subclasses can override
-	 * nested model validation by checking for this property in the doValidate method and not
-	 * calling super with it.
-	 */
-	public static final String NESTED_MODEL_VALIDATION_HOOK = "WTPOperationDataModel.NESTED_MODEL_VALIDATION_HOOK"; //$NON-NLS-1$
-	/**
-	 * Optional, type boolean This boolean was added for users who wish to delay the operation from
-	 * being run on a "finish". The operation will be cached in the CACHED_DELAYED_OPERATION which
-	 * then leaves the user responsible for running this operation when they see fit.
-	 */
-	public static final String RUN_OPERATION = "WTPOperationDataModel.RUN_OPERATION"; //$NON-NLS-1$
-	/**
-	 * Internal, type WTPOperation
-	 */
-	public static final String CACHED_DELAYED_OPERATION = "WTPOperationDataModel.CACHED_DELAYED_OPERATION"; //$NON-NLS-1$
-	/**
-	 * Optional Operation handler to allow user to prompt on save defaults to NullOperationHandler()
-	 * set to UIOperationHanlder() to add prompt
-	 */
-	public static final String UI_OPERATION_HANLDER = "WTPOperationDataModel.UI_OPERATION_HANLDER"; //$NON-NLS-1$
-
-	/**
-	 * This is a convenience static status for subclasses to return during validation when the
-	 * validation is OK.
-	 */
-	protected static IStatus OK_STATUS = new Status(IStatus.OK, "org.eclipse.wst.common.frameworks.internal", 0, "OK", null); //$NON-NLS-1$ //$NON-NLS-2$
-
-	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 String NESTED_MODEL_DUPLICATE = WTPResourceHandler.getString("33"); //$NON-NLS-1$
-
-	private Set validProperties = new HashSet();
-	private Set validBaseProperties = new HashSet();
-	private Map propertyValues = new Hashtable();
-	private Map nestedModels;
-	private Set nestingModels;
-	private List listeners;
-	private boolean ignorePropertyChanges = false;
-	private boolean notificationEnabled = true;
-	private boolean locked = false;
-	private boolean operationValidationEnabled = false;
-	private boolean hasBeenExecutedAgainst = false;
-	private boolean suspendValidation = false;
-
-	/**
-	 * <p>
-	 * The WTPOperationDataModel constructor. This constructor will first add the base
-	 * WTPOPerationDataModel properties (RUN_OPERATION, CACHED_DELAYED_OPERATION, and
-	 * UI_OPERATION_HANLDER). It then invokes the following:
-	 * </p>
-	 * <ol>
-	 * <li><b><code>initValidBaseProperties()</code> </b> subclasses should override this method
-	 * to add their properties using <code>addValidBaseProperty(String)</code>.</li>
-	 * <li><b><code>initNestedModels()</code> </b> subclasses should override this method to add
-	 * their nested models using <code>addNestedModel(String, WTPOperationDataModel)</code>.
-	 * </li>
-	 * <li><b><code>init()</code> </b> subclasses should override this method to perform any
-	 * final initialization.</li>
-	 * </ol>
-	 * 
-	 * @see #initValidBaseProperties()
-	 * @see #initNestedModels()
-	 * @see #init()
-	 */
-	public WTPOperationDataModel() {
-		init_internal();
-	}
-
-	private final void init_internal() {
-		addValidBaseProperty(EXTENDED_CONTEXT);
-		addValidBaseProperty(RUN_OPERATION);
-		addValidBaseProperty(CACHED_DELAYED_OPERATION);
-		addValidBaseProperty(UI_OPERATION_HANLDER);
-		initValidBaseProperties();
-		initNestedModels();
-		init();
-	}
-
-	/**
-	 * Subclasses should use this method within <code>initValidBaseProperties()</code> to add
-	 * properties.
-	 * 
-	 * @param propertyName
-	 *            The property name to be added.
-	 * @see #initValidBaseProperties()
-	 */
-	protected final void addValidBaseProperty(String propertyName) {
-		validBaseProperties.add(propertyName);
-		validProperties.add(propertyName);
-	}
-
-	/**
-	 * Subclasses should override this method to add properties using
-	 * <code>addValidBaseProperty(String)</code>.
-	 * 
-	 * @see #addValidBaseProperty(String)
-	 * @see #WTPOperationDataModel()
-	 */
-	protected void initValidBaseProperties() {
-	}
-
-	/**
-	 * Subclasses should override this method to add nested DataModels using
-	 * <code>addNestedModel(String, WTPOperationDataModel)</code>.
-	 * 
-	 * @see #addNestedModel(String, WTPOperationDataModel)
-	 * @see #WTPOperationDataModel()
-	 */
-	protected void initNestedModels() {
-	}
-
-	/**
-	 * Subclasses should override this method to perform any final initialization not covered by
-	 * either <code>initValidBaseProperties()</code> or <code>initNestedModels()</code>.
-	 * 
-	 * @see #initValidBaseProperties()
-	 * @see #initNestedModels()
-	 * @see #WTPOperationDataModel()
-	 */
-	protected void init() {
-	}
-
-	/**
-	 * <p>
-	 * This method is used to nest the specified WTPOperationDataModel within this
-	 * WTPOperationDataModel. The <code>modelName</code> argument should be a unique String to
-	 * identify this particular nested DataModel. The same String is required when accessing the
-	 * nested DataModel using either <code>getNestedModel(String)</code> or
-	 * <code>removeNestedModel(String)</code>. If this is the first nested DataModel being added,
-	 * then the <code>NESTED_MODEL_VALIDATION_HOOK</code> will be added to this DataModel .
-	 * </p>
-	 * <p>
-	 * Refer to <A HREF="#nestedDataModels"> <CODE>NestedDataModels</CODE> </A>.
-	 * </p>
-	 * 
-	 * @param modelName
-	 *            the name of the WTPOperationDataModel to be nested
-	 * @param dataModel
-	 *            the WTPOperationDataModel to be nested
-	 * 
-	 * @see #getNestedModel(String)
-	 * @see #removeNestedModel(String)
-	 */
-	public final void addNestedModel(String modelName, WTPOperationDataModel dataModel) {
-		if (dataModel == null)
-			return;
-		if (null == nestedModels) {
-			validBaseProperties.add(NESTED_MODEL_VALIDATION_HOOK);
-			validProperties.add(NESTED_MODEL_VALIDATION_HOOK);
-			nestedModels = new Hashtable();
-		}
-		if (null == dataModel.nestingModels) {
-			dataModel.nestingModels = new HashSet();
-		}
-		if (dataModel.nestingModels.contains(this)) {
-			throw new RuntimeException(NESTED_MODEL_DUPLICATE);
-		}
-		dataModel.nestingModels.add(this);
-
-		nestedModels.put(modelName, dataModel);
-
-		addNestedProperties(dataModel.validProperties);
-		dataModel.addListener(this);
-	}
-
-	private void addNestedProperties(Set nestedProperties) {
-		boolean propertiesAdded = validProperties.addAll(nestedProperties);
-		// Pass the new properties up the nesting chain
-		if (propertiesAdded && nestingModels != null) {
-			Iterator iterator = nestingModels.iterator();
-			while (iterator.hasNext()) {
-				((WTPOperationDataModel) iterator.next()).addNestedProperties(nestedProperties);
-			}
-		}
-	}
-
-	public Iterator getNestedModels() {
-		return nestedModels.values().iterator();
-	}
-
-	public Iterator getNestingModels() {
-		return nestingModels.iterator();
-	}
-
-	/**
-	 * Subclasses should override to return a WTPOperation to execute using this DataModel instance.
-	 * The goal is for clients of to be able to simple create an instance of a particular DataModel,
-	 * set a few properties on it, and then execute the operation returned by getDefaultOperation()
-	 * 
-	 * @return an initialized and executable WTPOperation
-	 */
-	public abstract WTPOperation getDefaultOperation();
-
-	public WTPOperationDataModel removeNestedModel(String modelName) {
-		if (modelName == null || nestedModels == null)
-			return null;
-		WTPOperationDataModel model = (WTPOperationDataModel) nestedModels.remove(modelName);
-		model.nestingModels.remove(this);
-		removeNestedProperties(model.validProperties);
-		model.removeListener(this);
-		if (nestedModels.isEmpty()) {
-			nestedModels = null;
-			validBaseProperties.remove(NESTED_MODEL_VALIDATION_HOOK);
-			validProperties.remove(NESTED_MODEL_VALIDATION_HOOK);
-		}
-		return model;
-	}
-
-	private void removeNestedProperties(Set nestedProperties) {
-		Iterator iterator = nestedProperties.iterator();
-		String property = null;
-		boolean keepProperty = false;
-		Set nestedPropertiesToRemove = null;
-		while (iterator.hasNext()) {
-			keepProperty = false;
-			property = (String) iterator.next();
-			if (validBaseProperties.contains(property)) {
-				keepProperty = true;
-			}
-			if (!keepProperty && nestedModels != null) {
-				Iterator nestedModelsIterator = nestedModels.values().iterator();
-				while (!keepProperty && nestedModelsIterator.hasNext()) {
-					WTPOperationDataModel nestedModel = (WTPOperationDataModel) nestedModelsIterator.next();
-					if (nestedModel.isProperty(property)) {
-						keepProperty = true;
-					}
-				}
-			}
-			if (!keepProperty) {
-				if (null == nestedPropertiesToRemove) {
-					nestedPropertiesToRemove = new HashSet();
-				}
-				nestedPropertiesToRemove.add(property);
-			}
-		}
-
-		if (null != nestedPropertiesToRemove) {
-			validProperties.removeAll(nestedPropertiesToRemove);
-			if (nestingModels != null) {
-				Iterator nestingModelsIterator = nestingModels.iterator();
-				while (nestingModelsIterator.hasNext()) {
-					((WTPOperationDataModel) nestingModelsIterator.next()).removeNestedProperties(nestedPropertiesToRemove);
-				}
-			}
-		}
-	}
-
-
-	public final WTPOperationDataModel getNestedModel(String modelName) {
-		WTPOperationDataModel dataModel = (WTPOperationDataModel) nestedModels.get(modelName);
-		if (null == dataModel) {
-			throw new RuntimeException(NESTED_MODEL_NOT_LOCATED + modelName);
-		}
-		return dataModel;
-	}
-
-	/**
-	 * Subclasses can override this method to determine if a given propertyName should be enabled
-	 * for edit. Returning null indicates that there is no precedence on the enablement. Note that
-	 * you can override this in an outer model since enablement may be different in the outer model.
-	 * 
-	 * @param propertyName
-	 * @return the property's enablment state, null indicates there is no state
-	 */
-	public final Boolean isEnabled(String propertyName) {
-		checkValidPropertyName(propertyName);
-		return basicIsEnabled(propertyName);
-	}
-
-	/**
-	 * Subclasses can override this method to determine if a given propertyName should be enabled
-	 * for edit. Returning null indicates that there is no precedence on the enablement. Note that
-	 * you can override this in an outer model since enablement may be different in the outer model.
-	 * 
-	 * @param propertyName
-	 * @return
-	 */
-	protected Boolean basicIsEnabled(String propertyName) {
-		if (isBaseProperty(propertyName)) {
-			return null;
-		} else if (nestedModels != null) {
-			WTPOperationDataModel dataModel = null;
-			Object[] keys = nestedModels.keySet().toArray();
-			for (int i = 0; i < keys.length; i++) {
-				dataModel = (WTPOperationDataModel) nestedModels.get(keys[i]);
-				if (dataModel.isProperty(propertyName)) {
-					return dataModel.isEnabled(propertyName);
-				}
-			}
-		}
-		throw new RuntimeException(PROPERTY_NOT_LOCATED_ + propertyName);
-	}
-
-	/**
-	 * <p>
-	 * Returns a WTPPropertyDescriptor array consisting of all valid WTPPropertyDescriptors for the
-	 * specified property. Each WTPPropertyDescriptor {@see WTPPropertyDescriptor for details}
-	 * 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 DataModel. 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, the 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
-	 * WTPPropertyDescriptor array where the value, description pairs would be {(1, small), (2,
-	 * medium), (3, large)}.
-	 * </p>
-	 * <p>
-	 * Subclasses should override {@see #doGetValidPropertyDescriptors(String)}as necessary.
-	 * </p>
-	 * 
-	 * @param propertyName
-	 * @return the array of valid WTPPropertyDescriptors
-	 * @see #getPropertyDescriptor(String)
-	 * @see #doGetValidPropertyDescriptors(String)
-	 */
-	public final WTPPropertyDescriptor[] getValidPropertyDescriptors(String propertyName) {
-		checkValidPropertyName(propertyName);
-		if (isBaseProperty(propertyName)) {
-			return doGetValidPropertyDescriptors(propertyName);
-		} else if (nestedModels != null) {
-			WTPOperationDataModel dataModel = null;
-			Object[] keys = nestedModels.keySet().toArray();
-			for (int i = 0; i < keys.length; i++) {
-				dataModel = (WTPOperationDataModel) nestedModels.get(keys[i]);
-				if (dataModel.isProperty(propertyName)) {
-					return dataModel.getValidPropertyDescriptors(propertyName);
-				}
-			}
-		}
-		throw new RuntimeException(PROPERTY_NOT_LOCATED_ + propertyName);
-	}
-
-	/**
-	 * Subclasses should override this method to return their set of valid WTPPropertyDescriptors.
-	 * This default implementation returns: <code>new WTPPropertyDescriptor[0];</code>
-	 * 
-	 * @param propertyName
-	 * @return
-	 * 
-	 * @see #getValidPropertyDescriptors(String)
-	 */
-	protected WTPPropertyDescriptor[] doGetValidPropertyDescriptors(String propertyName) {
-		return new WTPPropertyDescriptor[0];
-	}
-
-	/**
-	 * <p>
-	 * Returns a WTPPropertyDescriptor for the specified property. The
-	 * <code>getPropertyValue()</code> method on the returned WTPPropertyDescriptor will be the
-	 * same value as returned by <code>getPropertyValue(propertyName)</code>.
-	 * </p>
-	 * <p>
-	 * Following the example introduced in {@see #getValidPropertyDescriptors(String)}, suppose the
-	 * <code>SHIRT_SIZE</code> property is currently set to 1. A call to this method would return
-	 * a WTPPropertyDescriptor 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 {@see #getValidPropertyDescriptors(String)}this method will always return a valid
-	 * WTPPropertyDescriptor.
-	 * </p>
-	 * <p>
-	 * Subclasses should should override {@see #doGetPropertyDescriptor(String)}as necessary.
-	 * </p>
-	 * 
-	 * @param propertyName
-	 * @return the WTPPropertyDescriptor for the specified property
-	 * 
-	 * @see #doGetValidPropertyDescriptors(String)
-	 * @see #doGetPropertyDescriptor(String)
-	 */
-	public final WTPPropertyDescriptor getPropertyDescriptor(String propertyName) {
-		checkValidPropertyName(propertyName);
-		if (isBaseProperty(propertyName)) {
-			return doGetPropertyDescriptor(propertyName);
-		} else if (nestedModels != null) {
-			WTPOperationDataModel dataModel = null;
-			Object[] keys = nestedModels.keySet().toArray();
-			for (int i = 0; i < keys.length; i++) {
-				dataModel = (WTPOperationDataModel) nestedModels.get(keys[i]);
-				if (dataModel.isProperty(propertyName)) {
-					return dataModel.doGetPropertyDescriptor(propertyName);
-				}
-			}
-		}
-		throw new RuntimeException(PROPERTY_NOT_LOCATED_ + propertyName);
-	}
-
-	/**
-	 * Subclasses should override this method as necessary. This default implementation returns
-	 * <code>new WTPPropertyDescriptor(getProperty(propertyName));</code>.
-	 * 
-	 * @param propertyName
-	 * @return
-	 */
-	protected WTPPropertyDescriptor doGetPropertyDescriptor(String propertyName) {
-		return new WTPPropertyDescriptor(getProperty(propertyName));
-	}
-
-	/**
-	 * <p>
-	 * A convenience method for getting Strings. If the property is set then this method is
-	 * equavalent to:
-	 * <p>
-	 * <code>(String)getProperty(propertyName)</code>
-	 * <p>
-	 * If the property is unset, the empty String, <code>""</code>, will be returned.
-	 * 
-	 * @param propertyName
-	 * @param value
-	 * @see #setProperty(String, Object)
-	 */
-	public final String getStringProperty(String propertyName) {
-		Object prop = getProperty(propertyName);
-		if (prop == null)
-			return ""; //$NON-NLS-1$
-		return (String) prop;
-	}
-
-	/**
-	 * <p>
-	 * A convenience method for getting booleans. If the property is set then this method is
-	 * equavalent to:
-	 * <p>
-	 * <code>((Boolean)getProperty(propertyName)).booleanValue();</code>
-	 * <p>
-	 * If the property is unset, <code>false</code> will be returned.
-	 * 
-	 * @param propertyName
-	 *            the property name
-	 * @return the boolean value of the property
-	 * @see #setProperty(String, Object)
-	 * @see #setBooleanProperty(String, int)
-	 */
-	public final boolean getBooleanProperty(String propertyName) {
-		Object prop = getProperty(propertyName);
-		if (prop == null)
-			return false;
-		return ((Boolean) prop).booleanValue();
-	}
-
-	/**
-	 * <p>
-	 * A convenience method for getting ints. If the property is set then this method is equavalent
-	 * to:
-	 * <p>
-	 * <code>((Integer)getProperty(propertyName)).intValue();</code>
-	 * <p>
-	 * If the property is unset, <code>-1</code> will be returned.
-	 * 
-	 * @param propertyName
-	 *            the property name
-	 * @return the int value of the property
-	 * @see #setProperty(String, Object)
-	 * @see #setIntProperty(String, int)
-	 */
-	public final int getIntProperty(String propertyName) {
-		Object prop = getProperty(propertyName);
-		if (prop == null)
-			return -1;
-		return ((Integer) prop).intValue();
-	}
-
-	/**
-	 * <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 value
-	 *            the <code>boolean</code> value of the property
-	 * @see #setProperty(String, Object)
-	 * @see #getBooleanProperty(String)
-	 */
-	public final void setBooleanProperty(String propertyName, boolean value) {
-		setProperty(propertyName, (value) ? Boolean.TRUE : Boolean.FALSE);
-	}
-
-	/**
-	 * <p>
-	 * A convenience method for setting ints. This method is equavalent to:
-	 * <p>
-	 * <code>setProperty(propertyName, new Integer(value));</code>
-	 * </p>
-	 * 
-	 * @param propertyName
-	 *            the name of the property
-	 * @param value
-	 *            the <code>int</code> value of the property
-	 * @see #setProperty(String, Object)
-	 * @see #getIntProperty(String)
-	 */
-	public void setIntProperty(String propertyName, int value) {
-		setProperty(propertyName, new Integer(value));
-	}
-
-	/**
-	 * Override this method to compute default property values.
-	 * 
-	 * @param propertyName
-	 * @return
-	 */
-	protected Object getDefaultProperty(String propertyName) {
-		if (propertyName.equals(EXTENDED_CONTEXT)) {
-			Object targetProject = getTargetProject(); // TODO delete this block with
-			// getTargetProject()
-			if (null == targetProject) {
-				return Collections.EMPTY_LIST;
-			} else {
-				List list = new ArrayList();
-				list.add(targetProject);
-				return list;
-			}
-		}
-		if (propertyName.equals(RUN_OPERATION)) {
-			return Boolean.TRUE;
-		}
-		if (propertyName.equals(UI_OPERATION_HANLDER)) {
-			return new NullOperationHandler();
-		}
-		return null;
-	}
-
-	/**
-	 * Returns <code>true</code> if the specified propertyName is a valid propertyName for this
-	 * root DataModel only. Nested DataModels are not checked.
-	 * 
-	 * @param propertyName
-	 * @return
-	 * @see #isProperty(String)
-	 */
-	public final boolean isBaseProperty(String propertyName) {
-		if (validBaseProperties != null)
-			return validBaseProperties.contains(propertyName);
-		return true;
-	}
-
-	/**
-	 * Returns <code>true</code> if the specified propertyName is a valid propertyName for this
-	 * DataModel or any of its (recursively) nested DataModels.
-	 * 
-	 * @param propertyName
-	 * @return
-	 * @see #isBaseProperty(String)
-	 */
-	public final boolean isProperty(String propertyName) {
-		return validProperties.contains(propertyName);
-	}
-
-	private void checkValidPropertyName(String propertyName) {
-		if (!validProperties.contains(propertyName)) {
-			throw new RuntimeException(PROPERTY_NOT_LOCATED_ + propertyName);
-		}
-	}
-
-	/**
-	 * <p>
-	 * Returns the property value for the specified propertyName.
-	 * </p>
-	 * <p>
-	 * If the specified propertyName is not a property {@see #isProperty(String)}then a
-	 * RuntimeException will be thrown.
-	 * </p>
-	 * <p>
-	 * If the specified propertyName is a base property {@see #isBaseProperty(String)}then it will
-	 * immediatly be set and nested models will not be affected. If it is not a base property (i.e.
-	 * it is a property for a nested DataModel) then a recursive search through nested DataModels
-	 * will be conducted. The first nested DataModel having the property will return its value.
-	 * </p>
-	 * 
-	 * @param propertyName
-	 * @return
-	 * 
-	 * @see #getBooleanProperty(String)
-	 * @see #getIntProperty(String)
-	 * @see #getStringProperty(String)
-	 */
-	public final Object getProperty(String propertyName) {
-		checkValidPropertyName(propertyName);
-		if (isBaseProperty(propertyName)) {
-			return doGetProperty(propertyName);
-		} else if (nestedModels != null) {
-			WTPOperationDataModel dataModel = null;
-			Object[] keys = nestedModels.keySet().toArray();
-			for (int i = 0; i < keys.length; i++) {
-				dataModel = (WTPOperationDataModel) nestedModels.get(keys[i]);
-				if (dataModel.isProperty(propertyName)) {
-					return dataModel.getProperty(propertyName);
-				}
-			}
-		}
-		throw new RuntimeException(PROPERTY_NOT_LOCATED_ + propertyName);
-	}
-
-	/**
-	 * <p>
-	 * Though generally unecessary, implementors may override this method as they see fit.
-	 * <p>
-	 * 
-	 * @param propertyName
-	 * @return
-	 */
-	protected Object doGetProperty(String propertyName) {
-		if (propertyValues.containsKey(propertyName)) {
-			return propertyValues.get(propertyName);
-		}
-		return getDefaultProperty(propertyName);
-	}
-
-	/**
-	 * <p>
-	 * Sets the specified propertyName to the specified propertyValue. Subsequent calls to
-	 * #getProperty(String) will return the same propertyValue.
-	 * <p>
-	 * When a propertyValue other than <code>null</code> is set, then the property is considered
-	 * "set" (see #isSet(String)), conversly, a propertyValue of <code>null</code> is considered
-	 * "unset".
-	 * <p>
-	 * If the specified propertyName is not a property (see#isProperty(String)) then a
-	 * RuntimeException will be thrown.
-	 * <p>
-	 * Attempting to set a propertyName when this DataModel is locked (see #isLocked()) will result
-	 * in a thrown IllegalStateException. An IllegalStateException will not be thrown, however, if
-	 * the propertyName is a Result Property, (see #isResultProperty(String)).
-	 * <p>
-	 * 
-	 * @param propertyName
-	 * @param propertyValue
-	 * 
-	 * 
-	 * @see #getProperty(String)
-	 * @see #isSet(String)
-	 * @see #isProperty(String)
-	 * @see #isResultProperty(String)
-	 * @see #isLocked()
-	 * 
-	 * <p>
-	 * There are also convenience methods for setting properties representing property types of
-	 * boolean and int.
-	 * <p>
-	 * @see #setBooleanProperty(String, boolean)
-	 * @see #setIntProperty(String, int)
-	 */
-	public final void setProperty(String propertyName, Object propertyValue) {
-		if (isLocked() && !isResultProperty(propertyName))
-			throw new IllegalStateException(WTPResourceHandler.getString("18", new Object[]{getClass().getName()})); //$NON-NLS-1$
-		if (ignorePropertyChanges)
-			return; // ignoring property changes
-		checkValidPropertyName(propertyName);
-		boolean nestedFound = false;
-		if (isBaseProperty(propertyName)) {
-			internalSetProperty(propertyName, propertyValue);
-			return;
-		} else if (nestedModels != null) {
-			WTPOperationDataModel dataModel = null;
-			Object[] keys = nestedModels.keySet().toArray();
-			for (int i = 0; i < keys.length; i++) {
-				dataModel = (WTPOperationDataModel) nestedModels.get(keys[i]);
-				if (dataModel.isProperty(propertyName)) {
-					nestedFound = true;
-					dataModel.setProperty(propertyName, propertyValue);
-				}
-			}
-		}
-		if (!nestedFound) {
-			throw new RuntimeException(PROPERTY_NOT_LOCATED_ + propertyName);
-		}
-	}
-
-	private final void internalSetProperty(String propertyName, Object propertyValue) {
-		Object oldValue = propertyValues.get(propertyName);
-		if (valueChanged(propertyValue, oldValue)) {
-			if (doSetProperty(propertyName, propertyValue)) {
-				notifyListeners(propertyName, WTPOperationDataModelEvent.PROPERTY_CHG);
-			}
-		}
-	}
-
-	/*
-	 * Return true to notify listeners.
-	 */
-	protected boolean doSetProperty(String propertyName, Object propertyValue) {
-		if (null != propertyValue)
-			propertyValues.put(propertyName, propertyValue);
-		else if (propertyValues.containsKey(propertyName))
-			propertyValues.remove(propertyName);
-		return true;
-	}
-
-	private boolean valueChanged(Object o1, Object o2) {
-		return o1 != o2 && ((o1 != null && !o1.equals(o2)) || !o2.equals(o1));
-	}
-
-	/**
-	 * Convenience method to create a WTPOperationDataModelEvent.PROPERTY_CHG event and notify
-	 * listeners.
-	 * 
-	 * @param propertyName
-	 * @see #notifyListeners(WTPOperationDataModelEvent)
-	 */
-	protected void notifyListeners(String propertyName) {
-		notifyListeners(propertyName, WTPOperationDataModelEvent.PROPERTY_CHG);
-	}
-
-	/**
-	 * Convenience method to create a WTPOperationDataModelEvent event of the specified type and
-	 * notify listeners.
-	 * 
-	 * @param propertyName
-	 * @see WTPOperationDataModelEvent for the list of valid flag values
-	 */
-	protected void notifyListeners(String propertyName, int flag) {
-		notifyListeners(new WTPOperationDataModelEvent(this, propertyName, flag));
-	}
-
-	/**
-	 * Notifies all registerd WTPOperationDataModelListeners of the specified
-	 * WTPOperationDataModelEvent.
-	 * 
-	 * @param event
-	 */
-	protected void notifyListeners(WTPOperationDataModelEvent event) {
-		if (notificationEnabled && listeners != null && !listeners.isEmpty()) {
-			WTPOperationDataModelListener listener;
-			for (int i = 0; i < listeners.size(); i++) {
-				listener = (WTPOperationDataModelListener) listeners.get(i);
-				if (listener != event.getDataModel()) {
-					listener.propertyChanged(event);
-				}
-			}
-		}
-	}
-
-	public void propertyChanged(WTPOperationDataModelEvent event) {
-		notifyListeners(event);
-	}
-
-	public boolean isSet(String propertyName) {
-		checkValidPropertyName(propertyName);
-		if (isBaseProperty(propertyName)) {
-			return propertyValues.containsKey(propertyName);
-		} else if (nestedModels != null) {
-			WTPOperationDataModel dataModel = null;
-			Object[] keys = nestedModels.keySet().toArray();
-			for (int i = 0; i < keys.length; i++) {
-				dataModel = (WTPOperationDataModel) nestedModels.get(keys[i]);
-				if (dataModel.isProperty(propertyName)) {
-					return dataModel.isSet(propertyName);
-				}
-			}
-		}
-		throw new RuntimeException(PROPERTY_NOT_LOCATED_ + propertyName);
-	}
-
-	public final IStatus validateDataModel() {
-		return validateDataModel(false);
-	}
-
-	public final IStatus validateDataModel(boolean stopOnFirstFailure) {
-		if (suspendValidation)
-			return OK_STATUS;
-		IStatus status = null;
-		if (validBaseProperties != null && !validBaseProperties.isEmpty()) {
-			IStatus propStatus;
-			String propName;
-			Iterator it = validBaseProperties.iterator();
-			while (it.hasNext()) {
-				propName = (String) it.next();
-				propStatus = validateProperty(propName);
-				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 OK_STATUS;
-		return status;
-	}
-
-	public void addListener(WTPOperationDataModelListener listener) {
-		if (listener != null) {
-			if (listeners == null) {
-				listeners = new ArrayList();
-				listeners.add(listener);
-			} else if (!listeners.contains(listener))
-				listeners.add(listener);
-		}
-	}
-
-	public void removeListener(WTPOperationDataModelListener listener) {
-		if (listeners != null && listener != null)
-			listeners.remove(listener);
-	}
-
-	/**
-	 * Return true if the model doesn't have any errors.
-	 * 
-	 * @return boolean
-	 */
-	public boolean isValid() {
-		IStatus status = validateDataModel(true);
-		if (status.isOK())
-			return true;
-		if (status.getSeverity() == IStatus.ERROR)
-			return false;
-		return true;
-	}
-
-	/**
-	 * Use this method when the model should ignore any property set calls. Remember to always reset
-	 * the value in a finally block.
-	 * 
-	 * @param aBoolean
-	 */
-	public void setIgnorePropertyChanges(boolean aBoolean) {
-		ignorePropertyChanges = aBoolean;
-	}
-
-	/**
-	 * Return the status for the validation of a particular property. Subclasses should override
-	 * when a specific validation is required.
-	 * 
-	 * @param propertyName
-	 * @return
-	 */
-	protected IStatus doValidateProperty(String propertyName) {
-		if (NESTED_MODEL_VALIDATION_HOOK.equals(propertyName)) {
-			if (nestedModels != null && !nestedModels.isEmpty()) {
-				IStatus modelStatus;
-				WTPOperationDataModel dataModel;
-				Iterator it = nestedModels.values().iterator();
-				while (it.hasNext()) {
-					dataModel = (WTPOperationDataModel) it.next();
-					modelStatus = dataModel.validateDataModel(true);
-					if (!modelStatus.isOK()) {
-						return modelStatus;
-					}
-				}
-			}
-		}
-		return OK_STATUS;
-	}
-
-	public final IStatus validateProperty(String propertyName) {
-		if (suspendValidation)
-			return OK_STATUS;
-		checkValidPropertyName(propertyName);
-		if (isBaseProperty(propertyName)) {
-			return doValidateProperty(propertyName);
-		} else if (nestedModels != null) {
-			WTPOperationDataModel dataModel = null;
-			Object[] keys = nestedModels.keySet().toArray();
-			boolean propertyFound = false;
-			IStatus status = null;
-			for (int i = 0; i < keys.length; i++) {
-				dataModel = (WTPOperationDataModel) nestedModels.get(keys[i]);
-				if (dataModel.isProperty(propertyName)) {
-					propertyFound = true;
-					status = dataModel.validateProperty(propertyName);
-					if (!status.isOK()) {
-						return status;
-					}
-				}
-			}
-			if (propertyFound) {
-				return OK_STATUS;
-			}
-		}
-		throw new RuntimeException(PROPERTY_NOT_LOCATED_ + propertyName);
-	}
-
-	// handles for validation enablement for model and nested children
-	protected void enableValidation() {
-		suspendValidation = false;
-		if (nestedModels != null) {
-			WTPOperationDataModel dataModel = null;
-			Object[] keys = nestedModels.keySet().toArray();
-			for (int i = 0; i < keys.length; i++) {
-				dataModel = (WTPOperationDataModel) nestedModels.get(keys[i]);
-				dataModel.enableValidation();
-			}
-		}
-	}
-
-	// handles for validation disablement for model and nested children
-	protected void disableValidation() {
-		suspendValidation = true;
-		if (nestedModels != null) {
-			WTPOperationDataModel dataModel = null;
-			Object[] keys = nestedModels.keySet().toArray();
-			for (int i = 0; i < keys.length; i++) {
-				dataModel = (WTPOperationDataModel) nestedModels.get(keys[i]);
-				dataModel.disableValidation();
-			}
-		}
-	}
-
-	/**
-	 * This method should be called from doSetProperty(String, Object) when a change to a
-	 * propertyName will cause default values within the model to change. The passed propertyName is
-	 * another property that may need to have its default value recomputed. This allows for UIs to
-	 * refresh.
-	 * 
-	 * @param propertyName
-	 */
-	public void notifyDefaultChange(String propertyName) {
-		if (!isSet(propertyName))
-			notifyListeners(propertyName, WTPOperationDataModelEvent.PROPERTY_CHG);
-	}
-
-	/**
-	 * This method should be called when the valid values for the given propertyName may need to be
-	 * recaculated. This allows for UIs to refresh.
-	 * 
-	 * @param propertyName
-	 */
-	public void notifyValidValuesChange(String propertyName) {
-		notifyListeners(propertyName, WTPOperationDataModelEvent.VALID_VALUES_CHG);
-	}
-
-	protected void notifyEnablementChange(String propertyName) {
-		Boolean enable = isEnabled(propertyName);
-		if (enable != null) {
-			notifyListeners(propertyName, WTPOperationDataModelEvent.ENABLE_CHG);
-		}
-	}
-
-	public void dispose() {
-	}
-
-	protected boolean isNotificationEnabled() {
-		return notificationEnabled;
-	}
-
-	protected void setNotificationEnabled(boolean notificationEnabled) {
-		this.notificationEnabled = notificationEnabled;
-	}
-
-	/**
-	 * @return Returns the locked.
-	 */
-	protected final boolean isLocked() {
-		return locked;
-	}
-
-	/**
-	 * @param locked
-	 *            The locked to set.
-	 */
-	protected final void setLocked(boolean locked) {
-		this.locked = locked;
-		if (locked)
-			hasBeenExecutedAgainst = true;
-	}
-
-	/**
-	 * By Overwriting this method, you can change the model when its executing. This is only
-	 * recommened when you need to set the result of the operation in the model.
-	 * 
-	 * @param propertyName
-	 * @return
-	 */
-	protected boolean isResultProperty(String propertyName) {
-		return false;
-	}
-
-
-	public final boolean isOperationValidationEnabled() {
-		return operationValidationEnabled;
-	}
-
-	public final void setOperationValidationEnabled(boolean operationValidationEnabled) {
-		this.operationValidationEnabled = operationValidationEnabled;
-	}
-
-	/**
-	 * This method is EXPERIMENTAL and is subject to substantial changes.
-	 * 
-	 * Gets the specified array of properties from the source DataModel and sets them on the
-	 * destination DataModel.
-	 * 
-	 * @param source
-	 * @param destination
-	 * @param properties
-	 */
-	public static void copyProperties(WTPOperationDataModel source, WTPOperationDataModel destination, String[] properties) {
-		for (int i = 0; i < properties.length; i++) {
-			destination.setProperty(properties[i], source.getProperty(properties[i]));
-		}
-	}
-
-
-	/**
-	 * Recursively removes all property values of this DataModel and all nested DataModels.
-	 */
-	public void clearAllValues() {
-		if (propertyValues != null)
-			propertyValues.clear();
-		if (nestedModels != null) {
-			Iterator it = nestedModels.values().iterator();
-			while (it.hasNext())
-				((WTPOperationDataModel) it.next()).clearAllValues();
-		}
-	}
-
-	/**
-	 * Use this method to determine if an operation has been run using this data model.
-	 * 
-	 * @return
-	 */
-	public boolean hasBeenExecutedAgainst() {
-		return hasBeenExecutedAgainst;
-	}
-
-	// TODO delete this
-	/**
-	 * This will be deleted before WTP M4 If this is used for extended operations, see the property
-	 * EXTENDED_CONTEXT. Otherwise, there is no replacement method.
-	 * 
-	 * @deprecated see #EXTENDED_CONTEXT
-	 */
-	public IProject getTargetProject() {
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/WTPOperationDataModelEvent.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/WTPOperationDataModelEvent.java
deleted file mode 100644
index 1397a4b..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/WTPOperationDataModelEvent.java
+++ /dev/null
@@ -1,134 +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.operations;
-
-/**
- * This event is used to communicate property changes from WTPOperationDataModels to their
- * WTPOperationDataModelListeners.
- * 
- * This class may be instantiated; it is not intended to be subclassed.
- * 
- * This class is EXPERIMENTAL and is subject to substantial changes.
- * 
- * @see org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel#addListener(WTPOperationDataModelListener)
- * @see org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModelListener
- */
-public class WTPOperationDataModelEvent {
-
-	/**
-	 * A flag used to specify the property's value has changed.
-	 * 
-	 * @see WTPOperationDataModel#getProperty(String)
-	 * @see #getFlag()
-	 */
-	public static final int PROPERTY_CHG = 1;
-
-	/**
-	 * A flag used to specify the property's valid values have changed.
-	 * 
-	 * @see WTPOperationDataModel#getValidPropertyDescriptors(String)
-	 * @see #getFlag()
-	 */
-	public static final int VALID_VALUES_CHG = 4;
-
-	/**
-	 * A flag used to specify the property's enablment has changed.
-	 * 
-	 * @see WTPOperationDataModel#isEnabled(String)
-	 * @see #getFlag()
-	 */
-	public static final int ENABLE_CHG = 3;
-
-	private WTPOperationDataModel dataModel;
-	private String propertyName;
-	private int flag;
-
-	/**
-	 * Constructor for WTPOperationDataModelEvent
-	 * 
-	 * @param dataModel
-	 *            the dataModel whose property has changed
-	 * @param propertyName
-	 *            the name of the changed property
-	 * @param flag
-	 *            contains a flag specifiying the event type
-	 */
-	public WTPOperationDataModelEvent(WTPOperationDataModel dataModel, String propertyName, int flag) {
-		this.dataModel = dataModel;
-		this.propertyName = propertyName;
-		this.flag = flag;
-	}
-
-	/**
-	 * Returns the dataModel whose property has changed.
-	 * 
-	 * @return the dataModel whose property has changed.
-	 */
-	public WTPOperationDataModel getDataModel() {
-		return dataModel;
-	}
-
-	/**
-	 * Returns the name of the changed property.
-	 * 
-	 * @return the name of the changed property.
-	 */
-	public String getPropertyName() {
-		return propertyName;
-	}
-
-	/**
-	 * 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>
-	 * 
-	 * @return the flag indicating the event type.
-	 */
-	public int getFlag() {
-		return flag;
-	}
-
-	/**
-	 * Convenience method to return the dataModel's property. This is equavalent to:
-	 * <code>getDataModel().getProperty(getPropertyName())</code>.
-	 * 
-	 * @return the dataModel's property.
-	 * @see WTPOperationDataModel#getProperty(String)
-	 */
-	public Object getProperty() {
-		return dataModel.getProperty(propertyName);
-	}
-
-	/**
-	 * Convenience method to return the dataModel property's enablement state. This is equavalent
-	 * to: <code>getDataModel().isEnabled(getPropertyName())</code>.
-	 * 
-	 * @return the dataModel property's enablement state.
-	 * @see WTPOperationDataModel#isEnabled(String)
-	 */
-	public Boolean isEnabled() {
-		return dataModel.isEnabled(propertyName);
-	}
-
-	/**
-	 * Convenience method to return the dataModel property's valid property descriptors. This is
-	 * equavalent to: <code>getDataModel().getValidPropertyDescriptors(getPropertyName())</code>.
-	 * 
-	 * @return the dataModel property's valid property descriptors.
-	 * @see WTPOperationDataModel#getValidPropertyDescriptors(String)
-	 */
-	public WTPPropertyDescriptor[] getValidPropertyDescriptors() {
-		return dataModel.getValidPropertyDescriptors(propertyName);
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/WTPOperationDataModelListener.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/WTPOperationDataModelListener.java
deleted file mode 100644
index 212b9f4..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/WTPOperationDataModelListener.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
- **************************************************************************************************/
-package org.eclipse.wst.common.frameworks.internal.operations;
-
-/**
- * Clients wishing to register with a WTPOperationData to receive WTPOperationDataModelEvents need
- * to implement this interface.
- * 
- * This class is EXPERIMENTAL and is subject to substantial changes.
- * 
- * @see org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel#addListener(WTPOperationDataModelListener)
- */
-public interface WTPOperationDataModelListener {
-	//TODO delete this
-	/**
-	 * This will be deleted before WTP M4. Use WTPOperationDataModelEvent.PROPERTY_CHG instead.
-	 * 
-	 * @deprecated Use WTPOperationDataModelEvent.PROPERTY_CHG instead.
-	 */
-	final int PROPERTY_CHG = WTPOperationDataModelEvent.PROPERTY_CHG;
-
-	//TODO delete this
-	/**
-	 * This will be deleted before WTP M4. Use WTPOperationDataModelEvent.VALID_VALUES_CHG instead.
-	 * 
-	 * @deprecated Use WTPOperationDataModelEvent.VALID_VALUES_CHG instead.
-	 */
-	final int VALID_VALUES_CHG = WTPOperationDataModelEvent.VALID_VALUES_CHG;
-
-	//TODO delete this
-	/**
-	 * This will be deleted before WTP M4. Use WTPOperationDataModelEvent.ENABLE_CHG instead.
-	 * 
-	 * @deprecated Use WTPOperationDataModelEvent.ENABLE_CHG instead.
-	 */
-	final int ENABLE_CHG = WTPOperationDataModelEvent.ENABLE_CHG;
-
-	/**
-	 * This method is invoked on listening clients when a property changes.
-	 * 
-	 * @param event
-	 *            the event carrying the notification.
-	 */
-	void propertyChanged(WTPOperationDataModelEvent event);
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/WTPOperationJobAdapter.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/WTPOperationJobAdapter.java
deleted file mode 100644
index be561df..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/WTPOperationJobAdapter.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
- **************************************************************************************************/
-/*
- * Created on Jan 20, 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.operations;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.wst.common.frameworks.internal.WTPResourceHandler;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
-
-import org.eclipse.jem.util.logger.proxy.Logger;
-
-
-public class WTPOperationJobAdapter extends Job {
-
-	private WTPOperation operation = null;
-
-	public WTPOperationJobAdapter(WTPOperation operation) {
-		super(operation.toString());
-		this.operation = operation;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.internal.jobs.InternalJob#run(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	protected IStatus run(IProgressMonitor monitor) {
-		IStatus result = null;
-		try {
-			operation.run(monitor);
-			result = operation.getStatus(); //new Status(IStatus.OK, WTPCommonPlugin.PLUGIN_ID,
-											// IStatus.OK, WTPResourceHandler.getString("26"),
-											// null); //$NON-NLS-1$
-		} catch (Exception e) {
-			operation.addStatus(new Status(IStatus.ERROR, WTPCommonPlugin.PLUGIN_ID, IStatus.ERROR, WTPResourceHandler.getString("27"), e)); //$NON-NLS-1$
-			result = operation.getStatus();
-			Logger.getLogger().logError(e);
-		}
-		return result;
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/WTPPropertyDescriptor.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/WTPPropertyDescriptor.java
deleted file mode 100644
index eb23f95..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/WTPPropertyDescriptor.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package org.eclipse.wst.common.frameworks.internal.operations;
-
-//TODO link to an example in the tutorial
-/**
- * A WTPPropertyDescriptor provides a human readible description for a WTPDataModel propertyValue.
- *
- * This class is EXPERIMENTAL and is subject to substantial changes.
- *  
- * @see org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel#getPropertyDescriptor(String)
- * @see org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel#getValidPropertyDescriptors(String)
- */
-public class WTPPropertyDescriptor {
-
-	/**
-	 * A convenience method which returns an array of WTPPropertyDescriptors. 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 WTPPropertyDescriptor is created using
-	 * <code>new WTPPropertyDescriptor(values[i]);</code>.
-	 * 
-	 * @param values
-	 *            the array of property values
-	 * @return the constructed WTPPropertyDescriptor array
-	 */
-	public static WTPPropertyDescriptor[] createDescriptors(Object[] values) {
-		if (null == values) {
-			return new WTPPropertyDescriptor[0];
-		}
-		WTPPropertyDescriptor[] descriptors = new WTPPropertyDescriptor[values.length];
-		for (int i = 0; i < descriptors.length; i++) {
-			descriptors[i] = new WTPPropertyDescriptor(values[i]);
-		}
-		return descriptors;
-	}
-
-	/**
-	 * A convenience method which returns an array of WTPPropertyDescriptors. 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
-	 * WTPPropertyDescriptor is created using
-	 * <code>new WTPPropertyDescriptor(values[i], descriptions[i]);</code>. Both arrays must be
-	 * the same length.
-	 * 
-	 * @param values
-	 *            the array of property values
-	 * @param descriptions
-	 *            the array of property descriptions cooresponding the values array
-	 * @return the constructed WTPPropertyDescriptor array
-	 */
-	public static WTPPropertyDescriptor[] createDescriptors(Object[] values, String[] descriptions) {
-		if (null == values) {
-			return new WTPPropertyDescriptor[0];
-		}
-		WTPPropertyDescriptor[] descriptors = new WTPPropertyDescriptor[values.length];
-		for (int i = 0; i < descriptors.length; i++) {
-			descriptors[i] = new WTPPropertyDescriptor(values[i], descriptions[i]);
-		}
-		return descriptors;
-
-	}
-
-	private Object propertyValue;
-	private String propertyDescription;
-
-	/**
-	 * This is equavalent to calling <code>WTPPropertyDescriptor(propertyValue, null);</code>
-	 * 
-	 * @param propertyValue
-	 */
-	public WTPPropertyDescriptor(Object propertyValue) {
-		this.propertyValue = propertyValue;
-	}
-
-	/**
-	 * Creates a new WTPPropertyDescriptor with the specified propertyValue and propertyDescription.
-	 * 
-	 * @param propertyValue
-	 * @param propertyDescription
-	 */
-	public WTPPropertyDescriptor(Object propertyValue, String propertyDescription) {
-		this.propertyValue = propertyValue;
-		this.propertyDescription = propertyDescription;
-	}
-
-	/**
-	 * Returns the property value.
-	 * 
-	 * @return the property value
-	 */
-	public Object getPropertyValue() {
-		return propertyValue;
-	}
-
-	/**
-	 * 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. Null will never be returned.
-	 * 
-	 * @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$
-	}
-}
\ No newline at end of file
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 b77f89f..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/plugin/WTPCommonMessages.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 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$ 
-}
\ No newline at end of file
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 16c44b8..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, 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 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;
-	}
-}
\ No newline at end of file
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 f5db865..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/wtp_common.properties
+++ /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
-###############################################################################
-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=Connector project is not supported for selected J2EE preference. Check the global J2EE preference.
-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.
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/wtp_common_de.properties b/plugins/org.eclipse.wst.common.frameworks/src/wtp_common_de.properties
deleted file mode 100644
index 49572af..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/wtp_common_de.properties
+++ /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
-###############################################################################
-1=Ein Projekt mit diesem Namen und dieser Position ist bereits vorhanden.
-2=Das angegebene Projekt "{0}" ist kein EAR-Projekt.
-3=Das EAR-Projekt "{0}" hat die J2EEVersion {1}, die nicht mit der angegebenen Version des Moduls kompatibel ist.
-4=Der Name des EAR-Projekts, "{0}", darf nicht mit dem Projektnamen identisch sein.
-5={0} Dateiname muss eingegeben werden.
-6={0} ist nicht vorhanden.
-7=Ein interner Fehler ist aufgetreten.  Weitere Details finden Sie in den Protokolldateien.
-8=Der Projektname ist ung\u00fcltig.
-9=Zielarchiv sollte auf {0} enden.
-10=Zielarchiv ist ung\u00fcltig.
-11=Zielposition ist schreibgesch\u00fctzt.
-12=Die Ressource {0} ist bereits vorhanden. Wenn Sie sie \u00fcberschreiben wollen, w\u00e4hlen Sie die Option "Vorhandene Datei \u00fcberschreiben" aus.
-13=Projekt {0} ist nicht vorhanden.
-14=Connectorprojekt wird f\u00fcr die ausgew\u00e4hlte J2EE-Benutzervorgabe nicht unterst\u00fctzt. \u00dcberpr\u00fcfen Sie die globale J2EE-Einstellung.
-15=Geben Sie einen Projektnamen ein.
-16=Fehler beim Speichern
-17=Der Speichervorgang konnte nicht abgeschlossen werden.  M\u00f6glicherweise wurden bereits einige zugeh\u00f6rige Dateien gespeichert.\n\nUrsache
-18={0} wurde gesperrt. Bitte stellen Sie sicher, dass die Operation zurzeit nicht ausgef\u00fchrt wird.
-19=extendedRoot ist Null. Stellen Sie sicher, dass isExtended() "true" zur\u00fcckgibt.
-20=Eigenschaft nicht gefunden:
-21=Verschachteltes Modell nicht gefunden:
-22=ID kann nach dem Festlegen nicht mehr ge\u00e4ndert werden.
-23=Die ID darf nicht Null sein.
-24=FEHLER:
-25=Erweiterte Operation ist fehlgeschlagen: {0}
-26=Der Job wurde erfolgreich beendet.
-27=Beim Ausf\u00fchren des Jobs ist eine Ausnahmebedingung aufgetreten.
-28=Gruppe kann nicht aufgel\u00f6st werden:
-29=Klasse nicht gefunden f\u00fcr Attribut {0} : {1}, Plug-in-Erweiterung wird deklariert: {2}
-30=Funktionsgruppe {0} enth\u00e4lt keine Musterbindings.
-31=Das Projekt {0} ist geschlossen.
-32=Im Dateisystem besteht bereits ein Projekt an dieser Position: {0}. Verwenden Sie entweder "Bestehende Projekte in den Arbeitsbereich importieren", um ein Projekt an dieser Stelle zu erstellen, oder l\u00f6schen Sie den Inhalt von{0} im Dateisystem.
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/wtp_common_es.properties b/plugins/org.eclipse.wst.common.frameworks/src/wtp_common_es.properties
deleted file mode 100644
index 1fda654..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/wtp_common_es.properties
+++ /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
-###############################################################################
-1=Ya existe un proyecto con este nombre y ubicaci\u00f3n.
-2=El proyecto EAR especificado "{0}" no es un proyecto EAR.
-3=El proyecto EAR "{0}" tiene una J2EEVersion de {1} que no es compatible con la versi\u00f3n del m\u00f3dulo especificado.
-4=El nombre de proyecto EAR, "{0}", no puede ser igual que el nombre del proyecto.
-5=Debe especificarse el nombre del archivo {0}.
-6={0} no existe.
-7=Se ha producido un error interno.  Vea los archivos de anotaciones para conocer los detalles.
-8=El nombre del proyecto no es v\u00e1lido.
-9=El archivador de destino debe finalizar con {0}.
-10=El archivador de destino no es v\u00e1lido.
-11=La ubicaci\u00f3n de destino es solo de lectura.
-12=El recurso {0} ya existe. Si desea sobrescribir, seleccione la opci\u00f3n "Sobrescribir archivo existente".
-13=El proyecto {0} no existe.
-14=El proyecto de conector no est\u00e1 soportado para la preferencia J2EE seleccionada. Compruebe la preferencia J2EE global.
-15=Especifique un nombre de proyecto.
-16=Problemas de operaci\u00f3n de guardar
-17=La operaci\u00f3n de guardar no ha podido realizarse.  Puede que algunos archivos relacionados ya se hayan guardado.\n\nRaz\u00f3n
-18={0} se ha bloqueado. Aseg\u00farese de que la operaci\u00f3n no se est\u00e1 ejecutando actualmente.
-19=extendedRoot es nulo. Aseg\u00farese de que isExtended() devuelve true.
-20=No se ha ubicado la propiedad:
-21=No se ha ubicado el modelo anidado:
-22=No se puede modificar el ID una vez establecido.
-23=El ID no puede ser nulo.
-24=ERROR:
-25=Anomal\u00eda de operaci\u00f3n ampliada: {0}
-26=El trabajo se ha realizado satisfactoriamente
-27=Se ha producido una excepci\u00f3n al ejecutar el trabajo.
-28=No se ha podido resolver el grupo:
-29=No se ha encontrado la clase para el atributo {0} : {1}, declarando extensi\u00f3n de conector: {2}
-30=El grupo de funciones {0} no contiene enlaces de patr\u00f3n
-31=El proyecto {0} est\u00e1 cerrado.
-32=Ya existe un proyecto en la siguiente ubicaci\u00f3n del sistema de archivos: {0}. Puede utilizar "Importar proyectos existentes en el espacio de trabajo" para crear el proyecto en esta ubicaci\u00f3n o suprimir el contenido en el sistema de archivos de {0}.
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/wtp_common_fr.properties b/plugins/org.eclipse.wst.common.frameworks/src/wtp_common_fr.properties
deleted file mode 100644
index faff472..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/wtp_common_fr.properties
+++ /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
-###############################################################################
-1=Il existe d\u00e9j\u00e0 un projet avec ce nom et cet emplacement.
-2=Le projet EAR "{0}" sp\u00e9cifi\u00e9 ne correspond pas \u00e0 un projet EAR.
-3=La version J2EE du projet EAR "{0}" est {1} ; cette version n''est pas compatible avec la version de module sp\u00e9cifi\u00e9e.
-4=Le nom de projet EAR "{0}" ne peut pas \u00eatre identique au nom du projet.
-5=Vous devez entrer le nom de fichier {0}.
-6={0} n''existe pas.
-7=Une erreur interne s'est produite.  Consultez les fichiers journaux pour plus de d\u00e9tails.
-8=Nom de projet non valide.
-9=L''archive de destination doit se terminer par {0}.
-10=Archive de destination non valide.
-11=Emplacement de destination en lecture seule.
-12=La ressource {0} existe d\u00e9j\u00e0. Pour la remplacer, s\u00e9lectionnez l'option "Remplacer le fichier existant".
-13=Projet {0} inexistant.
-14=Le projet de connecteur n'est pas pris en charge pour la pr\u00e9f\u00e9rence J2EE s\u00e9lectionn\u00e9e. V\u00e9rifiez la pr\u00e9f\u00e9rence J2EE globale.
-15=Entrez un nom de projet.
-16=Erreurs de sauvegarde
-17=La sauvegarde n'a pas pu \u00eatre effectu\u00e9e.  Certains fichiers associ\u00e9s ont peut-\u00eatre \u00e9t\u00e9 d\u00e9j\u00e0 sauvegard\u00e9s.\n\nMotif
-18={0} a \u00e9t\u00e9 verrouill\u00e9. V\u00e9rifiez que l''op\u00e9ration n''est pas en cours d''ex\u00e9cution.
-19=ExtendedRoot est NULL. V\u00e9rifiez que l'indicateur isExtended() renvoie la valeur true.
-20=Propri\u00e9t\u00e9 introuvable :
-21=Mod\u00e8le imbriqu\u00e9 introuvable :
-22=Impossible de modifier l'ID une fois qu'il a \u00e9t\u00e9 d\u00e9fini.
-23=L'ID ne pas \u00eatre NULL
-24=ERREUR :
-25=Echec de l''op\u00e9ration \u00e9tendue : {0}
-26=Travail termin\u00e9
-27=Exception lors de l'ex\u00e9cution du travail.
-28=Le groupe ne peut pas \u00eatre r\u00e9solu :
-29=Classe introuvable pour l''attribut {0} : {1}, D\u00e9claration de l''extension du plug-in : {2}
-30=Le groupe de fonctions {0} ne contient pas de liaisons de mod\u00e8le
-31=Le projet {0} est ferm\u00e9.
-32=Un projet existe d\u00e9j\u00e0 dans le syst\u00e8me de fichiers \u00e0 l''emplacement : {0}. Utilisez l''option d''importation des projets existants dans l''espace de travail pour cr\u00e9er un projet \u00e0 cet emplacement ou supprimez le contenu de {0} du syst\u00e8me de fichiers.
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/wtp_common_it.properties b/plugins/org.eclipse.wst.common.frameworks/src/wtp_common_it.properties
deleted file mode 100644
index ddffb67..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/wtp_common_it.properties
+++ /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
-###############################################################################
-1=Un progetto con questo nome e questo percorso esiste gi\u00e0.
-2=Il progetto EAR specificato "{0}" non \u00e8 un progetto EAR.
-3=Il progetto EAR "{0}" dispone di una versione J2EE di {1} non compatibile con la versione del modulo specificata.
-4=Il nome del progetto EAR, "{0}", non pu\u00f2 essere uguale al nome del progetto.
-5=\u00c8 necessario immettere il nome file {0}.
-6={0} non esiste.
-7=Si \u00e8 verificato un errore interno.  Per i dettagli, fare riferimento ai file di log.
-8=Il nome del progetto non \u00e8 valido.
-9=L''archivio di destinazione deve terminare con {0}.
-10=L'archivio di destinazione non \u00e8 valido.
-11=Il percorso di destinazione \u00e8 di sola lettura.
-12=La risorsa {0} esiste gi\u00e0. Per sovrascriverla, selezionare l''opzione "Sovrascrivi file esistente".
-13=Il progetto {0} non esiste.
-14=Il progetto del connettore non \u00e8 supportato per la preferenza J2EE selezionata. Verificare la preferenza J2EE globale.
-15=Immettere un nome per il progetto.
-16=Problemi di salvataggio
-17=Impossibile completare il salvataggio.  Alcuni file correlati potrebbero gi\u00e0 essere stati salvati.\n\nMotivo
-18={0} \u00e8 stato bloccato. Assicurarsi che l''operazione non sia attualmente in esecuzione.
-19=extendedRoot \u00e8 null. Verificare che isExtended() restituisca true.
-20=Propriet\u00e0 non individuata:
-21=Modello nidificato non individuato:
-22=Impossibile modificare l'id una volta impostato.
-23=L'id non pu\u00f2 essere null.
-24=ERRORE:
-25=Errore di operazione estesa: {0}
-26=Lavoro completato correttamente
-27=Si \u00e8 verificata un'eccezione durante l'esecuzione del lavoro.
-28=Impossibile risolvere il gruppo:
-29=Classe non trovata per l''attributo {0} : {1}, Dichiarazione estensione plugin: {2}
-30=Il gruppo di funzioni {0} non contiene binding di modello
-31=Il progetto {0} \u00e8 chiuso.
-32=Un progetto esiste gi\u00e0 nel file system in: {0}.  Utilizzare "Importazione progetti esistenti nello spazio di lavoro" per creare un progetto in tale ubicazione oppure eliminare il contenuto di {0} dal file system.
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/wtp_common_ja.properties b/plugins/org.eclipse.wst.common.frameworks/src/wtp_common_ja.properties
deleted file mode 100644
index 637760e..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/wtp_common_ja.properties
+++ /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
-###############################################################################
-1=\u3053\u306e\u540d\u524d\u304a\u3088\u3073\u30ed\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u304c\u3059\u3067\u306b\u5b58\u5728\u3057\u307e\u3059\u3002
-2=\u6307\u5b9a\u3057\u305f EAR \u30d7\u30ed\u30b8\u30a7\u30af\u30c8 "{0}" \u306f EAR \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002
-3=EAR \u30d7\u30ed\u30b8\u30a7\u30af\u30c8 "{0}" \u306f\u3001\u6307\u5b9a\u3057\u305f\u30e2\u30b8\u30e5\u30fc\u30eb\u30fb\u30d0\u30fc\u30b8\u30e7\u30f3\u3068\u306e\u4e92\u63db\u6027\u304c\u306a\u3044 J2EE \u306e\u30d0\u30fc\u30b8\u30e7\u30f3 {1} \u3067\u3059\u3002
-4=EAR \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u540d "{0}" \u3092\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u540d\u3068\u540c\u3058\u306b\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002
-5={0} \u30d5\u30a1\u30a4\u30eb\u540d\u3092\u5165\u529b\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002
-6={0} \u306f\u5b58\u5728\u3057\u307e\u305b\u3093\u3002
-7=\u5185\u90e8\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002  \u8a73\u3057\u304f\u306f\u3001\u30ed\u30b0\u30fb\u30d5\u30a1\u30a4\u30eb\u3092\u8abf\u3079\u3066\u304f\u3060\u3055\u3044\u3002
-8=\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u540d\u304c\u7121\u52b9\u3067\u3059\u3002
-9=\u5b9b\u5148\u30a2\u30fc\u30ab\u30a4\u30d6\u306f {0} \u3067\u7d42\u308f\u3063\u3066\u3044\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
-10=\u5b9b\u5148\u30a2\u30fc\u30ab\u30a4\u30d6\u304c\u7121\u52b9\u3067\u3059\u3002
-11=\u5b9b\u5148\u30ed\u30b1\u30fc\u30b7\u30e7\u30f3\u306f\u8aad\u307f\u53d6\u308a\u5c02\u7528\u3067\u3059\u3002
-12=\u30ea\u30bd\u30fc\u30b9 {0} \u306f\u3059\u3067\u306b\u5b58\u5728\u3057\u3066\u3044\u307e\u3059\u3002 \u4e0a\u66f8\u304d\u3057\u305f\u3044\u5834\u5408\u3001\u300c\u65e2\u5b58\u30d5\u30a1\u30a4\u30eb\u306e\u4e0a\u66f8\u304d\u300d\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002
-13=\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 {0} \u306f\u5b58\u5728\u3057\u307e\u305b\u3093\u3002
-14=\u9078\u629e\u3057\u305f J2EE \u8a2d\u5b9a\u3067\u306f\u3001\u30b3\u30cd\u30af\u30bf\u30fc\u30fb\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 \u30b0\u30ed\u30fc\u30d0\u30eb J2EE \u8a2d\u5b9a\u3092\u8abf\u3079\u3066\u304f\u3060\u3055\u3044\u3002
-15=\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u540d\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002
-16=\u4fdd\u7ba1\u306e\u554f\u984c
-17=\u4fdd\u7ba1\u3092\u5b8c\u4e86\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002  \u4e00\u90e8\u306e\u95a2\u9023\u30d5\u30a1\u30a4\u30eb\u306f\u3059\u3067\u306b\u4fdd\u7ba1\u3055\u308c\u3066\u3044\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002\n\n\u7406\u7531
-18={0} \u306f\u30ed\u30c3\u30af\u3055\u308c\u3066\u3044\u307e\u3059\u3002 \u64cd\u4f5c\u304c\u73fe\u5728\u5b9f\u884c\u4e2d\u3067\u306a\u3044\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002
-19=extendedRoot \u304c NULL \u3067\u3059\u3002 isExtended() \u304c true \u3092\u623b\u3059\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002
-20=\u30d7\u30ed\u30d1\u30c6\u30a3\u30fc\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093:
-21=\u30cd\u30b9\u30c8\u3055\u308c\u305f\u30e2\u30c7\u30eb\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093:
-22=\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u308b ID \u3092\u5909\u66f4\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002
-23=ID \u3092 NULL \u306b\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002
-24=\u30a8\u30e9\u30fc:
-25=\u62e1\u5f35\u6f14\u7b97\u5931\u6557: {0}
-26=\u30b8\u30e7\u30d6\u304c\u6b63\u5e38\u306b\u5b8c\u4e86\u3057\u307e\u3057\u305f
-27=\u30b8\u30e7\u30d6\u306e\u5b9f\u884c\u4e2d\u306b\u4f8b\u5916\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
-28=\u30b0\u30eb\u30fc\u30d7\u3092\u89e3\u6c7a\u3067\u304d\u307e\u305b\u3093:
-29=\u5c5e\u6027 {0} \u7528\u306e\u30af\u30e9\u30b9\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093: {1}\u3002\u5ba3\u8a00\u3055\u308c\u3066\u3044\u308b\u30d7\u30e9\u30b0\u30a4\u30f3\u62e1\u5f35\u6a5f\u80fd: {2}
-30=\u95a2\u6570\u30b0\u30eb\u30fc\u30d7 {0} \u306b\u306f\u30d1\u30bf\u30fc\u30f3\u30fb\u30d0\u30a4\u30f3\u30c7\u30a3\u30f3\u30b0\u304c\u3042\u308a\u307e\u305b\u3093
-31=\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 {0} \u304c\u30af\u30ed\u30fc\u30ba\u3055\u308c\u3066\u3044\u307e\u3059\u3002
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/wtp_common_ko.properties b/plugins/org.eclipse.wst.common.frameworks/src/wtp_common_ko.properties
deleted file mode 100644
index a5c40ab..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/wtp_common_ko.properties
+++ /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
-###############################################################################
-1=\ud574\ub2f9 \uc774\ub984\uacfc \uc704\uce58\ub97c \uac00\uc9c0\ub294 \ud504\ub85c\uc81d\ud2b8\uac00 \uc774\ubbf8 \uc788\uc2b5\ub2c8\ub2e4.
-2=\uc9c0\uc815\ub41c EAR \ud504\ub85c\uc81d\ud2b8 "{0}"\uc740(\ub294) EAR \ud504\ub85c\uc81d\ud2b8\uac00 \uc544\ub2d9\ub2c8\ub2e4.
-3=EAR \ud504\ub85c\uc81d\ud2b8 "{0}"\uc740(\ub294) \uc9c0\uc815\ub41c \ubaa8\ub4c8 \ubc84\uc804\uacfc \ud638\ud658 \uac00\ub2a5\ud558\uc9c0 \uc54a\uc740 {1}\uc758 J2EEVersion\uc744 \uac16\uc2b5\ub2c8\ub2e4.
-4=EAR \ud504\ub85c\uc81d\ud2b8 \uc774\ub984 "{0}"\uc740(\ub294) \ud504\ub85c\uc81d\ud2b8 \uc774\ub984\uacfc \ub3d9\uc77c\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
-5={0} \ud30c\uc77c \uc774\ub984\uc744 \uc785\ub825\ud574\uc57c \ud569\ub2c8\ub2e4.
-6={0}\uc774(\uac00) \uc874\uc7ac\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.
-7=\ub0b4\ubd80 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4.  \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 \ub85c\uadf8 \ud30c\uc77c\uc744 \ucc38\uc870\ud558\uc2ed\uc2dc\uc624.
-8=\ud504\ub85c\uc81d\ud2b8 \uc774\ub984\uc774 \uc720\ud6a8\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.
-9=\ub300\uc0c1 \uc544\uce74\uc774\ube0c\ub294 {0}(\uc73c)\ub85c \ub05d\ub098\uc57c \ud569\ub2c8\ub2e4.
-10=\ub300\uc0c1 \uc544\uce74\uc774\ube0c\uac00 \uc720\ud6a8\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.
-11=\ub300\uc0c1 \uc704\uce58\ub294 \uc77d\uae30 \uc804\uc6a9\uc785\ub2c8\ub2e4.
-12=\uc790\uc6d0 {0}\uc774(\uac00) \uc774\ubbf8 \uc788\uc2b5\ub2c8\ub2e4. \uacb9\uccd0\uc4f0\ub824\ub294 \uacbd\uc6b0 "\uae30\uc874 \ud30c\uc77c \uacb9\uccd0\uc4f0\uae30" \uc635\uc158\uc744 \uc120\ud0dd\ud558\uc2ed\uc2dc\uc624.
-13={0} \ud504\ub85c\uc81d\ud2b8\uac00 \uc874\uc7ac\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.
-14=\uc120\ud0dd\ub41c J2EE \ud658\uacbd \uc124\uc815\uc758 \ucee4\ub125\ud130 \ud504\ub85c\uc81d\ud2b8\ub294 \uc9c0\uc6d0\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \uae00\ub85c\ubc8c J2EE \ud658\uacbd \uc124\uc815\uc744 \ud655\uc778\ud558\uc2ed\uc2dc\uc624.
-15=\ud504\ub85c\uc81d\ud2b8 \uc774\ub984\uc744 \uc785\ub825\ud558\uc2ed\uc2dc\uc624.
-16=\ubb38\uc81c\uc810 \uc800\uc7a5
-17=\uc800\uc7a5\uc744 \uc644\ub8cc\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.  \uc77c\ubd80 \uad00\ub828\ub41c \ud30c\uc77c\uc740 \uc774\ubbf8 \uc800\uc7a5\ub418\uc5c8\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n\uc774\uc720
-18={0}\uc774(\uac00) \uc7a0\uacbc\uc2b5\ub2c8\ub2e4. \uc870\uc791\uc744 \ud604\uc7ac \uc2e4\ud589 \uc911\uc774\uc9c0 \uc54a\uc740\uc9c0 \ud655\uc778\ud558\uc2ed\uc2dc\uc624.
-19=extendedRoot\uac00 \ub110(null)\uc785\ub2c8\ub2e4. isExtended()\uac00 true\ub97c \ub9ac\ud134\ud558\ub294\uc9c0 \ud655\uc778\ud558\uc2ed\uc2dc\uc624.
-20=\ud2b9\uc131\uc744 \ucc3e\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4:
-21=\uc911\ucca9\ub41c \ubaa8\ub378\uc744 \ucc3e\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4:
-22=id\uac00 \uc124\uc815\ub41c \uacbd\uc6b0 \uc218\uc815\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
-23=id\ub294 \ub110(null)\uc77c \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
-24=\uc624\ub958:
-25=\ud655\uc7a5 \uc870\uc791 \uc2e4\ud328: {0}
-26=\uc791\uc5c5\uc744 \uc644\ub8cc\ud588\uc2b5\ub2c8\ub2e4.
-27=\uc791\uc5c5 \uc2e4\ud589 \uc911 \uc608\uc678\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4.
-28=\uadf8\ub8f9\uc744 \ubd84\uc11d\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4:
-29={0} \uc18d\uc131\uc758 \ud074\ub798\uc2a4\ub97c \ucc3e\uc9c0 \ubabb\ud568 : {1}, \ud50c\ub7ec\uadf8\uc778 \ud655\uc7a5 \uc120\uc5b8: {2}
-30=\uae30\ub2a5 \uadf8\ub8f9 {0}\uc5d0\ub294 \ud328\ud134 \ubc14\uc778\ub529\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.
-31={0} \ud504\ub85c\uc81d\ud2b8\uac00 \ucc98\ub9ac\uc644\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-32=\ud504\ub85c\uc81d\ud2b8\uac00 \uc774\ubbf8 \ud30c\uc77c \uc2dc\uc2a4\ud15c\uc758 \ub2e4\uc74c \uc704\uce58\uc5d0 \uc788\uc2b5\ub2c8\ub2e4: {0}.  "\uae30\uc874 \ud504\ub85c\uc81d\ud2b8\ub97c \uc791\uc5c5\uacf5\uac04\uc73c\ub85c \uac00\uc838\uc624\uae30"\ub97c \uc120\ud0dd\ud558\uc5ec \uc774 \uc704\uce58\uc5d0 \uc0c8 \ud504\ub85c\uc81d\ud2b8\ub97c \uc791\uc131\ud558\uac70\ub098, \ud30c\uc77c \uc2dc\uc2a4\ud15c\uc5d0\uc11c {0}\uc758 \ucee8\ud150\uce20\ub97c \uc0ad\uc81c\ud558\uc2ed\uc2dc\uc624.
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/wtp_common_pt_BR.properties b/plugins/org.eclipse.wst.common.frameworks/src/wtp_common_pt_BR.properties
deleted file mode 100644
index 752f2a1..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/wtp_common_pt_BR.properties
+++ /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
-###############################################################################
-1=Um projeto j\u00e1 existe com este nome e local.
-2=O projeto EAR especificado "{0}" n\u00e3o \u00e9 um projeto EAR.
-3=O projeto EAR "{0}" possui uma J2EEVersion de {1} que n\u00e3o \u00e9 compat\u00edvel com a vers\u00e3o do m\u00f3dulo especificado.
-4=O nome do projeto EAR, "{0}", n\u00e3o pode ser o mesmo que o nome do projeto.
-5=O nome do arquivo {0} deve ser digitado.
-6=O arquivo {0} n\u00e3o existe.
-7=Ocorreu um erro interno. Visualize os arquivos de log para obter detalhes.
-8=O nome do projeto \u00e9 inv\u00e1lido.
-9=O arquivo de destino deve finalizar com {0}.
-10=O arquivo de destino \u00e9 inv\u00e1lido.
-11=O local de destino \u00e9 somente para leitura.
-12=O recurso {0} j\u00e1 existe.  Se voc\u00ea desejar sobrescrever, selecione a op\u00e7\u00e3o "Sobrescrever Arquivo Existente".
-13=O projeto {0} n\u00e3o existe.
-14=O projeto do conector n\u00e3o \u00e9 suportado para prefer\u00eancia J2EE selecionada. Verifique a prefer\u00eancia global J2EE.
-15=Digite um nome de projeto.
-16=Salvar problemas
-17=Salvamento n\u00e3o p\u00f4de ser conclu\u00eddo. Alguns arquivos relacionados podem j\u00e1 ter sido salvos.\n\n Motivo
-18={0} foi bloqueado. Verifique se a opera\u00e7\u00e3o n\u00e3o est\u00e1 executando no momento.
-19=O extendedRoot \u00e9 nulo. Verifique se o isExtended() retorna verdadeiro.
-20=Propriedade n\u00e3o localizada:
-21=Modelo aninhado n\u00e3o localizado:
-22=N\u00e3o \u00e9 poss\u00edvel modificar o id uma vez que j\u00e1 foi configurado.
-23=O id n\u00e3o pode ser nulo.
-24=ERRO:
-25=Falha na opera\u00e7\u00e3o estendida: {0}
-26=O Trabalho foi conclu\u00eddo com sucesso
-27=Ocorreu uma exce\u00e7\u00e3o ao executar o trabalho.
-28=O grupo n\u00e3o pode ser resolvido:
-29=A classe n\u00e3o foi localizada para o atributo {0} : {1}, Declarando extens\u00e3o de plug-in: {2}
-30=O grupo de fun\u00e7\u00e3o {0} n\u00e3o cont\u00e9m nenhuma liga\u00e7\u00e3o padr\u00e3o
-31=O projeto {0} est\u00e1 fechado.
-32=Um projeto j\u00e1 existe no sistema de arquivos neste local: {0}.  Use "Importar Projetos Existentes no Espa\u00e7o de Trabalho" para criar um projeto neste local ou exclua o conte\u00fado de {0} do sistema de arquivos.
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/wtp_common_zh_CN.properties b/plugins/org.eclipse.wst.common.frameworks/src/wtp_common_zh_CN.properties
deleted file mode 100644
index f4bf118..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/wtp_common_zh_CN.properties
+++ /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
-###############################################################################
-1=\u5177\u6709\u6b64\u540d\u79f0\u548c\u4f4d\u7f6e\u7684\u9879\u76ee\u5df2\u5b58\u5728\u3002
-2=\u6307\u5b9a\u7684 EAR \u9879\u76ee\u201c{0}\u201d\u4e0d\u662f EAR \u9879\u76ee\u3002
-3=EAR \u9879\u76ee\u201c{0}\u201d\u5177\u6709 {1}\uff08\u5b83\u4e0e\u6307\u5b9a\u7684\u6a21\u5757\u7248\u672c\u4e0d\u517c\u5bb9\uff09\u7684 J2EE \u7248\u672c\u3002
-4=EAR \u9879\u76ee\u540d\u79f0\u201c{0}\u201d\u4e0d\u80fd\u4e0e\u8be5\u9879\u76ee\u540d\u79f0\u76f8\u540c\u3002
-5=\u5fc5\u987b\u8f93\u5165 {0} \u6587\u4ef6\u540d\u3002
-6={0} \u4e0d\u5b58\u5728\u3002
-7=\u53d1\u751f\u4e86\u5185\u90e8\u9519\u8bef\u3002\u8bf7\u67e5\u770b\u65e5\u5fd7\u6587\u4ef6\u4ee5\u83b7\u53d6\u8be6\u7ec6\u4fe1\u606f\u3002
-8=\u9879\u76ee\u540d\u79f0\u65e0\u6548\u3002
-9=\u76ee\u6807\u5f52\u6863\u5e94\u8be5\u4ee5 {0} \u7ed3\u5c3e\u3002
-10=\u76ee\u6807\u5f52\u6863\u65e0\u6548\u3002
-11=\u76ee\u6807\u4f4d\u7f6e\u662f\u53ea\u8bfb\u7684\u3002
-12=\u8d44\u6e90 {0} \u5df2\u5b58\u5728\u3002\u5982\u679c\u60a8\u60f3\u8986\u76d6\uff0c\u8bf7\u9009\u62e9\u201c\u8986\u76d6\u73b0\u6709\u6587\u4ef6\u201d\u9009\u9879\u3002
-13=\u9879\u76ee {0} \u4e0d\u5b58\u5728\u3002
-14=\u8fde\u63a5\u5668\u9879\u76ee\u5bf9\u4e8e\u9009\u62e9\u7684 J2EE \u9996\u9009\u9879\u4e0d\u53d7\u652f\u6301\u3002\u8bf7\u68c0\u67e5\u5168\u5c40 J2EE \u9996\u9009\u9879\u3002
-15=\u8f93\u5165\u9879\u76ee\u540d\u79f0\u3002
-16=\u4fdd\u5b58\u95ee\u9898
-17=\u4fdd\u5b58\u4e0d\u80fd\u5b8c\u6210\u3002\u53ef\u80fd\u5df2\u7ecf\u4fdd\u5b58\u4e86\u67d0\u4e9b\u76f8\u5173\u6587\u4ef6\u3002\n\n\u539f\u56e0
-18={0} \u5df2\u9501\u5b9a\u3002\u8bf7\u786e\u4fdd\u5f53\u524d\u672a\u6267\u884c\u8be5\u64cd\u4f5c\u3002
-19=extendedRoot \u662f\u7a7a\u7684\u3002\u8bf7\u786e\u4fdd isExtended() \u8fd4\u56de true\u3002
-20=\u5c5e\u6027\u672a\u627e\u5230\uff1a
-21=\u5d4c\u5957\u7684\u6a21\u578b\u672a\u627e\u5230\uff1a
-22=\u4e00\u65e6\u8bbe\u7f6e\u4e86\u6807\u8bc6\u5c31\u4e0d\u80fd\u518d\u4fee\u6539\u5b83\u3002
-23=\u8be5\u6807\u8bc6\u4e0d\u80fd\u4e3a\u7a7a\u3002
-24=\u9519\u8bef\uff1a
-25=\u6269\u5c55\u7684\u64cd\u4f5c\u5931\u8d25\uff1a{0}
-26=\u4f5c\u4e1a\u6210\u529f\u5b8c\u6210
-27=\u8fd0\u884c\u4f5c\u4e1a\u65f6\u53d1\u751f\u5f02\u5e38\u3002
-28=\u4e0d\u80fd\u89e3\u6790\u7ec4\uff1a
-29=\u672a\u627e\u5230\u5c5e\u6027 {0} \u7684\u7c7b\uff1a{1}\uff0c\u58f0\u660e\u63d2\u4ef6\u6269\u5c55\uff1a{2}
-30=\u51fd\u6570\u7ec4 {0} \u672a\u5305\u542b\u6a21\u5f0f\u7ed1\u5b9a
-31=\u5173\u95ed\u4e86\u9879\u76ee {0}\u3002
-32=\u6587\u4ef6\u7cfb\u7edf\u4e0a\u5df2\u7ecf\u6709\u4e00\u4e2a\u9879\u76ee\u5b58\u5728\u4e8e\u6b64\u4f4d\u7f6e\uff1a{0}\u3002\u4f7f\u7528\u201c\u5bfc\u5165\u73b0\u6709\u9879\u76ee\u5230\u5de5\u4f5c\u7a7a\u95f4\u4e2d\u201d\u6765\u5728\u6b64\u4f4d\u7f6e\u521b\u5efa\u9879\u76ee\uff0c\u6216\u8005\u4ece\u6587\u4ef6\u7cfb\u7edf\u4e2d\u5220\u9664 {0} \u7684\u5185\u5bb9\u3002
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/wtp_common_zh_TW.properties b/plugins/org.eclipse.wst.common.frameworks/src/wtp_common_zh_TW.properties
deleted file mode 100644
index fcde968..0000000
--- a/plugins/org.eclipse.wst.common.frameworks/src/wtp_common_zh_TW.properties
+++ /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
-###############################################################################
-1=\u5df2\u6709\u9019\u500b\u540d\u7a31\u548c\u4f4d\u7f6e\u7684\u5c08\u6848\u5b58\u5728\u3002
-2=\u6307\u5b9a\u7684 EAR \u5c08\u6848 "{0}" \u4e0d\u662f EAR \u5c08\u6848\u3002
-3=EAR \u5c08\u6848 "{0}" \u7684 J2EE \u7248\u672c\u662f {1}\uff0c\u8207\u6307\u5b9a\u7684\u6a21\u7d44\u7248\u672c\u4e0d\u76f8\u5bb9\u3002
-4=EAR \u5c08\u6848\u540d\u7a31 "{0}" \u7121\u6cd5\u8207\u9019\u500b\u5c08\u6848\u540d\u7a31\u76f8\u540c\u3002
-5=\u5fc5\u9808\u8f38\u5165 {0} \u6a94\u540d\u7a31\u3002
-6={0} \u4e0d\u5b58\u5728\u3002
-7=\u767c\u751f\u5167\u90e8\u932f\u8aa4\u3002 \u8acb\u53c3\u95b1\u65e5\u8a8c\u6a94\uff0c\u4ee5\u53d6\u5f97\u8a73\u7d30\u8cc7\u6599\u3002
-8=\u5c08\u6848\u540d\u7a31\u7121\u6548\u3002
-9=\u76ee\u7684\u5730\u4fdd\u5b58\u6a94\u7684\u7d50\u5c3e\u61c9\u8a72\u662f {0}\u3002
-10=\u76ee\u7684\u5730\u4fdd\u5b58\u6a94\u7121\u6548\u3002
-11=\u76ee\u7684\u5730\u4f4d\u7f6e\u552f\u8b80\u3002
-12=\u8cc7\u6e90 {0} \u5df2\u5b58\u5728\u3002\u5982\u679c\u8981\u6539\u5beb\uff0c\u8acb\u9078\u53d6\u300c\u6539\u5beb\u73fe\u6709\u7684\u6a94\u6848\u300d\u9078\u9805\u3002
-13={0} \u5c08\u6848\u4e0d\u5b58\u5728\u3002
-14=\u4e0d\u652f\u63f4\u9023\u63a5\u5668\u5c08\u6848\u4f7f\u7528\u9078\u53d6\u7684 J2EE \u559c\u597d\u8a2d\u5b9a\u3002\u8acb\u6aa2\u67e5\u5ee3\u57df J2EE \u559c\u597d\u8a2d\u5b9a\u3002
-15=\u8acb\u8f38\u5165\u5c08\u6848\u540d\u7a31\u3002
-16=\u5132\u5b58\u554f\u984c
-17=\u5132\u5b58\u7121\u6cd5\u5b8c\u6210\u3002\u53ef\u80fd\u5df2\u5132\u5b58\u67d0\u4e9b\u76f8\u95dc\u7684\u6a94\u6848\u3002\n\n\u539f\u56e0
-18={0} \u5df2\u9396\u5b9a\u3002\u8acb\u78ba\u5b9a\u4f5c\u696d\u76ee\u524d\u4e0d\u5728\u57f7\u884c\u4e2d\u3002
-19=extendedRoot \u662f\u7a7a\u503c\u3002\u8acb\u78ba\u5b9a isExtended() \u50b3\u56de true\u3002
-20=\u627e\u4e0d\u5230\u5167\u5bb9\uff1a
-21=\u627e\u4e0d\u5230\u5de2\u72c0\u6a21\u578b\uff1a
-22=\u8a2d\u5b9a\u597d ID \u4e4b\u5f8c\uff0c\u5c31\u7121\u6cd5\u4fee\u6539 ID\u3002
-23=ID \u4e0d\u80fd\u662f\u7a7a\u503c\u3002
-24=\u932f\u8aa4\uff1a
-25=\u5ef6\u4f38\u7684\u4f5c\u696d\u5931\u6557\uff1a{0}
-26=\u5de5\u4f5c\u9806\u5229\u5b8c\u6210
-27=\u57f7\u884c\u5de5\u4f5c\u6642\uff0c\u767c\u751f\u7570\u5e38\u72c0\u6cc1\u3002
-28=\u7121\u6cd5\u89e3\u6790\u7fa4\u7d44\uff1a
-29=\u627e\u4e0d\u5230 {0} \u5c6c\u6027\u7684\u985e\u5225\uff1a{1}\uff0c\u5ba3\u544a\u5916\u639b\u7a0b\u5f0f\u5ef6\u4f38\uff1a{2}
-30=\u51fd\u6578\u7fa4\u7d44 {0} \u6c92\u6709\u5305\u542b\u4efb\u4f55\u578b\u6a23\u9023\u7d50
-31={0} \u5c08\u6848\u5df2\u95dc\u9589\u3002
-32=\u5c08\u6848\u5df2\u7d93\u5b58\u5728\u6a94\u6848\u7cfb\u7d71\u7684 {0} \u4f4d\u7f6e\u4e2d\u3002\u5229\u7528\u300c\u5c07\u73fe\u6709\u7684\u5c08\u6848\u653e\u5165\u5de5\u4f5c\u5340\u300d\u5728\u9019\u500b\u4f4d\u7f6e\u5efa\u7acb\u5c08\u6848\uff0c\u6216\u5f9e\u6a94\u6848\u7cfb\u7d71\u4e2d\u522a\u9664 {0} \u7684\u5167\u5bb9\u3002
diff --git a/plugins/org.eclipse.wst.common.modulecore/.classpath b/plugins/org.eclipse.wst.common.modulecore/.classpath
deleted file mode 100644
index 701ae8f..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/.classpath
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="modulecore-src">
-		<attributes>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
-		<attributes>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
-		<attributes>
-		</attributes>
-	</classpathentry>
-	<classpathentry sourcepath="ECLIPSE_HOME/plugins/org.eclipse.jdt.source_3.0.0/src/org.junit_3.8.1/junitsrc.zip" kind="var" path="JUNIT_HOME/junit.jar">
-		<attributes>
-		</attributes>
-	</classpathentry>
-	<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 95b4adf..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/.cvsignore
+++ /dev/null
@@ -1,5 +0,0 @@
-bin
-temp.folder
-build.xml
-modulecore.jar
-doc
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/build.properties b/plugins/org.eclipse.wst.common.modulecore/build.properties
deleted file mode 100644
index 4bba01c..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/build.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-source.modulecore.jar = modulecore-src/
-output.modulecore.jar = bin/
-bin.includes = plugin.xml,\
-               modulecore.jar
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 e11e2cf..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"/><package name="org.eclipse.wst.common.componentcore.datamodel.properties"></package></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 b5c1404..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/model/Java.properties
+++ /dev/null
@@ -1,418 +0,0 @@
-#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 29d6aa3..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/model/componentCore.ecore
+++ /dev/null
@@ -1,72 +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"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="referencedComponents" unique="false"
-        upperBound="-1" eType="#//ReferencedComponent"/>
-  </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"/>
-  </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 4f6460b..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/model/componentCore.genmodel
+++ /dev/null
@@ -1,51 +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"
-    runtimeCompatibility="false">
-  <foreignModel>componentCore.ecore</foreignModel>
-  <genPackages prefix="Componentcore" basePackage="org.eclipse.wst.common.componentcore.internal"
-      disposableProviderFactory="true" 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"/>
-    </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 f49ae97..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ArtifactEdit.java
+++ /dev/null
@@ -1,469 +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.componentcore;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IProgressMonitor;
-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.ComponentHandle;
-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
- * @since 1.0
- */
-public class ArtifactEdit implements IEditModelHandler {
-
-	public static final Class ADAPTER_TYPE = ArtifactEdit.class;
-	private final ArtifactEditModel artifactEditModel;
-	private boolean isReadOnly;
-	private boolean isArtifactEditModelSelfManaged;
-
-	/**
-	 * <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(ComponentHandle aHandle) {
-		ArtifactEdit artifactEdit = null;
-		try {
-			artifactEdit = new ArtifactEdit(aHandle, 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(ComponentHandle aHandle) {
-		ArtifactEdit artifactEdit = null;
-		try {
-			artifactEdit = new ArtifactEdit(aHandle, 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) {
-		/* The ComponentType must be non-null, and the moduleTypeId must be non-null */
-		if (aModule.getComponentTypeId() == null)
-			return false;
-		if (ModuleURIUtil.fullyQualifyURI(aModule.getProject(), aModule.getName()) == 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().findEditModelFactoryByKey(aModule.getComponentTypeId());
-		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}
-	 */
-	public ArtifactEdit(ModuleCoreNature aNature, IVirtualComponent aModule, boolean toAccessAsReadOnly) {
-		if (toAccessAsReadOnly)
-			artifactEditModel = aNature.getArtifactEditModelForRead(ModuleURIUtil.fullyQualifyURI(aModule.getProject(), aModule.getName()), this);
-		else
-			artifactEditModel = aNature.getArtifactEditModelForWrite(ModuleURIUtil.fullyQualifyURI(aModule.getProject(), aModule.getName()), 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(ComponentHandle aHandle, boolean toAccessAsReadOnly) throws IllegalArgumentException {
-
-		if (aHandle.getProject() == null || !aHandle.getProject().isAccessible())
-			throw new IllegalArgumentException("Invalid project specified by handle: " + aHandle.getProject());
-
-		ModuleCoreNature nature = ModuleCoreNature.getModuleCoreNature(aHandle.getProject());
-
-		if (nature == null)
-			throw new IllegalArgumentException("Project does not have ModuleCoreNature." + aHandle.getProject());
-
-		IVirtualComponent component = ComponentCore.createComponent(aHandle.getProject(),aHandle.getName());
-		if (component == null)
-			throw new IllegalArgumentException("Invalid component handle: " + aHandle);
-		if (!isValidEditableModule(component))
-			throw new IllegalArgumentException("Invalid component handle: " + aHandle);
-		URI componentURI = ModuleURIUtil.fullyQualifyURI(aHandle);
-
-		if (toAccessAsReadOnly)
-			artifactEditModel = nature.getArtifactEditModelForRead(componentURI, this);
-		else
-			artifactEditModel = nature.getArtifactEditModelForWrite(componentURI, this);
-		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.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 ComponentHandle - returns the handle of the underlying workbench component.
-	 */
-	public ComponentHandle getComponentHandle() {
-		
-		return getArtifactEditModel().getComponentHandle();
-	}
-
-	/**
-	 * @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();
-	}
-	
-	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;
-	}
-}
\ No newline at end of file
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 96c5877..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ComponentCore.java
+++ /dev/null
@@ -1,166 +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.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.FlexibleProject;
-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.IFlexibleProject;
-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>
- * 
- * @since 1.0
- */
-public class ComponentCore {
-
-	private static final IVirtualResource[] NO_RESOURCES = new VirtualResource[0];
-
-	/**
-	 * Return an IFlexibleProject that provides an entry-point to the components
-	 * stored within the given project. The returned IFlexibleProject may not contain
-	 * any components, which could mean that the supplied IProject is either not 
-	 * flexible or empty.  
-	 * 
-	 * @param aProject A valid, accessible IProject
-	 * @return A valid IFlexibleProject 
-	 */
-	public static IFlexibleProject createFlexibleProject(IProject aProject) {
-		return new FlexibleProject(aProject);
-	}
-
-	/**
-	 * 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
-	 * @param aComponentName A name to identify the component within the project. 
-	 * @return A handle to an IVirtualComponent that may or may not exist.
-	 * @see IVirtualContainer#create(int, IProgressMonitor) 
-	 */
-	public static IVirtualComponent createComponent(IProject aProject, String aComponentName) {
-		return new VirtualComponent(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 aComponentName A name to identify the component within the project. 
-	 * @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, String aComponentName, IPath aRuntimePath) {
-		return new VirtualFolder(aProject, aComponentName, 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 aComponentName A name to identify the component within the project. 
-	 * @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, String aComponentName, IPath aRuntimePath) {
-		return new VirtualFile(aProject, aComponentName, 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);		
-	} 
-
-	/**
-	 * 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);
-			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]
-							.getComponent().getName(), resources[i]
-							.getRuntimePath()));
-				else
-					foundResources.add(new VirtualFolder(proj, resources[i]
-							.getComponent().getName(), resources[i]
-							.getRuntimePath()));
-			}
-		} catch (UnresolveableURIException e) {
-			e.printStackTrace();
-		} finally {
-			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 cef9642..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/IEditModelHandler.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.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
- * @since 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();
-}
\ No newline at end of file
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 f45a1c1..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ModuleCoreNature.java
+++ /dev/null
@@ -1,490 +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.componentcore;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.resources.ICommand;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.IProjectNature;
-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.ProjectResourceSet;
-import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-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.ModuleURIUtil;
-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.integration.EditModelNature;
-
-/**
- * <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>.wtpmodules </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)
- * @since 1.0
- */
-public class ModuleCoreNature extends EditModelNature implements IProjectNature, IModuleConstants {
-
-	/**
-	 * <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.isAccessible())
-				return (ModuleCoreNature) aProject.getNature(IModuleConstants.MODULE_NATURE_ID);
-		} catch (CoreException e) {
-		}
-		return 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);
-			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) {
-		Map params = new HashMap();
-		params.put(ArtifactEditModelFactory.PARAM_MODULE_URI, aModuleURI);
-		return (ArtifactEditModel) getEditModelForRead(getArtifactEditModelId(aModuleURI), anAccessorKey, params);
-	}
-
-	/**
-	 * <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) {
-		Map params = new HashMap();
-		params.put(ArtifactEditModelFactory.PARAM_MODULE_URI, aModuleURI);
-		return (ArtifactEditModel) getEditModelForWrite(getArtifactEditModelId(aModuleURI), anAccessorKey, params);
-	}
-
-	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
-
-	}
-	
-	/**
-	 * @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) {
-	}
-
-	/**
-	 * <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();
-		addDeployableProjectBuilder();
-		addDependencyResolver();
-	}
-
-	protected String getPluginID() {
-		return MODULE_PLUG_IN_ID;
-	}
-
-	private void addDeployableProjectBuilder() throws CoreException {
-		IProjectDescription description = project.getDescription();
-		ICommand[] builderCommands = description.getBuildSpec();
-		boolean previouslyAdded = false;
-
-		for (int i = 0; i < builderCommands.length; i++) {
-			if (builderCommands[i].getBuilderName().equals(COMPONENT_STRUCTURAL_BUILDER_ID))
-				// builder already added no need to add again
-				previouslyAdded = true;
-			break;
-		}
-		if (!previouslyAdded) {
-			// builder not found, must be added
-			ICommand command = description.newCommand();
-			command.setBuilderName(COMPONENT_STRUCTURAL_BUILDER_ID);
-			ICommand[] updatedBuilderCommands = new ICommand[builderCommands.length + 1];
-			System.arraycopy(builderCommands, 0, updatedBuilderCommands, 1, builderCommands.length);
-			updatedBuilderCommands[0] = command;
-			description.setBuildSpec(updatedBuilderCommands);
-			project.setDescription(description, null);
-		}
-	}
-
-	private void addDependencyResolver() throws CoreException {
-		ProjectUtilities.addToBuildSpec(COMPONENT_STRUCTURAL_DEPENDENCY_RESOLVER_ID, getProject());
-	}
-
-	private String getArtifactEditModelId(URI aModuleURI) { 
-		StructureEdit editUtility = null;
-		try {
-			IProject project = StructureEdit.getContainingProject(aModuleURI);
-			editUtility = StructureEdit.getStructureEditForRead(project);
-			WorkbenchComponent module = editUtility.findComponentByName(ModuleURIUtil.getDeployedName(aModuleURI));
-			return module.getComponentType().getComponentTypeId();
-		} catch (UnresolveableURIException uurie) {
-			// Ignore
-		} finally {
-			if (editUtility != null)
-				editUtility.dispose();
-		}
-		return null;
-	}
-
-
-}
\ No newline at end of file
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 c97ffd9..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/UnresolveableURIException.java
+++ /dev/null
@@ -1,27 +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.componentcore;
-
-import org.eclipse.emf.common.util.URI;
-
-/**
- * <p>
- * Thrown whenever a URI cannot be appropriately resolved.
- * </p>
- *  
- * @since 1.0
- */
-public class UnresolveableURIException extends Exception {
-
-	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/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 dc5d54e..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IComponentCreationDataModelProperties.java
+++ /dev/null
@@ -1,67 +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.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
- * 
- * @since 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$
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IProjectComponentsBuilderDataModelProperties.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IProjectComponentsBuilderDataModelProperties.java
deleted file mode 100644
index d34bcad..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IProjectComponentsBuilderDataModelProperties.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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.componentcore.datamodel.properties;
-
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelProperties;
-/**
- * <p>
- * IProjectComponentsBuilderDataModelProperties supplies the properties to the IDataModel and 
- * associated DataModelProvider ProjectComponentsBuilderDataModelProvider used for 
- * the Project Component section of the ComponentStructuralBuilder. 
- * @see org.eclipse.wst.common.componentcore.internal.builder.ComponentStructuralBuilder
- * </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
- * 
- * @since 1.0
- */
-public interface IProjectComponentsBuilderDataModelProperties extends IDataModelProperties{
-	/**
-	 * Required, type String. The initializing builder will set this field to the name value of the 
-	 * project which is currently being built.
-	 */
-	public static final String PROJECT = "IProjectComponentsBuilderDataModelProperties.PROJECT"; //$NON-NLS-1$
-
-	/**
-	 * Required, type Integer. The initializing builder will set this field to the int value based on the build
-	 * kind passed to the IncrementalProjectBuilder
-	 * 
-	 * @see IncrementalProjectBuilder.FULL_BUILD
-	 * <li><code>FULL_BUILD</code>- indicates a full build.</li>
-	 * 
-	 * @see IncrementalProjectBuilder.INCREMENTAL_BUILD
-	 * <li><code>INCREMENTAL_BUILD</code>- indicates an incremental build.</li>
-	 * 
-	 * @see IncrementalProjectBuilder.AUTO_BUILD
-	 * <li><code>AUTO_BUILD</code>- indicates an automatically triggered
-	 */
-	public static final String BUILD_KIND = "IProjectComponentsBuilderDataModelProperties.BUILD_KIND"; //$NON-NLS-1$
-	/**
-	 * Required, type Integer. The initializing builder will set this field to the IResourceDelta value based on the delta
-	 * passed to the IncrementalProjectBuilder during a build call.  This field can be used along with the BUILD_KIND to 
-	 * create a more efficient builder
-	 * 
-	 * @see org.eclipse.core.resources.IResourceDelta
-	 */
-	public static final String PROJECT_DETLA = "IProjectComponentsBuilderDataModelProperties.PROJECT_DETLA"; //$NON-NLS-1$
-    
-    /**
-     * Populatd, type List. The initializing builder will set this field to a List of changed resources as calculated via a resource walker of 
-     * IResouceDelta provided on the project via the project builder framework.  This list will be a list of IResources.
-     */
-    public static final String CHANGED_RESOURCES_DELTA = "IProjectComponentsBuilderDataModelProperties.CHANGED_RESOURCES_DELTA"; //$NON-NLS-1$
-
-	/**
-	 * Required, type ComponentCore. The initializing builder will set this field to the ModuleCore associated
-	 * with the project which is currently being built.  This field can be used to retrieve information about components and their associated 
-	 * dependent components present in the current project.
-	 * 
-	 * @see org.eclipse.wst.common.componentcore.ComponentCore
-	 */
-	public static final String COMPONENT_CORE = "IProjectComponentsBuilderDataModelProperties.COMPONENT_CORE";
-
-    /**
-     * Populatd, type List. The initializing builder will set this field to a List of initialized ComponentStructuralBuilders.  
-     * This field represents builder IDataModel for all components present in the current project.
-     * @see org.eclipse.wst.common.frameworks.datamodel.IDataModel
-     * @see WorkbenchComponentBuilderDataModelProvider
-     */
-	public static final String COMPONENT_BUILDER_DM_LIST = "IProjectComponentsBuilderDataModelProperties.COMPONENT_BUILDER_DM_LIST"; //$NON-NLS-1$
-    /**
-     * Populatd, type List. The provider will populate this list of additional IDataModels for ReferencedComponentBjuilderDataModelProvider.  This list
-     * will handle all rebuilding that needs to be done during an incremental build. 
-     */
-    public static final String ADDITIONAL_REFERENCED_BUILDER_DM_LIST = "IProjectComponentsBuilderDataModelProperties.ADDITIONAL_DEPENDENT_BUILDER_DM_LIST"; //$NON-NLS-1$
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IReferencedComponentBuilderDataModelProperties.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IReferencedComponentBuilderDataModelProperties.java
deleted file mode 100644
index 44bd74d..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IReferencedComponentBuilderDataModelProperties.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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.componentcore.datamodel.properties;
-
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelProperties;
-
-/**
- * <p>
- * IReferencedComponentBuilderDataModelProperties supplies the properties to the IDataModel and 
- * associated DataModelProvider ReferencedComponentBuilderDataModelProvider used by the 
- * ComponentStructuralBuilderDependencyResolver 
- * @see org.eclipse.wst.common.componentcore.internal.builder.ComponentStructuralBuilderDependencyResolver
- * </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
- * 
- * @since 1.0
- */
-public interface IReferencedComponentBuilderDataModelProperties extends IDataModelProperties{
-    /**
-     * Required, type WorkbenchComponent. The initializing builder will set this field to the WorkbenchComponent value of the 
-     * Component which is referencing the DEPENDENT_COMPONENT
-     */
-    public static final String CONTAINING_WB_COMPONENT = "IReferencedComponentBuilderDataModelProperties.CONTAINING_WB_COMPONENT"; //$NON-NLS-1$
-
-    /**
-     * Required, type ReferencedComponent. This field represents a ReferencedComponent which has another 
-     * Component (namely the CONTAINING_WB_COMPONENT field) depends on.
-     * 
-     * @see org.eclipse.wst.common.componentcore.internal.ReferencedComponent
-     */
-    public static final String DEPENDENT_COMPONENT = "IReferencedComponentBuilderDataModelProperties.DEPENDENT_COMPONENT"; //$NON-NLS-1$
-    /**
-     * Calculated, type project relative IPath.  This represents the folder output container defined for the given CONTAINING_WB_COMPONENT.
-     */
-    public static final String OUTPUT_CONTAINER = "IReferencedComponentBuilderDataModelProperties.OUTPUT_CONTAINER"; //$NON-NLS-1$
-
-    /**
-     * Required, type WorkbenchComponent. This field represents a the actual WorkbenchComponent defined by
-     * the DEPENDENT_COMPONENT
-     * 
-     * @see org.eclipse.wst.common.componentcore.internal.WorkbenchComponent
-     */
-    public static final String DEPENDENT_WB_COMPONENT = "IReferencedComponentBuilderDataModelProperties.DEPENDENT_WB_COMPONENT"; //$NON-NLS-1$
-
-    /**
-     * Calc, type Boolean.  Represents property defined by the defining Containing CONTAINING_WB_COMPONENT.  
-     * Indicates the referenced component is either CONSUMED or USES by the referencing Component.
-     * @see DependencyType.CONSUMES
-     * @see DependencyType.USES
-     */
-    public static final String DOES_CONSUME = "IReferencedComponentBuilderDataModelProperties.DOES_CONSUME"; //$NON-NLS-1$
-    /**
-     * Required, type ComponentCore. The initializing builder will set this field to the ModuleCore associated
-     * with the project which is currently being built.  This field can be used to retrieve information about components and their associated 
-     * dependent components present in the current project.
-     * 
-     * @see org.eclipse.wst.common.componentcore.ComponentCore
-     */
-    public static final String COMPONENT_CORE = "IReferencedComponentBuilderDataModelProperties.COMPONENT_CORE"; //$NON-NLS-1$
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IWorkbenchComponentBuilderDataModelProperties.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IWorkbenchComponentBuilderDataModelProperties.java
deleted file mode 100644
index d2cf9be..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IWorkbenchComponentBuilderDataModelProperties.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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.componentcore.datamodel.properties;
-
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelProperties;
-
-/**
- * <p>
- * IWorkbenchComponentBuilderDataModelProperties supplies the properties to the IDataModel and 
- * associated DataModelProvider WorkbenchComponentBuilderDataModelProvider used by the 
- * ComponentStructuralBuilder.
- * @see org.eclipse.wst.common.componentcore.internal.builder.ComponentStructuralBuilder
- * </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
- * 
- * @since 1.0
- */
-public interface IWorkbenchComponentBuilderDataModelProperties extends IDataModelProperties{
-    /**
-     * Required, type String. The initializing builder will set this field to the name value of the 
-     * project which is currently being built.
-     */
-	public static final String PROJECT = "IWorkbenchComponentBuilderDataModelProperties.PROJECT"; //$NON-NLS-1$
-    /**
-     * Required, type project relative IFolder.  This represents the Folder output container defined for the given 
-     * WORKBENCH_COMPONENT.
-     */
-	public static final String OUTPUT_CONTAINER = "IWorkbenchComponentBuilderDataModelProperties.OUTPUT_CONTAINER"; //$NON-NLS-1$
-    /**
-     * Required, type WorkbenchComponent. The initializing builder will set this field to the WorkbenchComponent value of the 
-     * Component to be built.
-     */
-	public static final String WORKBENCH_COMPONENT = "IWorkbenchComponentBuilderDataModelProperties.WORKBENCH_MODULE_RESOURCES"; //$NON-NLS-1$
-	/**
-	 * Required, type List of DependentDeployableModuleDataModel  The initializing builder will set this field to a List of initialized DataModels for 
-     * the ReferencedComponentBuilderDataModelProvider.  
-     * This field represents builders (IDataModel( for all Referenced Components present in the current WorkbenchComponent.
-     * 
-     * @see org.eclipse.wst.common.frameworks.datamodel.IDataModel
-     * @see ReferencedComponentBuilderDataModelProvider
-     */
-	public static final String DEPENDENT_COMPONENT_DM_LIST = "IWorkbenchComponentBuilderDataModelProperties.DEPENDENT_COMPONENT_DM_LIST"; //$NON-NLS-1$
-    /**
-     * Required, type ComponentCore. The initializing builder will set this field to the ModuleCore associated
-     * with the project which is currently being built.  This field can be used to retrieve information about components and their associated 
-     * dependent components present in the current project.
-     * 
-     * @see org.eclipse.wst.common.componentcore.ComponentCore
-     */
-	public static final String COMPONENT_CORE = "IWorkbenchComponentBuilderDataModelProperties.COMPONENT_CORE";
-    /**
-     * Required, type Integer. The initializing builder will set this field to the int value based on the build
-     * kind passed to the IncrementalProjectBuilder
-     * 
-     * @see IncrementalProjectBuilder.FULL_BUILD
-     * <li><code>FULL_BUILD</code>- indicates a full build.</li>
-     * 
-     * @see IncrementalProjectBuilder.INCREMENTAL_BUILD
-     * <li><code>INCREMENTAL_BUILD</code>- indicates an incremental build.</li>
-     * 
-     * @see IncrementalProjectBuilder.AUTO_BUILD
-     * <li><code>AUTO_BUILD</code>- indicates an automatically triggered
-     */
-    public static final String BUILD_KIND_FOR_DEP = "IWorkbenchComponentBuilderDataModelProperties.BUILD_KIND_FOR_DEP"; //$NON-NLS-1$
-    
-}
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 2ca463b..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ArtifactEditModel.java
+++ /dev/null
@@ -1,282 +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.componentcore.internal;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IResource;
-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.jem.util.logger.proxy.Logger;
-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.resources.ComponentHandle;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
-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;
-
-/**
- * 
- * 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 {
-
-	private final ComponentHandle componentHandle; 
-	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);
-		componentHandle =  ComponentHandle.create(null, aModuleURI);
-		virtualComponent = ComponentCore.createComponent(componentHandle.getProject(), componentHandle.getName());
-		componentURI = aModuleURI;
-		modulePath = new Path(aModuleURI.path());
-		processLoadedResources(componentHandle);
-	}
-
-	/**
-	 * <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) {
-		IPath requestPath = modulePath.append(new Path(aUri.path()));
-		URI resourceURI = URI.createURI(PlatformURLModuleConnection.MODULE_PROTOCOL + requestPath.toString());
-		return super.getResource(resourceURI);
-	}
-
-	/**
-	 * <p>
-	 * Uses the cached moduleURI to query ModuleCore (@see ModuleCore) for the module type this
-	 * ArtifactEditModel represents. Module types can be found in IModuleConstants (@see
-	 * IModuleConstants).
-	 * </p>
-	 * 
-	 * <@return string reprentation of a module type i.e. "wst.web">
-	 */
-
-
-	public String getModuleType() {
-		return virtualComponent.getComponentTypeId();
-	}
-	public ComponentHandle getComponentHandle() { 
-		return componentHandle;
-	}
-
-	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) {
-
-		IPath requestPath = modulePath.append(new Path(aUri.path()));
-		URI resourceURI = URI.createURI(requestPath.toString());
-		return super.getOrCreateResource(resourceURI);
-	}
-
-	/**
-	 * <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(ComponentHandle aComponentHandle) {
-		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; 
- 
-		URI aResourceURI = null;
-		IResource resourceResource;
-		IVirtualResource[] resources;
-		for (int i = 0; i < size; i++) { 
-			resourceToProcess = (Resource) theResources.get(i);
-			aResourceURI = resourceToProcess.getURI();
-			resourceResource = WorkbenchResourceHelper.getFile(resourceToProcess);
-			if (resourceResource == null)
-				Logger.getLogger().logError("Error processing resource URI: " + resourceToProcess.getURI());
-			else {
-				resources = ComponentCore.createResources(resourceResource); 
-				for (int resourcesIndex = 0; resourcesIndex < resources.length; resourcesIndex++) {
-					if (virtualComponent.equals(resources[resourcesIndex].getComponent())) {
-						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);
-	}
-}
\ No newline at end of file
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 ef99b8f..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ComponentResource.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/**
- * <copyright></copyright>
- * 
- * $Id: ComponentResource.java,v 1.2 2005/04/05 03:35:37 cbridgha Exp $
- */
-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 --> 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);
-
-} // 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 4b53906..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ComponentType.java
+++ /dev/null
@@ -1,129 +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.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 1570430..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ComponentcorePackage.java
+++ /dev/null
@@ -1,711 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ComponentcorePackage.java,v 1.2 2005/04/05 03:35:37 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
- * @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>' 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>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORKBENCH_COMPONENT__REFERENCED_COMPONENTS = 3;
-
-	/**
-	 * 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 = 4;
-
-	/**
-	 * 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 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 = 3;
-
-	/**
-	 * 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 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 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 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 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 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 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 c26189c..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/DependencyType.java
+++ /dev/null
@@ -1,153 +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.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 --> <!-- 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 --> <!-- 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/ModuleStructuralModel.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleStructuralModel.java
deleted file mode 100644
index 6c36c63..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleStructuralModel.java
+++ /dev/null
@@ -1,105 +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.componentcore.internal;
-
-import java.io.IOException;
-import java.util.HashMap;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.Platform;
-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.emfworkbench.EMFWorkbenchContext;
-import org.eclipse.wst.common.internal.emfworkbench.integration.EditModel;
-/**
- * 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>.wtpmodules </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$ 
-  
-
-    public ModuleStructuralModel(String editModelID, EMFWorkbenchContext context, boolean readOnly) {
-        super(editModelID, context, readOnly);
-    }
-    
-    /* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emfworkbench.integration.EditModel#getPrimaryRootObject()
-	 */
-	public EObject getPrimaryRootObject() {
-		
-		EObject modelRoot = super.getPrimaryRootObject();
-		if(modelRoot == null) {
-			prepareProjectModulesIfNecessary();
-			return super.getPrimaryRootObject();
-		}
-		return modelRoot;
-	}
-       
-	public WTPModulesResource  makeWTPModulesResource() {
-		return (WTPModulesResource) createResource(WTPModulesResourceFactory.WTP_MODULES_URI_OBJ);
-	}
-
-	public Resource prepareProjectModulesIfNecessary() {
-
-		XMIResource res = (XMIResource) getPrimaryResource();
-		if(res == null)
-			res = makeWTPModulesResource();		
-		try {
-			addProjectModulesIfNecessary(res);
-		} catch (IOException e) {		
-			e.printStackTrace();
-		}
-		return res;
-	}
-	
-	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);
-			}
-		}
-	}
-}
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 9b343c4..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModulecorePlugin.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package org.eclipse.wst.common.componentcore.internal;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.IAdapterManager;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Plugin;
-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.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);
-		
-		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 200c5d5..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ProjectComponents.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
- **************************************************************************************************/
-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/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 578eb18..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ReferencedComponent.java
+++ /dev/null
@@ -1,128 +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.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>
- * </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);
-
-} // 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 c9af867..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/StructureEdit.java
+++ /dev/null
@@ -1,852 +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.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.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.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.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.util.EclipseResourceAdapter;
-import org.eclipse.wst.common.componentcore.resources.ComponentHandle;
-import org.eclipse.wst.common.componentcore.resources.IVirtualContainer;
-
-/**
- * <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 final String DEPLOYABLES_ROOT = ".deployables/"; //$NON-NLS-1$
-	static String MODULE_META_FILE_NAME = ".wtpmodules"; //$NON-NLS-1$
-
-	private final static ComponentcoreFactory COMPONENT_FACTORY = ComponentcoreFactory.eINSTANCE;
-	private static final WorkbenchComponent[] NO_MODULES = new WorkbenchComponent[0];
-	private static final ComponentResource[] NO_RESOURCES = new ComponentResource[0];
-	private static final IFolder[] NO_FOLDERS = new IFolder[0];
-
-
-	private final ModuleStructuralModel structuralModel;
-	private final Map dependentCores = new HashMap();
-	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
-	 */
-	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) {	
-		String projectName = aComponent.getHandle().segment(ModuleURIUtil.ModuleURI.PROJECT_NAME_INDX);
-		if (projectName == null || projectName.length() == 0)
-			return null;
-		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
-		if (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>
-	 * Returns a URI for the supplied {@see WorkbenchComponent}. The URI will be relative to
-	 * project root of the flexible project that contains the {@see WorkbenchComponent}.
-	 * </p>
-	 * <p>
-	 * <b>This method may return null. </b>
-	 * </p>
-	 * 
-	 * @param aWorkbenchModule
-	 *            A valid WorkbenchComponent
-	 * @return A project-relative URI of the output folder for aWorkbenchModoule.
-	 */
-	public static IFolder getOutputContainerRoot(WorkbenchComponent aWorkbenchModule) {
-		IProject project = getContainingProject(aWorkbenchModule); 
-		if (project != null)
-			return project.getFolder(new Path(DEPLOYABLES_ROOT + aWorkbenchModule.getName()));
-		return null;
-	}
-
-	/**
-	 * <p>
-	 * Returns a collection of the output containers for the supplied project. The collection may be
-	 * a single root output container or an array of output containers without a common root. For
-	 * clients that are looking for an output container for a specific {@see WorkbenchComponent},
-	 * see {@see #getOutputContainerRoot(WorkbenchComponent)}.
-	 * </p>
-	 * <p>
-	 * If the project is not a ModuleCore project, or has no ModuleCore output containers, an empty
-	 * array will be returned.
-	 * </p>
-	 * 
-	 * @param aProject
-	 *            A project with a {@see ModuleCoreNature}
-	 * @return An array of output containers or an empty array.
-	 */
-	public static IFolder[] getOutputContainersForProject(IProject aProject) {
-		ModuleCoreNature moduleCoreNature = ModuleCoreNature.getModuleCoreNature(aProject);
-		if (moduleCoreNature == null)
-			return NO_FOLDERS;
-		IFolder folder = aProject.getFolder(new Path(DEPLOYABLES_ROOT));
-		IFolder[] outputResources = {folder};
-		return outputResources;
-	}
-
-	/**
-	 * <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) {
-		StructureEdit componentCore = null;
-		ComponentType componentType = null;
-		try {
-			componentCore = StructureEdit.getStructureEditForRead(aComponent.getProject());
-			WorkbenchComponent wbComponent = componentCore.findComponentByName(aComponent.getComponent().getName());
-			componentType = wbComponent.getComponentType();
-		} finally {
-			if (componentCore != null)
-				componentCore.dispose();
-		}
-		return componentType;
-	}
-
-	public static void setComponentType(IVirtualContainer component, ComponentType aComponentType) {
-		StructureEdit componentCore = null;
-		try {
-			componentCore = StructureEdit.getStructureEditForWrite(component.getProject());
-			WorkbenchComponent wbComponent = componentCore.findComponentByName(component.getComponent().getName());
-			wbComponent.setComponentType(aComponentType);
-		} finally {
-			if (componentCore != null) {
-				componentCore.saveIfNecessary(null);
-				componentCore.dispose();
-			}
-		}
-	}
-
-	protected StructureEdit(ModuleCoreNature aNature, boolean toAccessAsReadOnly) {
-		if (toAccessAsReadOnly)
-			structuralModel = aNature.getModuleStructuralModelForRead(this);
-		else
-			structuralModel = aNature.getModuleStructuralModelForWrite(this);
-		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;
-	}
-
-	/**
-	 * <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();
-		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();
-		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)
-			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() {
-		structuralModel.prepareProjectModulesIfNecessary();
-	}
-
-	/**
-	 * <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() {
-		return (ProjectComponents) structuralModel.getPrimaryRootObject();
-	}
-
-	/**
-	 * <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 = getComponentModelRoot().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 = findComponentByName(ModuleURIUtil.getDeployedName(aModuleURI));
-		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 = findComponentByName(aModuleName);
-		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 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
-	 * @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();
-		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()
-	 */
-	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 findComponentByName(aModuleURI.segment(0));
-		ModuleURIUtil.ensureValidFullyQualifiedModuleURI(aModuleURI);
-		String projectName = aModuleURI.segment(ModuleURIUtil.ModuleURI.PROJECT_NAME_INDX);
-		String moduleName = aModuleURI.segment(ModuleURIUtil.ModuleURI.MODULE_NAME_INDX);
-		/* Accessing a local module */
-		if (structuralModel.getProject().getName().equals(projectName)) {
-			return findComponentByName(moduleName);
-		}
-		return getDependentModuleCore(aModuleURI).findComponentByName(moduleName);
-	}
-
-	/**
-	 * <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 containingProject = getContainingProject(aComponent);
-		IProject referencedProject = getContainingProject(aReferencedComponent);
-		
-		EList referencedComponents = aComponent.getReferencedComponents();
-		 
-		for (Iterator iter = referencedComponents.iterator(); iter.hasNext();) {
-			ReferencedComponent referencedComponent = (ReferencedComponent) iter.next();
-			ComponentHandle referencedHandle = ComponentHandle.create(containingProject, referencedComponent.getHandle());
-			if(referencedProject.equals(referencedHandle.getProject()) && 
-				aReferencedComponent.getName().equals(referencedHandle.getName())) 
-				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) {
-		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 = structuralModel.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() {
-		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);
-	}
-}
\ No newline at end of file
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 3690268..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/WorkbenchComponent.java
+++ /dev/null
@@ -1,132 +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.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>
- * </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>' 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>' reference.
-	 * @see #setComponentType(ComponentType)
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentcorePackage#getWorkbenchComponent_ComponentType()
-	 * @model required="true"
-	 * @generated
-	 */
-	ComponentType getComponentType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.wst.common.componentcore.internal.WorkbenchComponent#getComponentType <em>Component Type</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Component Type</em>' reference.
-	 * @see #getComponentType()
-	 * @generated
-	 */
-	void setComponentType(ComponentType value);
-
-	/**
-	 * Returns the value of the '<em><b>Referenced Components</b></em>' 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>' reference list.
-	 * @see org.eclipse.wst.common.componentcore.internal.ComponentcorePackage#getWorkbenchComponent_ReferencedComponents()
-	 * @model type="org.eclipse.wst.common.componentcore.internal.ReferencedComponent"
-	 * @generated
-	 */
-	EList getReferencedComponents();
-
-	URI getHandle();
-
-	ComponentResource[] findResourcesByRuntimePath(IPath aDeployPath);
-	
-	ComponentResource[] findResourcesBySourcePath(IPath aSourcePath, int resourceFlag);
-
-} // WorkbenchComponent
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/ComponentStructuralBuilder.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/ComponentStructuralBuilder.java
deleted file mode 100644
index cc90032..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/ComponentStructuralBuilder.java
+++ /dev/null
@@ -1,221 +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.componentcore.internal.builder;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.internal.resources.Resource;
-import org.eclipse.core.internal.resources.Workspace;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IMarker;
-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.IncrementalProjectBuilder;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.componentcore.UnresolveableURIException;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IProjectComponentsBuilderDataModelProperties;
-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.util.IModuleConstants;
-import org.eclipse.wst.common.componentcore.resources.ComponentHandle;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-
-public class ComponentStructuralBuilder extends IncrementalProjectBuilder implements IModuleConstants, IProjectComponentsBuilderDataModelProperties {
-    /**
-     * Builder id of this incremental project builder.
-     */
-    public static final String BUILDER_ID = COMPONENT_STRUCTURAL_BUILDER_ID;
-    
-    public static List changedResources = null;
-    /**
-     *  
-     */
-    public ComponentStructuralBuilder() {
-        super();
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.core.internal.events.InternalBuilder#build(int,
-     *      java.util.Map, org.eclipse.core.runtime.IProgressMonitor)
-     */
-    protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException {
-        changedResources = new ArrayList();
-        
-        IResourceDelta buildDelta = getDelta(getProject());
-        if(buildDelta != null && kind != CLEAN_BUILD) {
-            processDelta(buildDelta, monitor);
-        }
-        StructureEdit moduleCore = null;
-        
-        // clean markers
-		IResource wtpmoduleFile = getProject().findMember(".wtpmodules"); //$NON-NLS-1$
-		if(wtpmoduleFile != null)
-			wtpmoduleFile.deleteMarkers(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE); 
-
-        IDataModel builderDataModel = DataModelFactory.createDataModel(new ProjectComponentsBuilderDataModelProvider());
-        try {
-            moduleCore = StructureEdit.getStructureEditForRead(getProject());
-            builderDataModel.setProperty(COMPONENT_CORE, moduleCore);
-            builderDataModel.setIntProperty(BUILD_KIND, kind);
-            builderDataModel.setProperty(PROJECT_DETLA, buildDelta);
-            builderDataModel.setProperty(CHANGED_RESOURCES_DELTA, changedResources);
-            builderDataModel.setProperty(PROJECT, getProject());
-            IUndoableOperation op = builderDataModel.getDefaultOperation();
-            if (op != null)
-                op.execute(monitor, null);
-        } catch (ExecutionException e) {
-            Logger.getLogger().log(e.getMessage());
-        } finally {
-            if (null != moduleCore) {
-                moduleCore.dispose();
-            }
-        }
-        return null;
-    }
-    /**
-     * Process an incremental build delta.
-     * 
-     * @return <code>true</code> if the delta requires a copy
-     * @param dest
-     *            the destination folder; may or may not exist
-     * @param monitor
-     *            the progress monitor, or <code>null</code> if none
-     * @exception CoreException
-     *                if something goes wrong
-     */
-    protected void processDelta(IResourceDelta delta, final IProgressMonitor monitor) {
-        IResourceDeltaVisitor visitor = new IResourceDeltaVisitor() {
-
-            public boolean visit(IResourceDelta subdelta) throws CoreException {
-                IResource resource = subdelta.getResource();
-                if (resource.getType() == IResource.FILE || resource.getType() == IResource.FOLDER) {
-                        int kind = subdelta.getKind();
-                        switch (kind) {
-                            case IResourceDelta.ADDED :
-                            case IResourceDelta.CHANGED :
-                                addChangedResourceIfLeaf(resource, subdelta);
-                                break;
-                            case IResourceDelta.REMOVED :
-                               // deleteCorrespondingFile((IFile) resource, classesFolder, outputFolder, monitor);
-                                break;
-                            case IResourceDelta.ADDED_PHANTOM :
-                                break;
-                            case IResourceDelta.REMOVED_PHANTOM :
-                                break;
-                        }
-                }
-                return true;
-            }
-
-            private void addChangedResourceIfLeaf(IResource file, IResourceDelta delta) {
-                IResourceDelta[] children = delta.getAffectedChildren();
-                if(children == null || children.length == 0)
-                    changedResources.add(file);
-            }
-        };
-        if (delta != null) {
-            try {
-                delta.accept(visitor);
-            } catch (CoreException e) {
-                // should not happen
-            }
-        }
-    }
-
-    protected void clean(IProgressMonitor monitor) throws CoreException {
-        IFolder[] oldOutput = StructureEdit.getOutputContainersForProject(getProject());
-        if(oldOutput != null) {
-            for(int i = 0; i < oldOutput.length; i++) {
-                if(oldOutput[i].exists())
-                    oldOutput[i].delete(true, monitor);
-            }
-        }
-        cleanDepGraph();
-        super.clean(monitor);
-    }
-    private void cleanDepGraph() {
-            ComponentHandle componentHandle;
-            ComponentHandle referencingComponentHandle;
-            
-            IProject referencingProject = getProject();
-            StructureEdit sEdit = null;
-            IProject refedProject = null;
-            try {
-                sEdit = StructureEdit.getStructureEditForRead(getProject());
-                WorkbenchComponent[] wbComps = sEdit.getWorkbenchModules();
-                for(int i = 0; i<wbComps.length; i++){
-                    referencingComponentHandle = ComponentHandle.create(referencingProject, wbComps[i].getName());
-                    List refedComps = wbComps[i].getReferencedComponents();
-                    for(int j = 0; j<refedComps.size(); j++) {
-                        refedProject = StructureEdit.getContainingProject(((ReferencedComponent)refedComps.get(j)).getHandle());
-                        if(refedProject != null) {
-                            componentHandle = ComponentHandle.create(refedProject, ((ReferencedComponent)refedComps.get(j)).getHandle());
-                            DependencyGraph.getInstance().removeReference(componentHandle, referencingComponentHandle);
-                        }
-                    }
-                }
-
-            } catch (UnresolveableURIException e) {
-                Logger.getLogger().log(e.getMessage());
-            } finally {
-                if (null != sEdit) {
-                    sEdit.dispose();
-                }
-            }
-
-    }
-    /**
-     * @param sourceResource
-     * @param absoluteInputContainer
-     * @param monitor
-     * @throws CoreException
-     */
-    //TODO this is a bit sloppy; there must be existing API somewhere.
-    public static void smartCopy(IResource sourceResource, IPath absoluteOutputContainer, NullProgressMonitor monitor) throws CoreException {
-        Resource targetResource = ((Workspace) ResourcesPlugin.getWorkspace()).newResource(absoluteOutputContainer, sourceResource.getType());
-        if (!targetResource.exists()) {
-            sourceResource.copy(absoluteOutputContainer, true, monitor);
-        } else if (resourceHasChanged(sourceResource)){
-            if(targetResource.exists())
-                targetResource.delete(IResource.FORCE, monitor);
-            sourceResource.copy(absoluteOutputContainer, true, monitor);            
-        }  else if (sourceResource.getType() == Resource.FOLDER) {
-            IFolder folder = (IFolder) sourceResource;
-            IResource[] members = folder.members();
-            for (int i = 0; i < members.length; i++) {
-                smartCopy(members[i], absoluteOutputContainer.append(IPath.SEPARATOR + members[i].getName()), monitor);
-            }
-        } else {
-            //TODO present a warning to the user about duplicate resources
-        }
-    }
-
-    private static boolean resourceHasChanged(IResource targetResource) {
-        for(int i = 0; i<changedResources.size(); i++){
-            if(targetResource.equals(changedResources.get(i)))
-                return true;
-        }
-        return false;
-    }
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/ComponentStructuralBuilderDependencyResolver.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/ComponentStructuralBuilderDependencyResolver.java
deleted file mode 100644
index 6b48626..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/ComponentStructuralBuilderDependencyResolver.java
+++ /dev/null
@@ -1,73 +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.componentcore.internal.builder;
-
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IReferencedComponentBuilderDataModelProperties;
-import org.eclipse.wst.common.componentcore.internal.StructureEdit;
-import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-
-public class ComponentStructuralBuilderDependencyResolver extends IncrementalProjectBuilder implements IModuleConstants {
-    /**
-     * Builder id of this incremental project builder.
-     */
-    public static final String BUILDER_ID = COMPONENT_STRUCTURAL_DEPENDENCY_RESOLVER_ID;
-
-    /**
-     *  
-     */
-    public ComponentStructuralBuilderDependencyResolver() {
-        super();
-        // TODO Auto-generated constructor stub
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.core.internal.events.InternalBuilder#build(int,
-     *      java.util.Map, org.eclipse.core.runtime.IProgressMonitor)
-     */
-    protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException {
-        StructureEdit moduleCore = null;
-        try {
-            List delayedOperationDMs = ReferencedComponentBuilderDelayedDataModelCache.getInstance().getCacheList();
-            if (delayedOperationDMs.size() > 0) {
-                moduleCore = StructureEdit.getStructureEditForRead(getProject());
-            }
-            IDataModel dataModel = null;
-            IUndoableOperation op = null;
-            for (int i = 0; i < delayedOperationDMs.size(); i++) {
-                dataModel = (IDataModel) delayedOperationDMs.get(i);
-                dataModel.setProperty(IReferencedComponentBuilderDataModelProperties.COMPONENT_CORE, moduleCore);
-                op = dataModel.getDefaultOperation();
-                if (op != null) {
-                    op.execute(monitor, null);
-                }
-            }
-        } catch (ExecutionException e) {
-            Logger.getLogger().log(e.getMessage());
-        } finally {
-            if (moduleCore != null) {
-                moduleCore.dispose();
-            }
-            ReferencedComponentBuilderDelayedDataModelCache.getInstance().clearCache();
-        }
-        return null;
-    }
-}
\ No newline at end of file
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 8a27619..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraph.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.componentcore.internal.builder;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.wst.common.componentcore.resources.ComponentHandle;
-
-public class DependencyGraph {
-	
-	private static final DependencyGraph INSTANCE = new DependencyGraph();
-	
-	private final Map dependencies = new HashMap();
-	
-	public static DependencyGraph getInstance() {
-		return INSTANCE;
-	}
-
-	public ComponentHandle[] getReferencingComponents(ComponentHandle target) {
-		Set referencingComponents = internalGetReferencingComponents(target);
-		return (ComponentHandle[]) referencingComponents.toArray(new ComponentHandle[referencingComponents.size()]);
-	}
-	
-	public void addReference(ComponentHandle target, ComponentHandle referencingComponent) {
-		internalGetReferencingComponents(target).add(referencingComponent);
-	}
-	
-	public void removeReference(ComponentHandle target, ComponentHandle referencingComponent) {
-		internalGetReferencingComponents(target).remove(referencingComponent);
-		
-	}
-	
-	protected Set internalGetReferencingComponents(ComponentHandle target) {
-		Set referencingComponents = (Set) dependencies.get(target);
-		if(referencingComponents == null) 
-			dependencies.put(target, (referencingComponents = new HashSet()));
-		return referencingComponents;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/ProjectComponentsBuilderDataModelProvider.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/ProjectComponentsBuilderDataModelProvider.java
deleted file mode 100644
index 234d50a..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/ProjectComponentsBuilderDataModelProvider.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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.componentcore.internal.builder;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Stack;
-
-import org.eclipse.core.internal.events.ResourceDelta;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.UnresolveableURIException;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IProjectComponentsBuilderDataModelProperties;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IReferencedComponentBuilderDataModelProperties;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IWorkbenchComponentBuilderDataModelProperties;
-import org.eclipse.wst.common.componentcore.internal.ComponentType;
-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.util.IModuleConstants;
-import org.eclipse.wst.common.componentcore.resources.ComponentHandle;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
-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.enablement.DataModelEnablementFactory;
-
-public class ProjectComponentsBuilderDataModelProvider extends AbstractDataModelProvider implements IProjectComponentsBuilderDataModelProperties {
-
-    /* (non-Javadoc)
-     * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider#getPropertyNames()
-     */
-    public String[] getPropertyNames() {
-        return new String[]{PROJECT, BUILD_KIND, PROJECT_DETLA, CHANGED_RESOURCES_DELTA, ADDITIONAL_REFERENCED_BUILDER_DM_LIST, COMPONENT_CORE, COMPONENT_BUILDER_DM_LIST};
-    }
-    public void init() {
-        super.init();
-        model.setProperty(ADDITIONAL_REFERENCED_BUILDER_DM_LIST, new ArrayList());
-        model.setIntProperty(BUILD_KIND, IncrementalProjectBuilder.FULL_BUILD);
-    }
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel#doSetProperty(java.lang.String,
-	 *      java.lang.Object)
-	 */
-	public boolean propertySet(String propertyName, Object propertyValue) {
-		if (PROJECT.equals(propertyName)) {
-			model.setProperty(COMPONENT_BUILDER_DM_LIST, populateModuleBuilderDataModelList());
-            if(model.getIntProperty(BUILD_KIND) == (IncrementalProjectBuilder.INCREMENTAL_BUILD) && model.isPropertySet(CHANGED_RESOURCES_DELTA)){
-                createAdditionalBuildersIfNecessary();
-            }
-		}
-		return true;
-	}
-	/**
-	 * @return
-	 */
-	private Object populateModuleBuilderDataModelList() {
-		List moduleDMList = null;
-		switch (model.getIntProperty(BUILD_KIND)) {
-            case IncrementalProjectBuilder.CLEAN_BUILD :	
-            case IncrementalProjectBuilder.FULL_BUILD :
-				moduleDMList = populateFullModuleBuilderDataModelList();
-				break;
-			case IncrementalProjectBuilder.INCREMENTAL_BUILD :
-				moduleDMList = populateDeltaModuleBuilderDataModelList((ResourceDelta) getProperty(PROJECT_DETLA));
-                break;
-			default :
-				moduleDMList = populateFullModuleBuilderDataModelList();
-				break;
-		}
-		return moduleDMList;
-	}
-    
-	private void createAdditionalBuildersIfNecessary() {
-        List deltaResources = (List)model.getProperty(CHANGED_RESOURCES_DELTA);
-        IVirtualResource[] vResources = null;
-        for(int i = 0; i<deltaResources.size(); i++) {
-            vResources = ComponentCore.createResources((IResource)deltaResources.get(i));
-            createAdditionalBuildersForVResoures(vResources);
-        }
-    }
-    
-    private void createAdditionalBuildersForVResoures(IVirtualResource[] resources) {
-        IVirtualComponent vReferencedComponent;
-        IProject project;
-        ComponentHandle referencedComponentHandle;
-        ComponentHandle[] referencingComponentHandles;
-        for (int i = 0; i < resources.length; i++) {
-            vReferencedComponent = resources[i].getComponent();
-            referencedComponentHandle = ComponentHandle.create(vReferencedComponent.getProject(), vReferencedComponent.getName());
-            referencingComponentHandles = DependencyGraph.getInstance().getReferencingComponents(referencedComponentHandle);
-            for (int j = 0; j < referencingComponentHandles.length; j++) {
-                StructureEdit sEdit = null;
-                try {
-                    sEdit = StructureEdit.getStructureEditForRead(vReferencedComponent.getProject());
-                    WorkbenchComponent referencedWBComponent = sEdit.findComponentByName(referencedComponentHandle.getName());
-                    WorkbenchComponent referencingWBComponent = sEdit.findComponentByName(referencingComponentHandles[j].getName());
-                    ReferencedComponent referencedComponent = sEdit.findReferencedComponent(referencingWBComponent, referencedWBComponent);
-                    createAdditionalReferencedBuilders(referencingWBComponent, referencedComponent);
-                } finally {
-                    if(sEdit != null)
-                        sEdit.dispose();
-                    sEdit = null;
-                }
-            }        
-        }
-    }
-    private void createAdditionalReferencedBuilders(WorkbenchComponent containingWBComponent, ReferencedComponent depComponent) {
-        List depModulesDataModels = (List)model.getProperty(ADDITIONAL_REFERENCED_BUILDER_DM_LIST);
-        IDataModel dependentDataModel = null;
-        StructureEdit moduleCore = (StructureEdit)model.getProperty(COMPONENT_CORE);
-        IProject project = (IProject)model.getProperty(PROJECT);
-        dependentDataModel = DataModelEnablementFactory.createDataModel(IModuleConstants.DEPENDENT_MODULE + ".builder", project);
-        if(dependentDataModel != null) {
-            dependentDataModel.setProperty(IReferencedComponentBuilderDataModelProperties.COMPONENT_CORE, moduleCore);
-            dependentDataModel.setProperty(IReferencedComponentBuilderDataModelProperties.CONTAINING_WB_COMPONENT, containingWBComponent);
-            dependentDataModel.setProperty(IReferencedComponentBuilderDataModelProperties.DEPENDENT_COMPONENT, depComponent);
-            depModulesDataModels.add(dependentDataModel);
-        }
-        model.setProperty(ADDITIONAL_REFERENCED_BUILDER_DM_LIST, dependentDataModel);
-    }
-
-    /**
-	 * Sorts the wbModules such that the returned list
-	 * 
-	 * @param wbModule
-	 * @param sortedModuleList
-	 * @param wbModuleList
-	 * @return
-	 * @throws UnresolveableURIException
-	 */
-	private List computeModuleBuildOrder(WorkbenchComponent wbModule, List sortedModuleList, List wbModuleList, Stack callStack) throws UnresolveableURIException {
-		if (callStack.contains(wbModule)) {
-			//TODO do something meaningful with this.
-			throw new RuntimeException("Cyclical module dependency detected.");
-		}
-		try {
-			callStack.push(wbModule);
-			EList depModules = wbModule.getReferencedComponents();
-			for (int i = 0; i < depModules.size(); i++) {
-				ReferencedComponent depModule = (ReferencedComponent) depModules.get(i);
-				if (((StructureEdit) model.getProperty(COMPONENT_CORE)).isLocalDependency(depModule)) {
-					WorkbenchComponent depWBModule = ((StructureEdit) model.getProperty(COMPONENT_CORE)).findComponentByURI(depModule.getHandle());
-					if (!sortedModuleList.contains(depWBModule)) {
-						computeModuleBuildOrder(depWBModule, sortedModuleList, null, callStack);
-					}
-				}
-			}
-			if (!sortedModuleList.contains(wbModule)) {
-				sortedModuleList.add(wbModule);
-			}
-			if (null != wbModuleList && !wbModuleList.isEmpty()) {
-				wbModule = (WorkbenchComponent) wbModuleList.remove(wbModuleList.size() - 1);
-				return computeModuleBuildOrder(wbModule, sortedModuleList, wbModuleList, callStack);
-			}
-			return sortedModuleList;
-		} finally {
-			callStack.pop();
-		}
-	}
-
-	/**
-	 * Returns the list of WorkbenchModules in a sorted build order
-	 * 
-	 * @param wbModules
-	 * @return
-	 */
-	private List computeModuleBuildOrder(WorkbenchComponent[] wbModules) {
-		ArrayList unsortedList = new ArrayList(wbModules.length - 1);
-		for (int i = 1; i < wbModules.length; i++) {
-			unsortedList.add(wbModules[i]);
-		}
-		WorkbenchComponent firstModule = wbModules[0];
-        if(firstModule == null) return null;
-		List sortedList = new ArrayList(wbModules.length);
-		try {
-			sortedList = computeModuleBuildOrder(firstModule, sortedList, unsortedList, new Stack());
-			//			for(int i=0;i<sortedList.size(); i++){
-			//				System.out.println(sortedList.get(i));
-			//			}
-		} catch (UnresolveableURIException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		return sortedList;
-	}
-
-
-	private List populateFullModuleBuilderDataModelList() {
-		StructureEdit moduleCore = (StructureEdit) model.getProperty(COMPONENT_CORE);
-		List moduleBuilderDataModelList = new ArrayList();
-		WorkbenchComponent[] wbModules = moduleCore.getWorkbenchModules();
-
-		if (wbModules == null || wbModules.length == 0) {
-			return null;
-		}
-
-		List sortedList = computeModuleBuildOrder(wbModules);
-        if(sortedList == null) return moduleBuilderDataModelList;
-        IDataModel dataModel = null;
-        IProject curProject = (IProject)model.getProperty(PROJECT);
-		
-        String builderType = null;
-        for (int i = 0; i < sortedList.size(); i++) {
-			WorkbenchComponent wbComponent = (WorkbenchComponent) sortedList.get(i);
-            ComponentType type = wbComponent.getComponentType();
-            if(type == null)
-                break;
-			String typeId = type.getComponentTypeId();
-			if (typeId == null)
-				break;
-            builderType = typeId + ".builder";
-			dataModel = DataModelEnablementFactory.createDataModel(builderType, curProject);
-            if(dataModel != null) {
-                dataModel.setProperty(IWorkbenchComponentBuilderDataModelProperties.BUILD_KIND_FOR_DEP, model.getProperty(BUILD_KIND));
-    			dataModel.setProperty(IWorkbenchComponentBuilderDataModelProperties.COMPONENT_CORE, moduleCore);
-    			dataModel.setProperty(IWorkbenchComponentBuilderDataModelProperties.PROJECT, model.getProperty(PROJECT));
-    			dataModel.setProperty(IWorkbenchComponentBuilderDataModelProperties.WORKBENCH_COMPONENT, wbComponent);
-    			moduleBuilderDataModelList.add(dataModel);
-            }
-		}
-		return moduleBuilderDataModelList;
-	}
-    
-	private List populateDeltaModuleBuilderDataModelList(ResourceDelta delta) {
-		//TODO: handle delta information correcty
-		return populateFullModuleBuilderDataModelList();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel#getDefaultOperation()
-	 */
-	public IDataModelOperation getDefaultOperation() {
-		return new ProjectComponentsBuilderOperation(model);
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/ProjectComponentsBuilderOperation.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/ProjectComponentsBuilderOperation.java
deleted file mode 100644
index 4085700..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/ProjectComponentsBuilderOperation.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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.componentcore.internal.builder;
-
-import java.util.List;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IProjectComponentsBuilderDataModelProperties;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IWorkbenchComponentBuilderDataModelProperties;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-
-public class ProjectComponentsBuilderOperation extends AbstractDataModelOperation implements IProjectComponentsBuilderDataModelProperties {
-    /**
-     * @param model
-     */
-    public ProjectComponentsBuilderOperation(IDataModel model) {
-        super(model);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.commands.operations.IUndoableOperation#execute(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
-     */
-    public IStatus execute(IProgressMonitor monitor, IAdaptable info) {
-        try {
-            List deployableModuleDM = (List)model.getProperty(COMPONENT_BUILDER_DM_LIST);
-            IUndoableOperation op = null;
-            if(deployableModuleDM == null) return OK_STATUS;
-            for(int i = 0; i < deployableModuleDM.size(); i++){
-                IDataModel moduleDM = (IDataModel)deployableModuleDM.get(i);
-                
-                List depModuleList = (List)moduleDM.getProperty(IWorkbenchComponentBuilderDataModelProperties.DEPENDENT_COMPONENT_DM_LIST);
-                IDataModel depModuleDM;
-                for(int j = 0; j < depModuleList.size(); j++){
-                	depModuleDM = (IDataModel)depModuleList.get(j);
-                	ReferencedComponentBuilderDelayedDataModelCache.getInstance().addToCache(depModuleDM);
-                }
-                op = moduleDM.getDefaultOperation();
-                op.execute(monitor, null);
-            }
-            List additionalDepModels = (List)model.getProperty(ADDITIONAL_REFERENCED_BUILDER_DM_LIST);
-            IDataModel additionalDepModuleDM;
-            for(int k = 0; k < additionalDepModels.size(); k++) {
-                additionalDepModuleDM = (IDataModel)additionalDepModels.get(k);
-                ReferencedComponentBuilderDelayedDataModelCache.getInstance().addToCache(additionalDepModuleDM);
-            }
-        } catch (ExecutionException e) {
-            Logger.getLogger().log(e.getMessage());
-        }
-        return OK_STATUS;
-    }
-
-    /* (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) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.commands.operations.IUndoableOperation#undo(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
-     */
-    public IStatus undo(IProgressMonitor monitor, IAdaptable info) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/ReferencedComponentBuilderDataModelProvider.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/ReferencedComponentBuilderDataModelProvider.java
deleted file mode 100644
index 5e927c7..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/ReferencedComponentBuilderDataModelProvider.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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.componentcore.internal.builder;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.wst.common.componentcore.UnresolveableURIException;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IReferencedComponentBuilderDataModelProperties;
-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.frameworks.datamodel.AbstractDataModelProvider;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
-
-public class ReferencedComponentBuilderDataModelProvider extends AbstractDataModelProvider implements IReferencedComponentBuilderDataModelProperties {
-
-    /* (non-Javadoc)
-     * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider#getPropertyNames()
-     */
-    public String[] getPropertyNames() {
-        return new String[]{CONTAINING_WB_COMPONENT, DEPENDENT_COMPONENT, DEPENDENT_WB_COMPONENT, DOES_CONSUME, COMPONENT_CORE, OUTPUT_CONTAINER};
-    }
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelProvider#doSetProperty(java.lang.String,
-     *      java.lang.Object)
-     */
-    public boolean propertySet(String propertyName, Object propertyValue) {
-        if (propertyName.equals(DEPENDENT_COMPONENT)) {
-            model.setProperty(OUTPUT_CONTAINER, getOutputContainerValue());
-            model.setProperty(DOES_CONSUME, getDoesConsumeValue());
-            model.setProperty(DEPENDENT_WB_COMPONENT, getWorkBenchModuleValue());
-        }
-        return true;
-    }
-
-    private WorkbenchComponent getWorkBenchModuleValue() {
-        if (!model.isPropertySet(DEPENDENT_COMPONENT))
-            return null;
-        StructureEdit localCore = (StructureEdit) model.getProperty(COMPONENT_CORE);
-        try {
-            if (localCore != null)
-                return localCore.findComponentByURI(((ReferencedComponent) model.getProperty(DEPENDENT_COMPONENT)).getHandle());
-        } catch (UnresolveableURIException e) {
-        }
-        return null;
-    }
-
-    private Object getOutputContainerValue() {
-        if (!model.isPropertySet(DEPENDENT_COMPONENT))
-            return null;
-        ReferencedComponent depModule = (ReferencedComponent) model.getProperty(DEPENDENT_COMPONENT);;
-        return depModule.getRuntimePath();
-    }
-
-    private URI getHandleValue() {
-        if (!model.isPropertySet(DEPENDENT_COMPONENT))
-            return null;
-        return ((ReferencedComponent) model.getProperty(DEPENDENT_COMPONENT)).getHandle();
-    }
-
-    /**
-     * @return
-     */
-    private Boolean getDoesConsumeValue() {
-        if (!model.isPropertySet(DEPENDENT_COMPONENT))
-            return null;
-        ReferencedComponent depModule = (ReferencedComponent) model.getProperty(DEPENDENT_COMPONENT);
-        DependencyType depType = depModule.getDependencyType();
-        if (depType.getValue() == DependencyType.CONSUMES)
-            return Boolean.TRUE;
-        return Boolean.FALSE;
-    }
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelProvider#getDefaultOperation()
-	 */
-	public IDataModelOperation getDefaultOperation() {
-	    return new ReferencedComponentBuilderOperation(model);
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/ReferencedComponentBuilderDelayedDataModelCache.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/ReferencedComponentBuilderDelayedDataModelCache.java
deleted file mode 100644
index 83f8e3b..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/ReferencedComponentBuilderDelayedDataModelCache.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.componentcore.internal.builder;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-
-public class ReferencedComponentBuilderDelayedDataModelCache {
-	private static ReferencedComponentBuilderDelayedDataModelCache instance;
-	private List list = new ArrayList();
-
-	private ReferencedComponentBuilderDelayedDataModelCache() {
-		super();
-	}
-	
-	public List getCacheList() {
-		return list;
-	}
-	
-	public void addToCache(IDataModel dataModel) {
-		list.add(dataModel);
-	}
-	
-	public void clearCache() {
-	    list.clear();
-	}
-	                                       
-	public static ReferencedComponentBuilderDelayedDataModelCache getInstance() {
-		if (instance == null)
-			instance = new ReferencedComponentBuilderDelayedDataModelCache();
-		return instance;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/ReferencedComponentBuilderOperation.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/ReferencedComponentBuilderOperation.java
deleted file mode 100644
index 131fc02..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/ReferencedComponentBuilderOperation.java
+++ /dev/null
@@ -1,289 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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.componentcore.internal.builder;
-
-import java.io.IOException;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-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.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.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IReferencedComponentBuilderDataModelProperties;
-import org.eclipse.wst.common.componentcore.internal.StructureEdit;
-import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
-import org.eclipse.wst.common.componentcore.internal.util.ZipFileExporter;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.internal.emfworkbench.integration.EMFWorkbenchEditPlugin;
-
-public class ReferencedComponentBuilderOperation extends AbstractDataModelOperation implements IReferencedComponentBuilderDataModelProperties {
-	private static String ERROR_EXPORTING_MSG = "Zip Error Message"; //$NON-NLS-1$
-
-	private ZipFileExporter exporter = null;
-
-	private List errorTable = new ArrayList(1); // IStatus
-
-	private boolean useCompression = true;
-
-	// private boolean createLeadupStructure = false;
-	private boolean generateManifestFile = false;
-
-	private IProgressMonitor monitor;
-
-	private int inputContainerSegmentCount;
-    /**
-     * @param model
-     */
-    public ReferencedComponentBuilderOperation(IDataModel model) {
-        super(model);
-        
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.commands.operations.IUndoableOperation#execute(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
-     */
-    public IStatus execute(IProgressMonitor monitor, IAdaptable info) {
-        try {
-            this.monitor = monitor;
-			IPath absoluteOutputContainer = getAbsoluteOutputContainer();
-			// create output container folder if it does not exist
-			IFolder outputContainerFolder = createFolder(absoluteOutputContainer);
-			IPath absoluteInputContainer = getAbsoluteInputContainer();
-	
-			if (absoluteOutputContainer == null || absoluteInputContainer == null)
-				return OK_STATUS;
-	
-			if (model.getBooleanProperty(DOES_CONSUME)) {
-				// if consumes simply copy resources to output directory
-				IResource sourceResource = getResource(absoluteInputContainer);
-				if (sourceResource == null)
-					return OK_STATUS;
-				ComponentStructuralBuilder.smartCopy(sourceResource, absoluteOutputContainer, new NullProgressMonitor());
-			} else {
-				String zipName = getZipFileName();
-				IPath zipNameDestination = absoluteOutputContainer.append(zipName);
-				IResource dependentZip = getResource(zipNameDestination);
-				//TODO: this is needed to stop the copying of large dependent module.  Incremental build in M4 should allow for this
-				//code to be removed.
-				if(dependentZip == null || dependentZip.exists()) return OK_STATUS;
-				zipAndCopyResource(getResource(absoluteInputContainer), dependentZip);
-				getResource(absoluteOutputContainer).refreshLocal(IResource.DEPTH_INFINITE, monitor);
-			}
-		
-        } catch (CoreException ex) {
-            Logger.getLogger().log(ex.getMessage());
-        }
-        return OK_STATUS;
-    }
-
-    /* (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) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.commands.operations.IUndoableOperation#undo(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
-     */
-    public IStatus undo(IProgressMonitor monitor, IAdaptable info) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-	/**
-	 * @param inputResource
-	 * @param zipName
-	 * @return
-	 */
-	private void zipAndCopyResource(IResource inputResource, IResource outputResource) {
-		try {
-			String osPath = outputResource.getLocation().toOSString();
-			exporter = new ZipFileExporter(osPath, true);
-			inputContainerSegmentCount = inputResource.getFullPath().segmentCount();
-			exportResource(inputResource);
-			exporter.finished();
-		} catch (IOException ioEx) {
-            ioEx.printStackTrace();
-		} catch (InterruptedException iEx){		 
-            iEx.printStackTrace();
-		}
-	}
-
-	/**
-	 * @return
-	 */
-	private IPath getAbsoluteOutputContainer() {
-		WorkbenchComponent workbenchModule = (WorkbenchComponent) model.getProperty(CONTAINING_WB_COMPONENT);
-		IFolder localWorkbenchModuleOuptutContainer = null;
-		if (workbenchModule != null)
-			localWorkbenchModuleOuptutContainer = StructureEdit.getOutputContainerRoot(workbenchModule);
-
-		IPath localWorkbenchModuleOuptutContainerPath = localWorkbenchModuleOuptutContainer.getFullPath();
-		IPath deployPath = (IPath) model.getProperty(OUTPUT_CONTAINER);
-		return localWorkbenchModuleOuptutContainerPath.append(deployPath.toString()); 
-	}
-
-	/**
-	 * @return
-	 */
-	private IPath getAbsoluteInputContainer() {
-		WorkbenchComponent depWBModule = (WorkbenchComponent) model.getProperty(DEPENDENT_WB_COMPONENT);
-		if (depWBModule != null)
-			return StructureEdit.getOutputContainerRoot(depWBModule).getFullPath();
-		return null;
-	}
-
-	private String getZipFileName() {
-		WorkbenchComponent depWBModule = (WorkbenchComponent) model.getProperty(DEPENDENT_WB_COMPONENT);
-		String typeID = depWBModule.getComponentType().getComponentTypeId();
-		String zipFileName = depWBModule.getName();
-		zipFileName = zipFileName.replace('.', '_');
-		if(typeID == null) return zipFileName;
-		if(typeID.equals(IModuleConstants.JST_APPCLIENT_MODULE) || typeID.equals(IModuleConstants.JST_EJB_MODULE) || typeID.equals(IModuleConstants.JST_UTILITY_MODULE))
-		    return zipFileName + ".jar";
-		else if(typeID.equals(IModuleConstants.JST_WEB_MODULE))
-		    return zipFileName + ".war";
-		else if(typeID.equals(IModuleConstants.JST_CONNECTOR_MODULE))
-		    return zipFileName + ".rar";
-		else if(typeID.equals(IModuleConstants.JST_EAR_MODULE))
-		    return zipFileName + ".ear";
-		return zipFileName;
-	}
-
-	/**
-	 * Get resource for given absolute path
-	 * 
-	 * @exception com.ibm.itp.core.api.resources.CoreException
-	 */
-	private IResource getResource(IPath absolutePath) throws CoreException {
-		IResource resource = null;
-		if (absolutePath != null && !absolutePath.isEmpty()) {
-			resource = ResourcesPlugin.getWorkspace().getRoot().getFolder(absolutePath);
-			if (resource == null || !(resource instanceof IFolder)) {
-				resource = ResourcesPlugin.getWorkspace().getRoot().getFile(absolutePath);
-			}
-		}
-		return resource;
-	}
-
-	/**
-	 * Create a folder for given absolute path
-	 * 
-	 * @exception com.ibm.itp.core.api.resources.CoreException
-	 */
-	public IFolder createFolder(IPath absolutePath) throws CoreException {
-		if (absolutePath == null || absolutePath.isEmpty())
-			return null;
-		IFolder folder = ResourcesPlugin.getWorkspace().getRoot().getFolder(absolutePath);
-		// check if the parent is there
-		IContainer parent = folder.getParent();
-		if (parent != null && !parent.exists() && (parent instanceof IFolder))
-			createFolder(parent.getFullPath());
-		if (!folder.exists())
-			folder.create(true, true, new NullProgressMonitor());
-		return folder;
-	}
-
-	/**
-	 * Export the passed resource to the destination .zip
-	 * 
-	 * @param resource
-	 *            org.eclipse.core.resources.IResource
-	 * @param depth -
-	 *            the number of resource levels to be included in the path including the resourse
-	 *            itself.
-	 */
-	protected boolean exportResource(IResource resource) throws InterruptedException {
-		if (!resource.isAccessible())
-			return false;
-
-		if (resource.getType() == IResource.FILE) {
-			return writeResource(resource);
-		} else {
-			IResource[] children = null;
-
-			try {
-				children = ((IContainer) resource).members();
-			} catch (CoreException e) {
-				// this should never happen because an #isAccessible check is
-				// done before #members is invoked
-				addError(format(ERROR_EXPORTING_MSG, new Object[]{resource.getFullPath()}), e); //$NON-NLS-1$
-			}
-
-			boolean writeFolder = true;
-			for (int i = 0; i < children.length; i++) {
-				writeFolder = !exportResource(children[i]) && writeFolder;
-			}
-			if (writeFolder) {
-				writeResource(resource);
-			}
-			return true;
-
-		}
-	}
-
-	private boolean writeResource(IResource resource) throws InterruptedException {
-		// if (resource.isDerived())
-		// return false;
-		String destinationName;
-		IPath fullPath = resource.getFullPath();
-		destinationName = fullPath.removeFirstSegments(inputContainerSegmentCount).toString();
-		monitor.subTask(destinationName);
-
-		try {
-			if (resource.getType() == IResource.FILE)
-				exporter.write((IFile) resource, destinationName);
-			else
-				exporter.writeFolder(destinationName);
-		} catch (IOException e) {
-			addError(format(ERROR_EXPORTING_MSG, //$NON-NLS-1$
-						new Object[]{resource.getFullPath().makeRelative(), e.getMessage()}), e);
-			return false;
-		} catch (CoreException e) {
-			addError(format(ERROR_EXPORTING_MSG, //$NON-NLS-1$
-						new Object[]{resource.getFullPath().makeRelative(), e.getMessage()}), e);
-			return false;
-		}
-
-		monitor.worked(1);
-		return true;
-	}
-
-	/**
-	 * @param ERROR_EXPORTING_MSG
-	 * @param objects
-	 * @return
-	 */
-	private String format(String pattern, Object[] arguments) {
-		return MessageFormat.format(pattern, arguments);
-	}
-
-	/**
-	 * Add a new entry to the error table with the passed information
-	 */
-	protected void addError(String message, Throwable e) {
-		errorTable.add(new Status(IStatus.ERROR, EMFWorkbenchEditPlugin.ID, 0, message, e));
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/WorkbenchComponentBuilderCache.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/WorkbenchComponentBuilderCache.java
deleted file mode 100644
index 661ed73..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/WorkbenchComponentBuilderCache.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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.componentcore.internal.builder;
-
-import java.util.HashMap;
-
-
-public class WorkbenchComponentBuilderCache {
-    private HashMap extensionMap = new HashMap();
-    /**
-     * 
-     */
-    public WorkbenchComponentBuilderCache() {
-        super();
-    }
-    
-    public  void addComponentStructrualBuilderForID(WorkbenchComponentBuilderDataModelProvider builderInstance, String componentID){
-        extensionMap.put(componentID, builderInstance);
-    }
-
-    public WorkbenchComponentBuilderDataModelProvider getAvailableComponentStructuralBuilderForID(String componentID) {
-        if(extensionMap.containsKey(componentID))
-            return (WorkbenchComponentBuilderDataModelProvider)extensionMap.get(componentID);
-        return null;
-    }
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/WorkbenchComponentBuilderDataModelProvider.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/WorkbenchComponentBuilderDataModelProvider.java
deleted file mode 100644
index 54a57d6..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/WorkbenchComponentBuilderDataModelProvider.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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.componentcore.internal.builder;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.componentcore.UnresolveableURIException;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IReferencedComponentBuilderDataModelProperties;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IWorkbenchComponentBuilderDataModelProperties;
-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.util.IModuleConstants;
-import org.eclipse.wst.common.componentcore.resources.ComponentHandle;
-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.enablement.DataModelEnablementFactory;
-
-public abstract class WorkbenchComponentBuilderDataModelProvider extends AbstractDataModelProvider implements IWorkbenchComponentBuilderDataModelProperties{
-    
-     /* (non-Javadoc)
-     * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider#getPropertyNames()
-     */
-    public String[] getPropertyNames() {
-        return new String[]{PROJECT, OUTPUT_CONTAINER, PROJECT, WORKBENCH_COMPONENT, DEPENDENT_COMPONENT_DM_LIST, COMPONENT_CORE, BUILD_KIND_FOR_DEP};
-    }
-    /* (non-Javadoc)
-     * @see org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel#doSetProperty(java.lang.String, java.lang.Object)
-     */
-    public boolean propertySet(String propertyName, Object propertyValue) {
-        if(propertyName.equals(WORKBENCH_COMPONENT)) {
-        	model.setProperty(OUTPUT_CONTAINER, populateOutputContainer());
-        	model.setProperty(DEPENDENT_COMPONENT_DM_LIST, populateDependentModulesDM());
-            if(model.isPropertySet(BUILD_KIND_FOR_DEP))
-                updateDepGraphIfNecessary();
-        } else if(propertyName.equals(BUILD_KIND_FOR_DEP) && model.isPropertySet(WORKBENCH_COMPONENT)) {
-            updateDepGraphIfNecessary();
-        } 
-        return true;
-    }
-
-    private void updateDepGraphIfNecessary() {
-        if(model.getIntProperty(BUILD_KIND_FOR_DEP) != IncrementalProjectBuilder.INCREMENTAL_BUILD) {
-            ComponentHandle componentHandle;
-            ComponentHandle refComponentHandle;
-            IProject project = null;
-            
-            IProject refProject = (IProject)model.getProperty(PROJECT);
-            WorkbenchComponent wbModule = (WorkbenchComponent)model.getProperty(WORKBENCH_COMPONENT);
-            List depModules = wbModule.getReferencedComponents();
-            
-            for(int i = 0; i<depModules.size(); i++){
-                project = null;
-                refComponentHandle = ComponentHandle.create(refProject, wbModule.getName());
-                
-                try {
-                    project = StructureEdit.getContainingProject(((ReferencedComponent)depModules.get(i)).getHandle());
-                } catch (UnresolveableURIException e) {
-                    Logger.getLogger().log(e.getMessage());
-                }
-                
-                if(project != null) {
-                    componentHandle = ComponentHandle.create(project, ((ReferencedComponent)depModules.get(i)).getHandle());
-                    DependencyGraph.getInstance().addReference(componentHandle, refComponentHandle);
-                }
-            }
-        }
-    }
-
-    private Object populateDependentModulesDM() {
-        WorkbenchComponent wbModule = (WorkbenchComponent)model.getProperty(WORKBENCH_COMPONENT);
-        List depModules = wbModule.getReferencedComponents();
-        List depModulesDataModels = new ArrayList();
-        IDataModel dependentDataModel = null;
-        StructureEdit moduleCore = (StructureEdit)model.getProperty(COMPONENT_CORE);
-        IProject project = (IProject)model.getProperty(PROJECT);
-        for(int i = 0; i<depModules.size(); i++){
-            dependentDataModel = DataModelEnablementFactory.createDataModel(IModuleConstants.DEPENDENT_MODULE + ".builder", project);
-            if(dependentDataModel != null) {
-                dependentDataModel.setProperty(IReferencedComponentBuilderDataModelProperties.COMPONENT_CORE, moduleCore);
-                dependentDataModel.setProperty(IReferencedComponentBuilderDataModelProperties.CONTAINING_WB_COMPONENT, getProperty(WORKBENCH_COMPONENT));
-                dependentDataModel.setProperty(IReferencedComponentBuilderDataModelProperties.DEPENDENT_COMPONENT, depModules.get(i));
-                depModulesDataModels.add(dependentDataModel);
-            }
-        }
-        return depModulesDataModels;
-    }
-
-    /**
-     * @return
-     */
-    private Object populateOutputContainer() {
-        WorkbenchComponent wbModule = (WorkbenchComponent)model.getProperty(WORKBENCH_COMPONENT);
-        IFolder outputContainer = null;
-        if(wbModule != null)
-        	outputContainer = StructureEdit.getOutputContainerRoot(wbModule);
-        return outputContainer;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel#getDefaultOperation()
-     */
-    public abstract IDataModelOperation getDefaultOperation();
-
-}
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 e96a36a..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, 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.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, 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 1a54e1d..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ComponentCoreURIConverter.java
+++ /dev/null
@@ -1,118 +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.componentcore.internal.impl;
-
-import java.io.IOException;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-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.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;
-	
-	/**
-	 *  
-	 */
-	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;
-	} 
- 
-	
-	/* (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, componentName);
-
-			URI deployPathSegment = ModuleURIUtil.trimToDeployPathSegment(aNewURI);
-			IVirtualFile newFile = component.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) {
-				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.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 8aa7232..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ComponentResourceImpl.java
+++ /dev/null
@@ -1,424 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ComponentResourceImpl.java,v 1.2 2005/04/05 03:35:37 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.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 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;
-	}
-	
-
-} //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 013449d..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ComponentcoreFactoryImpl.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ComponentcoreFactoryImpl.java,v 1.1 2005/04/04 07:04:59 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.*;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class ComponentcoreFactoryImpl extends EFactoryImpl implements ComponentcoreFactory {
-	/**
-	 * Creates and 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 25d2d40..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ComponentcorePackageImpl.java
+++ /dev/null
@@ -1,594 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ComponentcorePackageImpl.java,v 1.2 2005/04/05 03:35:37 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 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 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);
-
-		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);
-
-		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);
-
-		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);
-
-		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 3bfe3ab..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/IModuleStructureListener.java
+++ /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
- **************************************************************************************************/
-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/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 3de4ea8..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, 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.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 973bd47..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, 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.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 14b8738..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ModuleStructureEvent.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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 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 22b0c76..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ModuleURIUtil.java
+++ /dev/null
@@ -1,159 +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.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.ComponentHandle;
-
-/**
- * 
- * <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;
-
-	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(); 
-		return aFullyQualifiedModuleResourcePath.deresolve(aFullyQualifiedModuleResourcePath.trimSegments(segmentCount - 4));
-	}
-
-	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, String aComponentName) {
-		return URI.createURI(RESOURCE_URI_PROTOCOL + aProject.getName() + IPath.SEPARATOR + aComponentName);
-	}
-
-	public static URI fullyQualifyURI(ComponentHandle aHandle) {
-		return fullyQualifyURI(aHandle.getProject(), aHandle.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 5d322f2..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/PlatformURLModuleConnection.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * 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.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.IVirtualFile;
-
-/**
- * @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, componentName);
-			IVirtualFile vFile = component.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 c8246eb..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ProjectComponentsImpl.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ProjectComponentsImpl.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 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 (!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 5f4e020..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ReferencedComponentImpl.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ReferencedComponentImpl.java,v 1.1 2005/04/04 07:04:59 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.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.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>
- * </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;
-
-	/**
-	 * <!-- 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 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();
-		}
-		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;
-		}
-		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;
-		}
-		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;
-		}
-		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/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 997582b..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ResourceTreeNode.java
+++ /dev/null
@@ -1,263 +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.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.IFile;
-import org.eclipse.core.resources.IFolder;
-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 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 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;
-			IResource foundResource = null;
-			IContainer eclipseContainer = null;
-			Set resultSet = new HashSet();
-			for (Iterator resourceIter = moduleResources.iterator(); resourceIter.hasNext();) {
-				moduleResource = (ComponentResource) resourceIter.next();
-				if(moduleResource.getRuntimePath() != null) {
-					eclipseResource = StructureEdit.getEclipseResource(moduleResource);
-					
-					if (eclipseResource != null && eclipseResource.getType() == IResource.FOLDER) {
-						eclipseContainer = (IContainer) eclipseResource;
-				 
-						IPath runtimeURI = moduleResource.getRuntimePath().append(aPath);
-						
-						// check for existing subpath in tree
-						ComponentResource newResource = 
-							findExistingComponentResource(moduleResource.getComponent(), runtimeURI);
-						
-						if(newResource == null) {
-							// flesh out the tree
-							newResource = ComponentcorePackage.eINSTANCE.getComponentcoreFactory().createComponentResource();
-							if ((toCreateResourceAlways) || (foundResource = eclipseContainer.findMember(aPath)) != null) {
-								newResource.setComponent(moduleResource.getComponent());		
-								
-								newResource.setRuntimePath(runtimeURI);
-								newResource.setSourcePath(eclipseContainer.getProjectRelativePath().append(aPath));
-								resultSet.add(newResource);
-							}
-						}
-					}
-		
-				}
-			}
-			return resultSet.size() > 0 ? resultSet : Collections.EMPTY_SET;
-		}
-		return Collections.EMPTY_SET;
-	}
-
-	private ComponentResource findExistingComponentResource(WorkbenchComponent component, IPath runtimeURI) { 
-		List resources = component.getResources();
-		for (Iterator iter = resources.iterator(); iter.hasNext();) {
-			ComponentResource element = (ComponentResource) iter.next();
-			if(runtimeURI.equals(element.getRuntimePath()))
-				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 cc7a704..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, 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.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 11da1fb..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, 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.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 293d653..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, 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.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 1fa6864..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, 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.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.RendererFactory;
-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.
-			RendererFactory.getDefaultRendererFactory().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 fe43bb4..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WTPModulesResource.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
- *******************************************************************************/ 
-package org.eclipse.wst.common.componentcore.internal.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.impl.ResourceImpl;
-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;
-	}
-//	 
-//	 
-//	// temporary for debugging not to be released. 
-//	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);
-//			}
-//		};
-//	}
-}
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 752dcf6..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WTPModulesResourceFactory.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
- *******************************************************************************/ 
-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.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 = ".wtpmodules"; //$NON-NLS-1$
-	public static final URI WTP_MODULES_URI_OBJ = URI.createURI(WTP_MODULES_SHORT_NAME);
-
-	/**
-	 * Method registerDtds.
-	 */
-	public static void registerDtds() {
-		//do nothing
-	}
-
-	/**
-	 * Constructor for ApplicationClientResourceFactory.
-	 * @param aRendererFactory
-	 */
-	public WTPModulesResourceFactory(RendererFactory aRendererFactory) {
-		super(aRendererFactory);
-	}
-
-	/**
-	 * @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(RendererFactory.getDefaultRendererFactory());
-	}
-
-	
-	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 ddf6049..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, 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.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 f5a54fc..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WorkbenchComponentImpl.java
+++ /dev/null
@@ -1,381 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WorkbenchComponentImpl.java,v 1.3 2005/05/18 03:02:06 cbridgha Exp $
- */
-package org.eclipse.wst.common.componentcore.internal.impl;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-
-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.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.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.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>
- * </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>}' 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>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getReferencedComponents()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList referencedComponents = 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;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WorkbenchComponentImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- 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() {
-		if (componentType != null && componentType.eIsProxy()) {
-			ComponentType oldComponentType = componentType;
-			componentType = (ComponentType)eResolveProxy((InternalEObject)componentType);
-			if (componentType != oldComponentType) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE, ComponentcorePackage.WORKBENCH_COMPONENT__COMPONENT_TYPE, oldComponentType, componentType));
-			}
-		}
-		return componentType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentType basicGetComponentType() {
-		return componentType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setComponentType(ComponentType newComponentType) {
-		ComponentType oldComponentType = componentType;
-		componentType = newComponentType;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ComponentcorePackage.WORKBENCH_COMPONENT__COMPONENT_TYPE, oldComponentType, componentType));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getReferencedComponents() {
-		if (referencedComponents == null) {
-			referencedComponents = new EObjectResolvingEList(ReferencedComponent.class, this, ComponentcorePackage.WORKBENCH_COMPONENT__REFERENCED_COMPONENTS);
-		}
-		return referencedComponents;
-	}
-
-	/**
-	 * <!-- 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);
-				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:
-				if (resolve) return getComponentType();
-				return basicGetComponentType();
-			case ComponentcorePackage.WORKBENCH_COMPONENT__REFERENCED_COMPONENTS:
-				return getReferencedComponents();
-		}
-		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;
-		}
-		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;
-		}
-		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();
-		}
-		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(')');
-		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); 
-	}
-  
-
-} // WorkbenchComponentImpl
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ArtifactEditOperation.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ArtifactEditOperation.java
deleted file mode 100644
index 9ef581c..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ArtifactEditOperation.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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.componentcore.internal.operation;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.common.command.CommandStack;
-import org.eclipse.wst.common.componentcore.ArtifactEdit;
-import org.eclipse.wst.common.componentcore.internal.StructureEdit;
-import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-import org.eclipse.wst.common.componentcore.resources.ComponentHandle;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperation;
-import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
-
-import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
-
-public class ArtifactEditOperation extends WTPOperation {
-	private ArtifactEdit artifactEdit;
-	protected EMFWorkbenchContext emfWorkbenchContext;
-	private CommandStack commandStack;
-
-    /**
-     * @param operationDataModel
-     */
-    public ArtifactEditOperation(ArtifactEditOperationDataModel operationDataModel) {
-        super(operationDataModel);
-    }
-
-    //TODO: move functionality from edit model operation to artifact edit operation
-    protected void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException {
-        // TODO Auto-generated method stub
-
-    }
-	protected final void initilize(IProgressMonitor monitor) {
-		ArtifactEditOperationDataModel dataModel = (ArtifactEditOperationDataModel) operationDataModel;
-		emfWorkbenchContext = (EMFWorkbenchContext) WorkbenchResourceHelperBase.createEMFContext(dataModel.getTargetProject(), null);
-		WorkbenchComponent module = getWorkbenchModule(); 
-		artifactEdit = getArtifactEditForModule(module);
-		doInitialize(monitor);
-	}
-
-	/**
-     * @return
-     */
-    protected ArtifactEdit getArtifactEditForModule(WorkbenchComponent module) {
-		ComponentHandle handle = ComponentHandle.create(StructureEdit.getContainingProject(module),module.getName());
-        return ArtifactEdit.getArtifactEditForWrite(handle);
-    }
-
-    /**
-     * @return
-     */
-    public WorkbenchComponent getWorkbenchModule() {
-        ArtifactEditOperationDataModel dataModel = (ArtifactEditOperationDataModel) operationDataModel;
-        StructureEdit moduleCore = null;
-        WorkbenchComponent module = null;
-        try {
-            moduleCore = StructureEdit.getStructureEditForRead(dataModel.getTargetProject());
-            module = moduleCore.findComponentByName(dataModel.getStringProperty(ArtifactEditOperationDataModel.MODULE_NAME));
-        } finally {
-            if (null != moduleCore) {
-                moduleCore.dispose();
-            }
-        }
-        return module;
-    }
-
-    protected ArtifactEdit getArtifactEdit() {
-        return artifactEdit;
-    }
-    
-    protected void doInitialize(IProgressMonitor monitor) {
-		//init
-	}
-	protected final void dispose(IProgressMonitor monitor) {
-		try {
-			doDispose(monitor);
-		} finally {
-			saveEditModel(monitor);
-		}
-	}
-
-	private final void saveEditModel(IProgressMonitor monitor) {
-		if (null != artifactEdit) {
-			if (((ArtifactEditOperationDataModel) operationDataModel).getBooleanProperty(ArtifactEditOperationDataModel.PROMPT_ON_SAVE))
-			    //TODO: reimplement for Artifact edit
-			    //artifactEdit.saveIfNecessaryWithPrompt(monitor, (IOperationHandler) operationDataModel.getProperty(WTPOperationDataModel.UI_OPERATION_HANLDER), this);
-			    artifactEdit.saveIfNecessary(monitor);
-			else
-			    artifactEdit.saveIfNecessary(monitor);
-			artifactEdit.dispose();
-			artifactEdit = null;
-		}
-		postSaveEditModel(monitor);
-	}
-
-	/**
-	 * @param monitor
-	 */
-	protected void postSaveEditModel(IProgressMonitor monitor) {
-		// do nothing by default
-	}
-
-	protected void doDispose(IProgressMonitor monitor) {
-		//dispose
-	}
-
-	/**
-	 * @return Returns the commandStack.
-	 */
-	public CommandStack getCommandStack() {
-	    //TODO: reimplement for for artifact edit 
-//		if (commandStack == null && artifactEdit != null)
-//			commandStack = artifactEdit.getCommandStack();
-//		return commandStack;
-	    return null;
-	}
-
-	/**
-	 * @param commandStack
-	 *            The commandStack to set.
-	 */
-	public void setCommandStack(CommandStack commandStack) {
-		this.commandStack = commandStack;
-	}
-
-	/**
-	 * @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperation#validateEdit()
-	 */
-	protected boolean validateEdit() {
-	    //TODO: reimplement
-//		IValidateEditContext validator = (IValidateEditContext) UIContextDetermination.createInstance(IValidateEditContext.CLASS_KEY);
-//		return validator.validateState(artifactEdit).isOK();
-	    return true;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ArtifactEditOperationDataModel.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ArtifactEditOperationDataModel.java
deleted file mode 100644
index d4a8770..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ArtifactEditOperationDataModel.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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.componentcore.internal.operation;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.wst.common.componentcore.ArtifactEdit;
-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.ComponentHandle;
-import org.eclipse.wst.common.frameworks.internal.operations.ProjectCreationDataModel;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperation;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonMessages;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
-
-import org.eclipse.jem.util.logger.proxy.Logger;
-/**
- * This dataModel is a common super class used for create in a module context.
- * 
- * 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.
- * 
- * @since WTP 1.0
- */
-public abstract class ArtifactEditOperationDataModel extends WTPOperationDataModel {
-	/**
-	 * Required
-	 */
-	public static final String PROJECT_NAME = "ArtifactEditOperationDataModel.PROJECT_NAME"; //$NON-NLS-1$
-	/**
-	 * Required
-	 */
-	public static final String MODULE_NAME = "ArtifactEditOperationDataModel.MODULE_NAME"; //$NON-NLS-1$
-	/**
-	 * Optional, should save with prompt...defaults to false
-	 */
-	public static final String PROMPT_ON_SAVE = "ArtifactEditOperationDataModel.PROMPT_ON_SAVE"; //$NON-NLS-1$
-	
-	protected void initValidBaseProperties() {
-		super.initValidBaseProperties();
-		addValidBaseProperty(PROJECT_NAME);
-		addValidBaseProperty(MODULE_NAME);
-		addValidBaseProperty(PROMPT_ON_SAVE);
-	}
-
-	public IProject getTargetProject() {
-		return ProjectCreationDataModel.getProjectHandleFromProjectName(getStringProperty(PROJECT_NAME));
-	}
-
-	protected Object getDefaultProperty(String propertyName) {
-		if (propertyName.equals(PROMPT_ON_SAVE))
-			return Boolean.FALSE;
-		return super.getDefaultProperty(propertyName);
-	}
-	
-	/* (non-Javadoc)
-     * @see org.eclipse.wst.common.frameworks.operations.WTPOperationDataModel#getDefaultOperation()
-     */
-    public WTPOperation getDefaultOperation() {
-        return new ArtifactEditOperation(this);
-    }
-	
-	public ArtifactEdit getArtifactEditForRead(){
-		WorkbenchComponent module = getWorkbenchModule();
-		ComponentHandle handle = ComponentHandle.create(getProjectForGivenComponent(module),module.getName());
-		return ArtifactEdit.getArtifactEditForRead(handle);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.frameworks.operations.WTPOperationDataModel#doSetProperty(java.lang.String, java.lang.Object)
-	 */
-	protected boolean doSetProperty(String propertyName, Object propertyValue) {
-	    boolean status = super.doSetProperty(propertyName, propertyValue);
-	    if(MODULE_NAME.equals(propertyName)){
-	        WorkbenchComponent module = getWorkbenchModule();
-	        IProject proj = getProjectForGivenComponent(module);
-	        if(proj != null)
-	            setProperty(PROJECT_NAME, proj.getName());
-	    }
-	    return status;
-	}
-    /**
-     * @return
-     */
-    public WorkbenchComponent getWorkbenchModule() {
-        StructureEdit moduleCore = null;
-        WorkbenchComponent module = null;
-		IProject project = getTargetProject();
-		if (project.exists() && project.isAccessible()) {
-	        try {
-				
-	            moduleCore = StructureEdit.getStructureEditForRead(project);
-				if(moduleCore == null )
-					return null;
-	            module = moduleCore.findComponentByName(getStringProperty(MODULE_NAME));
-	        } finally {
-	            if (null != moduleCore) {
-	                moduleCore.dispose();
-	            }
-	        }
-		}
-        return module;
-    }
-	private IProject getProjectForGivenComponent(WorkbenchComponent wbComp) {
-	    IProject modProject = null;
-	    try {
-		    modProject = StructureEdit.getContainingProject(wbComp.getHandle());
-	    } catch (UnresolveableURIException ex) {
-			Logger.getLogger().logError(ex);
-	    }
-	    return modProject;
-	}
-
-	protected IStatus doValidateProperty(String propertyName) {
-		IStatus result = super.doValidateProperty(propertyName);
-		if (!result.isOK())
-			return result;
-		if (propertyName.equals(PROJECT_NAME))
-			return validateProjectName();
-		else if (propertyName.equals(MODULE_NAME))
-			return validateModuleName();
-		return result;
-	}
-	
-	protected IStatus validateProjectName() {
-		String projectName = getStringProperty(PROJECT_NAME);
-		if (projectName == null || projectName.length()==0)
-			return WTPCommonPlugin.createErrorStatus(WTPCommonPlugin.getResourceString(WTPCommonMessages.PROJECT_NAME_EMPTY));
-		return WTPCommonPlugin.OK_STATUS;
-	}
-	
-	protected IStatus validateModuleName() {
-		String moduleName = getStringProperty(MODULE_NAME);
-		if (moduleName==null || moduleName.length()==0)
-			return WTPCommonPlugin.createErrorStatus(WTPCommonPlugin.getResourceString(WTPCommonMessages.ERR_EMPTY_MODULE_NAME));
-		return WTPCommonPlugin.OK_STATUS;
-	}
-}
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 362aac2..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ArtifactEditOperationDataModelProvider.java
+++ /dev/null
@@ -1,127 +0,0 @@
-package org.eclipse.wst.common.componentcore.internal.operation;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.componentcore.ArtifactEdit;
-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.internal.WorkbenchComponent;
-import org.eclipse.wst.common.componentcore.resources.ComponentHandle;
-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 String[] getPropertyNames() {
-		return new String[]{TYPE_ID,PROJECT_NAME, COMPONENT_NAME,PROMPT_ON_SAVE};
-	}
-	
-	public IProject getTargetProject() {
-		String projectName = (String)model.getProperty(IArtifactEditOperationDataModelProperties.PROJECT_NAME);
-		if(projectName != null)
-			return ProjectUtilities.getProject(projectName);
-		return null;
-	}
-	
-	public String[] addToSuperPropertyNames(String[] propertyNames,String[] superPropertyNames) {
-		List allNames = new ArrayList();
-		allNames.addAll(Arrays.asList(propertyNames));
-		allNames.addAll(Arrays.asList(superPropertyNames));
-		String[] allStrings = new String[allNames.size()];
-		for(int i = 0; i < allNames.size();i++) {
-			allStrings[i] = (String)allNames.get(i);
-		}
-		return allStrings;
-		
-	}
-	
-	public boolean propertySet(String propertyName, Object propertyValue) {
-	    boolean status = super.propertySet(propertyName, propertyValue);
-//	    if(COMPONENT_NAME.equals(propertyName)){
-//	        WorkbenchComponent module = getWorkbenchModule();
-//	        IProject proj = getProjectForGivenComponent(module);
-//	        if(proj != null)
-//	            setProperty(PROJECT_NAME, proj.getName());
-//	    }
-	    return status;
-	}
-	
-	public Object getDefaultProperty(String propertyName) {
-		if (propertyName.equals(PROMPT_ON_SAVE))
-			return Boolean.FALSE;
-		if (propertyName.equals(TARGET_PROJECT))
-			return getTargetProject();
-		if (propertyName.equals(TARGET_COMPONENT))
-			return getTargetComponent();
-		return super.getDefaultProperty(propertyName);
-	}
-	
-	 /**
-     * @return
-     */
-    public WorkbenchComponent getWorkbenchModule() {
-        StructureEdit moduleCore = null;
-        WorkbenchComponent module = null;
-        try {
-            moduleCore = StructureEdit.getStructureEditForRead(getTargetProject());
-            module = moduleCore.findComponentByName(getStringProperty(COMPONENT_NAME));
-        } finally {
-            if (null != moduleCore) {
-                moduleCore.dispose();
-            }
-        }
-        return module;
-    }
-	
-	public ArtifactEdit getArtifactEditForRead(){
-		WorkbenchComponent module = getWorkbenchModule(); 
-		ComponentHandle handle = ComponentHandle.create(StructureEdit.getContainingProject(module),module.getName());
-		return ArtifactEdit.getArtifactEditForRead(handle);
-	}
-	
-	public IStatus validate(String propertyName) {
-		IStatus result = super.validate(propertyName);
-		if (result != null && !result.isOK())
-			return result;
-		if (propertyName.equals(PROJECT_NAME))
-			return validateProjectName();
-		else if (propertyName.equals(COMPONENT_NAME))
-			return validateModuleName();
-		return result;
-	}
-	
-	protected IStatus validateProjectName() {
-		String projectName = getStringProperty(PROJECT_NAME);
-		if (projectName == null || projectName.length()==0)
-			return WTPCommonPlugin.createErrorStatus(WTPCommonPlugin.getResourceString(WTPCommonMessages.PROJECT_NAME_EMPTY));
-		return WTPCommonPlugin.OK_STATUS;
-	}
-	
-	protected IStatus validateModuleName() {
-		String moduleName = getStringProperty(COMPONENT_NAME);
-		if (moduleName==null || moduleName.length()==0)
-			return WTPCommonPlugin.createErrorStatus(WTPCommonPlugin.getResourceString(WTPCommonMessages.ERR_EMPTY_MODULE_NAME));
-		return WTPCommonPlugin.OK_STATUS;
-	}
-
-	public IVirtualComponent getTargetComponent() {
-		String moduleName = getStringProperty(COMPONENT_NAME);
-		return ComponentCore.createComponent(getTargetProject(),moduleName);
-			
-		
-	}
-	
-}
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 3537144..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ArtifactEditProviderOperation.java
+++ /dev/null
@@ -1,87 +0,0 @@
-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.emf.common.command.CommandStack;
-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.StructureEdit;
-import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-import org.eclipse.wst.common.componentcore.resources.ComponentHandle;
-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);
-		WorkbenchComponent module = getWorkbenchModule(); 
-		artifactEdit = getArtifactEditForModule(module);
-		doInitialize(monitor);
-	}
-	
-	public IProject getTargetProject() {
-		String projectName = model.getStringProperty(IArtifactEditOperationDataModelProperties.PROJECT_NAME);
-		return ProjectUtilities.getProject(projectName);
-	}
-	
-	public IVirtualComponent getTargetComponent() {
-		String moduleName = model.getStringProperty(IArtifactEditOperationDataModelProperties.COMPONENT_NAME);
-		return ComponentCore.createComponent(getTargetProject(),moduleName);
-	}
-	
-	private void doInitialize(IProgressMonitor monitor) {
-		//Default
-	}
-
-	private ArtifactEdit getArtifactEditForModule(WorkbenchComponent module) {
-		ComponentHandle handle = ComponentHandle.create(StructureEdit.getContainingProject(module),module.getName());
-		return ArtifactEdit.getArtifactEditForWrite(handle);
-	}
-
-	/**
-     * @return
-     */
-    public WorkbenchComponent getWorkbenchModule() {
-        StructureEdit moduleCore = null;
-        WorkbenchComponent module = null;
-        try {
-            moduleCore = StructureEdit.getStructureEditForRead((IProject)model.getProperty(IArtifactEditOperationDataModelProperties.PROJECT_NAME));
-            module = moduleCore.findComponentByName(model.getStringProperty(IArtifactEditOperationDataModelProperties.COMPONENT_NAME));
-        } finally {
-            if (null != moduleCore) {
-                moduleCore.dispose();
-            }
-        }
-        return module;
-    }
-	
-	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/ComponentCreationDataModel.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ComponentCreationDataModel.java
deleted file mode 100644
index 768547a..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ComponentCreationDataModel.java
+++ /dev/null
@@ -1,310 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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.componentcore.internal.operation;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.wst.common.componentcore.internal.StructureEdit;
-import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModelEvent;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPPropertyDescriptor;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonMessages;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
-import org.eclipse.wst.server.core.IModuleType;
-import org.eclipse.wst.server.core.IProjectProperties;
-import org.eclipse.wst.server.core.IRuntimeType;
-import org.eclipse.wst.server.core.ServerCore;
-
-/**
- * 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.
- * 
- * @since WTP 1.0
- */
-public abstract class ComponentCreationDataModel extends WTPOperationDataModel {
-
-	/**
-	 * Required
-	 */
-	public static final String PROJECT_NAME = "ComponentCreationDataModel.PROJECT_NAME"; //$NON-NLS-1$
-
-	/**
-	 * Required
-	 */
-	public static final String COMPONENT_NAME = "ComponentCreationDataModel.COMPONENT_NAME"; //$NON-NLS-1$
-	/**
-	 * Required
-	 */
-
-	public static final String COMPONENT_DEPLOY_NAME = "ComponentCreationDataModel.MODULE_DEPLOY_NAME"; //$NON-NLS-1$
-
-	/**
-	 * An optional dataModel propertyName for a <code>Boolean</code> type. 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 = "ComponentCreationDataModel.CREATE_DEFAULT_FILES"; //$NON-NLS-1$
-
-	/**
-	 * An optional dataModel propertyName for a <code>Boolean</code> type. 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 SHOULD_CREATE_PROJECT = "ComponentCreationDataModel.SHOULD_CREATE_PROJECT"; //$NON-NLS-1$
-
-	/**
-	 * Optional, type String
-	 */
-	public static final String FINAL_PERSPECTIVE = "ComponentCreationDataModel.FINAL_PERSPECTIVE"; //$NON-NLS-1$
-
-	protected static final String IS_ENABLED = "ComponentCreationDataModel.IS_ENABLED"; //$NON-NLS-1$
-
-	/**
-	 * type Integer
-	 */
-	public static final String COMPONENT_VERSION = "ComponentCreationDataModel.COMPONENT_VERSION"; //$NON-NLS-1$
-
-	/**
-	 * type Integer
-	 */
-	public static final String VALID_MODULE_VERSIONS_FOR_PROJECT_RUNTIME = "ComponentCreationDataModel.VALID_MODULE_VERSIONS_FOR_PROJECT_RUNTIME"; //$NON-NLS-1$
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.operations.WTPOperationDataModel#init()
-	 */
-	protected void init() {
-		super.init();
-		setProperty(COMPONENT_VERSION, getDefaultProperty(COMPONENT_VERSION));
-	}
-
-	protected void initValidBaseProperties() {
-		addValidBaseProperty(PROJECT_NAME);
-		addValidBaseProperty(COMPONENT_NAME);
-		addValidBaseProperty(COMPONENT_DEPLOY_NAME);
-		addValidBaseProperty(CREATE_DEFAULT_FILES);
-		addValidBaseProperty(IS_ENABLED);
-		addValidBaseProperty(FINAL_PERSPECTIVE);
-		addValidBaseProperty(COMPONENT_VERSION);
-		addValidBaseProperty(VALID_MODULE_VERSIONS_FOR_PROJECT_RUNTIME);
-	}
-
-	protected Boolean basicIsEnabled(String propertyName) {
-		return (Boolean) getProperty(IS_ENABLED);
-	}
-
-	public void propertyChanged(WTPOperationDataModelEvent event) {
-		if (event.getFlag() == WTPOperationDataModelEvent.PROPERTY_CHG) {
-			event.getDataModel();
-		}
-		super.propertyChanged(event);
-	}
-
-	protected boolean doSetProperty(String propertyName, Object propertyValue) {
-		if(propertyValue != null && COMPONENT_VERSION.equals(propertyName)){
-			if(!(propertyValue instanceof Integer)){
-				return false;
-			}
-		}
-		super.doSetProperty(propertyName, propertyValue);
-		if (PROJECT_NAME.equals(propertyName) && propertyValue != null && ((String) propertyValue).length() != 0) {
-			IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject((String) propertyValue);
-			if (project != null) {
-				IProjectProperties projProperties = ServerCore.getProjectProperties(project);
-				if (projProperties.getRuntimeTarget() != null) {
-					String[] validModuleVersions = getServerVersions(getComponentID(), projProperties.getRuntimeTarget().getRuntimeType());
-					setProperty(VALID_MODULE_VERSIONS_FOR_PROJECT_RUNTIME, validModuleVersions);
-				}
-			}
-		} else if (IS_ENABLED.equals(propertyName)) {
-			notifyEnablementChange(PROJECT_NAME);
-		} else if (COMPONENT_NAME.equals(propertyName))
-			setProperty(COMPONENT_DEPLOY_NAME, propertyValue);
-		return true;
-	}
-
-	protected WTPPropertyDescriptor[] doGetValidPropertyDescriptors(String propertyName) {
-		if (propertyName.equals(COMPONENT_VERSION)) {
-			return getValidComponentVersionDescriptors();
-		}
-		return super.doGetValidPropertyDescriptors(propertyName);
-	}
-
-	protected IStatus doValidateProperty(String propertyName) {
-		if (propertyName.equals(COMPONENT_NAME)) {
-			IStatus status = OK_STATUS;
-			String moduleName = getStringProperty(COMPONENT_NAME);
-			if (status.isOK()) {
-				if (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);
-				}
-				return checkForDuplicateName(moduleName);
-			} else
-				return status;
-
-		} else if (propertyName.equals(NESTED_MODEL_VALIDATION_HOOK)) {
-			return OK_STATUS;
-		} else if (COMPONENT_VERSION.equals(propertyName)) {
-			return validateComponentVersionProperty();
-		} else if (propertyName.equals(PROJECT_NAME)) {
-			String projectName = getStringProperty(PROJECT_NAME);
-			if (projectName == null || projectName.length() == 0) {
-				String errorMessage = WTPCommonPlugin.getResourceString(WTPCommonMessages.PROJECT_NAME_EMPTY);
-				return WTPCommonPlugin.createErrorStatus(errorMessage);
-			}
-		}
-		return super.doValidateProperty(propertyName);
-	}
-
-	protected IStatus checkForDuplicateName(String componentName) {
-
-		IStatus status = OK_STATUS;
-		StructureEdit structureEdit = null;
-		try {
-
-			structureEdit = StructureEdit.getStructureEditForRead(getProject());
-			WorkbenchComponent component = structureEdit.findComponentByName(componentName);
-			if (component != null) {
-
-				String errorMessage = WTPCommonPlugin.getResourceString(WTPCommonMessages.DUPLICATE_COMPONENT_NAME);
-				status = WTPCommonPlugin.createErrorStatus(errorMessage);
-			}
-
-		} finally {
-			if (null != structureEdit) {
-				structureEdit.dispose();
-			}
-		}
-		return status;
-	}
-
-	private IStatus validateComponentVersionProperty() {
-		int componentVersion = getIntProperty(COMPONENT_VERSION);
-
-		if (componentVersion == -1)
-			return WTPCommonPlugin.createErrorStatus(WTPCommonPlugin.getResourceString(WTPCommonMessages.SPEC_LEVEL_NOT_FOUND));
-		return OK_STATUS;
-	}
-
-	protected Object getDefaultProperty(String propertyName) {
-		if (propertyName.equals(CREATE_DEFAULT_FILES) || propertyName.equals(IS_ENABLED)) {
-			return Boolean.TRUE;
-		} else if (propertyName.equals(COMPONENT_VERSION)) {
-			return getDefaultComponentVersion();
-		}
-		return super.getDefaultProperty(propertyName);
-	}
-
-	protected boolean isResultProperty(String propertyName) {
-		if (propertyName.equals(FINAL_PERSPECTIVE))
-			return true;
-		return super.isResultProperty(propertyName);
-	}
-
-	protected abstract WTPPropertyDescriptor[] getValidComponentVersionDescriptors();
-
-	protected abstract EClass getComponentType();
-
-	protected abstract String getComponentExtension();
-
-	protected abstract Integer getDefaultComponentVersion();
-
-	protected abstract String getComponentID();
-
-	public 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;
-	}
-
-	// 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;
-	// }
-
-	// To do: remove hard coded string being compared.
-	private 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;
-	}
-
-	public IProject getProject() {
-		String projName = getStringProperty(PROJECT_NAME);
-		return ProjectUtilities.getProject(projName);
-	}
-
-	public String getComponentName() {
-		return getStringProperty(COMPONENT_NAME);
-	}
-
-	public String getComponentDeployName() {
-		return getStringProperty(COMPONENT_DEPLOY_NAME);
-	}
-
-	protected abstract String getVersion();
-
-	protected abstract List getProperties();
-}
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 d902a9e..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ComponentCreationDataModelProvider.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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.componentcore.internal.operation;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-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.datamodel.properties.IComponentCreationDataModelProperties;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelProvider;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelEvent;
-import org.eclipse.wst.common.frameworks.internal.FlexibleJavaProjectPreferenceUtil;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonMessages;
-import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
-import org.eclipse.wst.server.core.IModuleType;
-import org.eclipse.wst.server.core.IRuntimeType;
-
-/**
- * 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.
- * 
- * @since WTP 1.0
- */
-public abstract class ComponentCreationDataModelProvider extends AbstractDataModelProvider implements IComponentCreationDataModelProperties{
-
-    public void init() {
-        super.init();
-        initProjectCreationModel();
-    }
-    
-	public String[] getPropertyNames() {
-		return new String[]{PROJECT_NAME, NESTED_PROJECT_CREATION_DM, COMPONENT_NAME, LOCATION, COMPONENT_DEPLOY_NAME, CREATE_DEFAULT_FILES};
-	}
-
-    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);
-            if(!FlexibleJavaProjectPreferenceUtil.getMultipleModulesPerProjectProp())
-                model.setProperty(PROJECT_NAME, propertyValue);
-        } else if (COMPONENT_DEPLOY_NAME.equals(propertyName))
-			model.setProperty(COMPONENT_DEPLOY_NAME, propertyValue);        
-         return true;
-    }
-    
-    public Object getDefaultProperty(String propertyName) {
-        if (propertyName.equals(CREATE_DEFAULT_FILES)) {
-            return Boolean.TRUE;
-        }
-        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()){
-                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 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;
-    }
-    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 String getComponentID();
-    
-	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 cebd172..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ComponentCreationOperation.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.componentcore.internal.operation;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.internal.ComponentType;
-import org.eclipse.wst.common.componentcore.internal.ComponentcoreFactory;
-import org.eclipse.wst.common.componentcore.internal.StructureEdit;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.frameworks.internal.operations.WTPOperation;
-
-public abstract class ComponentCreationOperation extends WTPOperation {
-
-	public ComponentCreationOperation(ComponentCreationDataModel dataModel) {
-		super(dataModel);
-	}
-
-	public ComponentCreationOperation() {
-		super();
-	}
-	protected void execute(String componentType, IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException {
-        //super.execute(monitor);
-        createComponent();
-        setupComponentType(componentType);		
-    }	
-	//to make it  abstract
-	protected  void createComponent(){
-		
-	}
-	
-    protected void setupComponentType(String typeID) {
-    	ComponentCreationDataModel dataModel = (ComponentCreationDataModel)operationDataModel;
-
-		IVirtualComponent component = ComponentCore.createComponent(dataModel.getProject(), dataModel.getComponentDeployName());    	
-        ComponentType componentType = ComponentcoreFactory.eINSTANCE.createComponentType();
-        componentType.setComponentTypeId(typeID);
-        componentType.setVersion(dataModel.getVersion());
-        List newProps = dataModel.getProperties();
-        if (newProps != null && !newProps.isEmpty()) {
-            EList existingProps = componentType.getProperties();
-            for (int i = 0; i < newProps.size(); i++) {
-                existingProps.add(newProps.get(i));
-		}
-		}
-        StructureEdit.setComponentType(component, componentType);
-    }	
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ComponentCreationOperationEx.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ComponentCreationOperationEx.java
deleted file mode 100644
index bcc6d99..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ComponentCreationOperationEx.java
+++ /dev/null
@@ -1,103 +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.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.emf.common.util.EList;
-import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.datamodel.properties.IComponentCreationDataModelProperties;
-import org.eclipse.wst.common.componentcore.internal.ComponentType;
-import org.eclipse.wst.common.componentcore.internal.ComponentcoreFactory;
-import org.eclipse.wst.common.componentcore.internal.StructureEdit;
-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.frameworks.datamodel.IDataModelOperation;
-import org.eclipse.wst.common.frameworks.datamodel.properties.IFlexibleProjectCreationDataModelProperties;
-
-public abstract class ComponentCreationOperationEx extends AbstractDataModelOperation implements IComponentCreationDataModelProperties {
-
-    public ComponentCreationOperationEx(IDataModel model) {
-        super(model);
-    }
-
-    public IStatus execute(String componentType, IProgressMonitor monitor, IAdaptable info) {
-        createProjectIfNeeded(monitor, info);
-        try {
-            createAndLinkJ2EEComponents();
-        }
-        catch (CoreException e) {
-            Logger.getLogger().log(e);
-        }
-        setupComponentType(componentType);
-        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();
-        }
-    }
-
-    // to make it abstract
-    protected abstract void createAndLinkJ2EEComponents() throws CoreException;
-
-    protected void setupComponentType(String typeID) {
-        IVirtualComponent component = ComponentCore.createComponent(getProject(), model.getStringProperty(ComponentCreationDataModelProvider.COMPONENT_DEPLOY_NAME));
-        ComponentType componentType = ComponentcoreFactory.eINSTANCE.createComponentType();
-        componentType.setComponentTypeId(typeID);
-        componentType.setVersion(getVersion());
-        List newProps = getProperties();
-        if (newProps != null && !newProps.isEmpty()) {
-            EList existingProps = componentType.getProperties();
-            for (int i = 0; i < newProps.size(); i++) {
-                existingProps.add(newProps.get(i));
-            }
-        }
-        StructureEdit.setComponentType(component, componentType);
-    }
-
-    protected IProject getProject() {
-        String name = model.getStringProperty(PROJECT_NAME);
-        return ProjectUtilities.getProject(name);
-    }
-
-    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();
-
-}
\ No newline at end of file
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 30bfa9f..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/IArtifactEditOperationDataModelProperties.java
+++ /dev/null
@@ -1,28 +0,0 @@
-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/ModelModifierOperation.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ModelModifierOperation.java
deleted file mode 100644
index bc93069..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ModelModifierOperation.java
+++ /dev/null
@@ -1,121 +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 3, 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.operation;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-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.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.wst.common.internal.emfworkbench.integration.ModelModifier;
-
-/**
- * @author DABERG
- * 
- * To change the template for this generated type comment go to Window>Preferences>Java>Code
- * Generation>Code and Comments
- */
-public abstract class ModelModifierOperation extends ArtifactEditOperation {
-	protected ModelModifier modifier;
-
-	/**
-	 * @param dataModel
-	 */
-	public ModelModifierOperation(ModelModifierOperationDataModel dataModel) {
-		super(dataModel);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.internal.emfworkbench.operation.EditModelOperation#doInitialize(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	protected void doInitialize(IProgressMonitor monitor) {
-		super.doInitialize(monitor);
-		EditingDomain domain = null;
-		if (operationDataModel.isProperty(ModelModifierOperationDataModel.EDITING_DOMAIN)) { //added
-			// so
-			// regular
-			// EditModelOperations
-			// can
-			// be
-			// used
-			domain = (EditingDomain) operationDataModel.getProperty(ModelModifierOperationDataModel.EDITING_DOMAIN);
-		}
-		if (domain == null) {
-			domain = createDefaultEditingDomain();
-		}
-		modifier = new ModelModifier(domain);
-	}
-
-	/**
-	 * @return
-	 */
-	private EditingDomain createDefaultEditingDomain() {
-		return new AdapterFactoryEditingDomain(new AdapterFactory() {
-			public boolean isFactoryForType(Object type) {
-				return false;
-			}
-
-			public Object adapt(Object object, Object type) {
-				return null;
-			}
-
-			public Adapter adapt(Notifier target, Object type) {
-				return null;
-			}
-
-			public Adapter adaptNew(Notifier target, Object type) {
-				return null;
-			}
-
-			public void adaptAllNew(Notifier notifier) {
-				//do nothing
-			}
-		}, getArtifactEdit().getCommandStack());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperation#execute(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	protected final void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException {
-		addHelpers();
-		modifier.execute();
-		postExecuteCommands(monitor);
-	}
-
-	/**
-	 * This is a hook to allow subclasses to perform additional tasks after the commands are
-	 * executed using the helpers.
-	 */
-	protected void postExecuteCommands(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-		//do nothing
-	}
-
-	/**
-	 * Add all necessary helpers to the modifier.
-	 * 
-	 * @see org.eclipse.wst.common.internal.emfworkbench.integration.ModifierHelper
-	 */
-	protected abstract void addHelpers() throws CoreException;
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ModelModifierOperationDataModel.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ModelModifierOperationDataModel.java
deleted file mode 100644
index 5394beb..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ModelModifierOperationDataModel.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 Dec 3, 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.operation;
-
-/**
- * @author DABERG
- * 
- * To change the template for this generated type comment go to Window>Preferences>Java>Code
- * Generation>Code and Comments
- */
-public abstract class ModelModifierOperationDataModel extends ArtifactEditOperationDataModel {
-	/**
-	 * Optionally set the EditingDomain that should be used to create generic EMF commands. Type -
-	 * EditingDomain
-	 */
-	public static final String EDITING_DOMAIN = "ModelModifierOperationDataModel.EDITING_DOMAIN"; //$NON-NLS-1$
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.internal.emfworkbench.operation.EditModelOperationDataModel#initValidBaseProperties()
-	 */
-	protected void initValidBaseProperties() {
-		super.initValidBaseProperties();
-		addValidBaseProperty(EDITING_DOMAIN);
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/FlexibleProject.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/FlexibleProject.java
deleted file mode 100644
index 89b39f7..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/FlexibleProject.java
+++ /dev/null
@@ -1,67 +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.componentcore.internal.resources;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.ModuleCoreNature;
-import org.eclipse.wst.common.componentcore.internal.StructureEdit;
-import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-import org.eclipse.wst.common.componentcore.resources.IFlexibleProject;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-
-public class FlexibleProject implements IFlexibleProject {
-	
-	private final IProject project;
-	private static final IVirtualComponent[] NO_COMPONENTS = new IVirtualComponent[0];
-	
-	public FlexibleProject(IProject aProject) {
-		project = aProject;
-	}
-
-	public IVirtualComponent[] getComponents() { 
-		StructureEdit core = null;
-		try {
-			core = StructureEdit.getStructureEditForRead(getProject());
-			if(core == null)
-				return NO_COMPONENTS;
-			WorkbenchComponent[] components = core.getWorkbenchModules();
-			if(components.length == 0)
-				return NO_COMPONENTS;
-			IVirtualComponent[] virtualComponents = new IVirtualComponent[components.length];
-			for (int i = 0; i < components.length; i++) {
-				virtualComponents[i] = ComponentCore.createComponent(getProject(), components[i].getName());
-			}
-			return virtualComponents;
-		} finally {
-			if(core != null)
-				core.dispose();
-		}
-	}
-
-	public IVirtualComponent getComponent(String aComponentName) { 
-		return ComponentCore.createComponent(getProject(), aComponentName);
-	}
-
-	public IProject getProject() {
-		return project;
-	}
-
-	public boolean isFlexible() { 
-		return ModuleCoreNature.getModuleCoreNature(getProject()) != null;
-	}
-
-	public void create(int theFlags, IProgressMonitor aMonitor) { 
-		
-	}
-
-}
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 36c3233..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualComponent.java
+++ /dev/null
@@ -1,234 +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.componentcore.internal.resources;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Properties;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.UnresolveableURIException;
-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.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.ComponentHandle;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
-import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
-
-public class VirtualComponent extends VirtualContainer implements IVirtualComponent {
-
-	public VirtualComponent(IProject aProject, String aName, IPath aRuntimePath) {
-		super(aProject, aName, aRuntimePath);
-	}
-
-	public VirtualComponent(ComponentHandle aComponentHandle, IPath aRuntimePath) {
-		super(aComponentHandle, aRuntimePath);
-	}
-	
-	public IVirtualComponent getComponent() {
-		return this;
-	}
-	
-	public String getName() {
-		return getComponentHandle().getName();
-	}
-	
-	public boolean exists() { 
-		StructureEdit core = null;
-		try {
-			core = StructureEdit.getStructureEditForRead(getProject());
-			WorkbenchComponent component = core.findComponentByName(getName()); 
-			return component != null;
-		} finally {
-			if(core != null)
-				core.dispose();
-		}
-		
-	}
-	
-	public String getComponentTypeId() { 
-
-		StructureEdit core = null;
-		try {
-			core = StructureEdit.getStructureEditForRead(getProject());
-			WorkbenchComponent component = core.findComponentByName(getName()); 
-			ComponentType cType = component.getComponentType();
-			return cType != null ? cType.getComponentTypeId() : ""; 
-		} finally {
-			if(core != null)
-				core.dispose();
-		}
-	}
-
-	public void setComponentTypeId(String aComponentTypeId) {
-
-		StructureEdit core = null;
-		try {
-			core = StructureEdit.getStructureEditForWrite(getProject());
-			WorkbenchComponent component = core.findComponentByName(getName()); 
-			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() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public IPath[] getMetaResources() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public void setMetaResources(IPath[] theMetaResourcePaths) {
-		// TODO Auto-generated method stub
-
-	}
-	
-	public IVirtualResource[] getResources(String aResourceType) {
-		StructureEdit core = null;
-		try {
-			core = StructureEdit.getStructureEditForRead(getProject());
-			WorkbenchComponent component = core.findComponentByName(getName());
-			List currentResources = component.getResources();
-			List foundResources = new ArrayList();
-			
-			for (Iterator iter = currentResources.iterator(); iter.hasNext();) {
-				ComponentResource resource = (ComponentResource) iter.next();
-				if(aResourceType == null || 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(), getName(), aComponentResource.getRuntimePath());
-			case IResource.FOLDER:
-				return ComponentCore.createFolder(getProject(), getName(), aComponentResource.getRuntimePath());
-		}
-		return null;
-	}
-
-	public IVirtualReference[] getReferences() { 
-		StructureEdit core = null;
-		try {
-			core = StructureEdit.getStructureEditForRead(getProject());
-			WorkbenchComponent component = core.findComponentByName(getName());
-			List referencedComponents = component.getReferencedComponents();
-			ReferencedComponent referencedComponent = null;
-			
-			List references = new ArrayList();
-			IVirtualComponent targetComponent = null;
-			IProject targetProject = null;
-			String targetComponentName = null;
-			for (Iterator iter = referencedComponents.iterator(); iter.hasNext();) {
-				referencedComponent = (ReferencedComponent) iter.next();
-				try { 
-					targetProject = StructureEdit.getContainingProject(referencedComponent.getHandle());
-				} catch(UnresolveableURIException uurie) { } 
-				// if the project cannot be resolved, assume it's local
-				if(targetProject == null)
-					targetProject = getProject();
-				
-				try {
-					targetComponentName = StructureEdit.getDeployedName(referencedComponent.getHandle());
-					targetComponent = ComponentCore.createComponent(targetProject, targetComponentName); 
-					references.add(new VirtualReference(this, targetComponent, referencedComponent.getRuntimePath(), referencedComponent.getDependencyType().getValue()));
-					
-				} catch (UnresolveableURIException e) { 
-				}
-				 
-			}
-			
-			return (IVirtualReference[]) references.toArray(new IVirtualReference[references.size()]);
-		} finally {
-			if(core != null)
-				core.dispose();
-		}		
-	}
-
-	public void setReferences(IVirtualReference[] references) { 
-		StructureEdit core = null;
-		try {
-			core = StructureEdit.getStructureEditForWrite(getProject());
-			WorkbenchComponent component = core.findComponentByName(getName());
-			List referencedComponents = component.getReferencedComponents();
-			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());
-				referencedComponent.setHandle(ModuleURIUtil.fullyQualifyURI(references[i].getReferencedComponent().getProject(), 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().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;
-	}
-
-}
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 27b49f9..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualContainer.java
+++ /dev/null
@@ -1,302 +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.componentcore.internal.resources;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.common.util.URI;
-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.ComponentHandle;
-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 class VirtualContainer extends VirtualResource implements IVirtualContainer {
-
-
-	public VirtualContainer(IProject aProject, String aName, IPath aRuntimePath) {
-		super(aProject, aName, aRuntimePath);
-	}
-
-	public VirtualContainer(ComponentHandle aComponentHandle, IPath aRuntimePath) {
-		super(aComponentHandle, aRuntimePath);
-	}
-
-	// TODO WTP:Implement this method
-	public boolean exists(IPath path) {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-		// return false;
-	}
-
-	/**
-	 * @see IContainer#findMember(java.lang.String)
-	 */
-	public IVirtualResource findMember(String aChildName) {
-		return findMember(aChildName, 0);
-	}
-
-	/**
-	 * @see IContainer#findMember(java.lang.String, boolean)
-	 */
-	public IVirtualResource findMember(String aChildName,  int searchFlags) {
-		return findMember(getRuntimePath().append(aChildName), searchFlags);
-	}
-
-	/**
-	 * @see IContainer#findMember(org.eclipse.core.runtime.IPath)
-	 */
-	public IVirtualResource findMember(IPath aChildPath) {
-		return findMember(aChildPath, 0);
-	}
-
-	public IVirtualResource findMember(IPath path, int searchFlags) {
-
-		// ModuleCore moduleCore = null;
-		// Set virtualResources = null;
-		// try {
-		//			
-		// moduleCore = ModuleCore.getModuleCoreForRead(getComponentHandle().getProject());
-		// WorkbenchComponent component =
-		// moduleCore.findWorkbenchModuleByDeployName(getComponentHandle().getName());
-		// ResourceTreeRoot root = ResourceTreeRoot.getDeployResourceTreeRoot(component);
-		// ComponentResource[] componentResources = root.findModuleResources(getRuntimePath(),
-		// false);
-		//			 
-		//			
-		// } finally {
-		// if(moduleCore != null)
-		// moduleCore.dispose();
-		// }
-		return new VirtualFolder(getComponentHandle(), getRuntimePath().append(path));
-	} 
-
-	/**
-	 * @see IContainer#getFile(org.eclipse.core.runtime.IPath)
-	 */
-	public IVirtualFile getFile(IPath aPath) {
-		return new VirtualFile(getComponentHandle(), getRuntimePath().append(aPath));
-	}
-
-	/**
-	 * @see IContainer#getFolder(org.eclipse.core.runtime.IPath)
-	 */
-	public IVirtualFolder getFolder(IPath aPath) {
-		return new VirtualFolder(getComponentHandle(), getRuntimePath().append(aPath));
-	}
-
-
-	/**
-	 * @see IFolder#getFile(java.lang.String)
-	 */
-	public IVirtualFile getFile(String name) {
-		return new VirtualFile(getComponentHandle(), getRuntimePath().append(name));
-	}
-
-	/**
-	 * @see IFolder#getFolder(java.lang.String)
-	 */
-	public IVirtualFolder getFolder(String name) {
-		return new VirtualFolder(getComponentHandle(), 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 {
-
-		StructureEdit moduleCore = null;
-		Set virtualResources = new HashSet();
-		try {
-
-			moduleCore = StructureEdit.getStructureEditForRead(getComponentHandle().getProject());
-			WorkbenchComponent component = moduleCore.findComponentByName(getComponentHandle().getName());
-			ResourceTreeRoot root = ResourceTreeRoot.getDeployResourceTreeRoot(component);
-			ComponentResource[] componentResources = root.findModuleResources(getRuntimePath(), ResourceTreeNode.CREATE_NONE);
-
-			
-			IResource realResource = null;
-			IPath fullRuntimePath = null;
-			IPath newRuntimePath = null;
-
-			for (int componentResourceIndex = 0; componentResourceIndex < componentResources.length; componentResourceIndex++) {
-				fullRuntimePath = componentResources[componentResourceIndex].getRuntimePath();
-
-				// exact match
-				if (fullRuntimePath.equals(getRuntimePath())) {
-
-					realResource = StructureEdit.getEclipseResource(componentResources[componentResourceIndex]);
-					if (realResource.getType() == IResource.FOLDER) {
-						IFolder realFolder = (IFolder) realResource;
-						IResource[] realChildResources = realFolder.members(memberFlags);
-						for (int realResourceIndex = 0; realResourceIndex < realChildResources.length; realResourceIndex++) {
-							newRuntimePath = getRuntimePath().append(realChildResources[realResourceIndex].getName());
-							addVirtualResource(virtualResources, realChildResources[realResourceIndex], newRuntimePath);
-						}
-					} // An IResource.FILE would be an error condition (as this is a container)
-
-				} else { // fuzzy match
-					newRuntimePath = getRuntimePath().append(fullRuntimePath.segment(getRuntimePath().segmentCount()));
-
-					if (fullRuntimePath.segmentCount() == 1) {
-						realResource = StructureEdit.getEclipseResource(componentResources[componentResourceIndex]);
-						if(realResource != null)
-							addVirtualResource(virtualResources, realResource, newRuntimePath);
-					} else if (fullRuntimePath.segmentCount() > 1) {
-						virtualResources.add(new VirtualFolder(getComponentHandle(), 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()]);
-	}
-
-
-	public IVirtualFile[] findDeletedMembersWithHistory(int depth, IProgressMonitor monitor) throws CoreException {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-		// return null;
-	} 
-
-	public void create(int updateFlags, IProgressMonitor aMonitor) throws CoreException {
-		
-		StructureEdit moduleCore = null;
-		try {
-			moduleCore = StructureEdit.getStructureEditForWrite(getProject());
-			WorkbenchComponent component = moduleCore.findComponentByName(getComponentHandle().getName());
-			if(component == null)
-				moduleCore.createWorkbenchModule(getComponentHandle().getName());
-		} finally {
-			if (moduleCore != null) {
-				moduleCore.saveIfNecessary(null);
-				moduleCore.dispose();
-			}
-		} 
-	} 
-
-	/**
-	 * @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 {
-			IFolder resource = getProject().getFolder(aProjectRelativeLocation);
-
-			moduleCore = StructureEdit.getStructureEditForWrite(getProject());
-			WorkbenchComponent component = moduleCore.findComponentByName(getComponent().getName());
-			
-			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);					
-				}
-			}
-
-			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(getComponentHandle().getProject());
-			WorkbenchComponent component = moduleCore.findComponentByName(getComponentHandle().getName());
-			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$
-	}
-	
-
-	/**
-	 * @param virtualResources
-	 * @param realResource
-	 * @param newRuntimePath
-	 */
-	private void addVirtualResource(Set virtualResources, IResource realResource, IPath newRuntimePath) {
-		if (realResource.getType() == IResource.FOLDER)
-			virtualResources.add(new VirtualFolder(getComponentHandle(), newRuntimePath));
-		else
-			virtualResources.add(new VirtualFile(getComponentHandle(), newRuntimePath));
-	}
-
-}
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 caeda31..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualFile.java
+++ /dev/null
@@ -1,106 +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.componentcore.internal.resources;
-
-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.IProgressMonitor;
-import org.eclipse.emf.common.util.URI;
-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.ComponentHandle;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
-import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
-
-public class VirtualFile extends VirtualResource implements IVirtualFile {
-
-	protected VirtualFile(ComponentHandle aComponentHandle, IPath aRuntimePath) {
-		super(aComponentHandle, aRuntimePath); 
-	}
-
- 	public VirtualFile(IProject aProject, String aComponentName, IPath aRuntimePath) {
-		super(ComponentHandle.create(aProject, aComponentName), aRuntimePath);  
-	}
-
-	/**
-	 * @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.findComponentByName(getComponent().getName());
-			
-			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() {
-		return getProject().getFile(getProjectRelativePath());
-	}
-	
-	public IFile[] getUnderlyingFiles() {
-		return new IFile[] {getUnderlyingFile()};
-	}
-
-	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 e3be462..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualFolder.java
+++ /dev/null
@@ -1,162 +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.componentcore.internal.resources;
-
-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.ComponentHandle;
-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 <aContainingProject,
-	 * aComponentName> with a runtime path of aRuntimePath.
-	 * </p>
-	 * 
-	 * @param aContainingProject
-	 * @param aComponentName
-	 * @param aRuntimePath
-	 */
-	public VirtualFolder(IProject aContainingProject, String aComponentName, IPath aRuntimePath) {
-		super(aContainingProject, aComponentName, aRuntimePath);
-	}
-
-	/**
-	 * p> Creates an unassigned mapping contained by the component identified by aComponentHandle
-	 * with a runtime path of aRuntimePath.
-	 * </p>
-	 * 
-	 * @param aComponentHandle
-	 * @param aRuntimePath
-	 */
-	protected VirtualFolder(ComponentHandle aComponentHandle, IPath aRuntimePath) {
-		super(aComponentHandle, aRuntimePath);
-	}
- 
-	// TODO WTP:Implement this method
-	public void create(int updateFlags, IProgressMonitor monitor) throws CoreException {
-
-		IVirtualComponent container = ComponentCore.createComponent(getProject(), getComponentHandle().getName()); 
-		IFolder realFolder = getProject().getFolder(container.getProjectRelativePath()); 
-		IFolder newFolder = realFolder.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;
-	}
-
-	// TODO WTP:Implement this method
-	public IVirtualResource findMember(String name) {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-		// return null;
-	}
-
-	// TODO WTP:Implement this method
-	public IVirtualResource findMember(String name, boolean includePhantoms) {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-		// return null;
-	}
-
-	// TODO WTP:Implement this method
-	public IVirtualResource findMember(IPath path) {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-		// return null;
-	}
-
-	// TODO WTP:Implement this method
-	public IVirtualResource findMember(IPath path, boolean includePhantoms) {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-		// return null;
-	}
- 
-	public int getType() {
-		return IVirtualResource.FOLDER;
-	} 
-	
-	public IResource getUnderlyingResource() {
-		return getUnderlyingFolder();
-	}
-	
-	public IResource[] getUnderlyingResources() {
-		return getUnderlyingFolders();
-	}
-
-	public IFolder getUnderlyingFolder() { 
-		return getProject().getFolder(getProjectRelativePath());
-	}
-	
-	public IFolder[] getUnderlyingFolders() {
-		return new IFolder[] {getUnderlyingFolder()};
-	}
-
-	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.findComponentByName(getComponent().getName());
-			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.findComponentByName(getComponent().getName());
-			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 c6bf0d1..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualReference.java
+++ /dev/null
@@ -1,78 +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.componentcore.internal.resources;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-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) { 
-
-	}
-
-	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 565349a..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualResource.java
+++ /dev/null
@@ -1,248 +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.componentcore.internal.resources;
-
-import java.util.Arrays;
-
-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.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.ResourceTreeNode;
-import org.eclipse.wst.common.componentcore.internal.impl.ResourceTreeRoot;
-import org.eclipse.wst.common.componentcore.resources.ComponentHandle;
-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 ComponentHandle componentHandle;
-	private 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(ComponentHandle aComponentHandle, IPath aRuntimePath) {
-		componentHandle = aComponentHandle;		
-		runtimePath = aRuntimePath;
-	}
-	
-	
-	protected VirtualResource(IProject aProject, String aComponentName, IPath aRuntimePath) {
-		this(ComponentHandle.create(aProject, aComponentName), 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(getComponentHandle().getProject());
-			WorkbenchComponent component = moduleCore.findComponentByName(getComponentHandle().getName());
-			ComponentResource[] resources = component.findResourcesByRuntimePath(getRuntimePath());
-			component.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() {
-		IResource resource = getUnderlyingResource();
-		return resource != null && resource.exists();
-	}
-
-	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 getProjectRelativePath() {
-
-		StructureEdit moduleCore = null;
-		try {
-			moduleCore = StructureEdit.getStructureEditForRead(getProject());
-			WorkbenchComponent component = moduleCore.findComponentByName(getComponentHandle().getName());
-			if(component != null) {
-				ResourceTreeRoot root = ResourceTreeRoot.getDeployResourceTreeRoot(component);
-				// still need some sort of loop here to search subpieces of the runtime path.
-				ComponentResource[] componentResources = null;
-		
-				IPath estimatedPath = null;
-				IPath searchPath = null;
-				do{ 
-					searchPath = (searchPath == null) ? getRuntimePath(): searchPath.removeLastSegments(1);
-					componentResources = root.findModuleResources(searchPath, ResourceTreeNode.CREATE_NONE);
-					estimatedPath = findBestMatch(componentResources);					
-				} while(estimatedPath == null && canSearchContinue(componentResources, searchPath));
-				return estimatedPath;
-			}
-		} finally {
-			if(moduleCore != null) {
-				moduleCore.dispose();
-			}
-		}
-		return getRuntimePath();
-	}
- 
-	private boolean canSearchContinue(ComponentResource[] componentResources, IPath searchPath) {
-		return (searchPath.segmentCount() > 0);
-	}  
-	
-	private IPath findBestMatch(ComponentResource[] theComponentResources) {
-
-		int currentMatchLength = 0;
-		int bestMatchLength = -1;
-		IPath estimatedPath = null;
-		IPath currentPath = null;
-		final IPath runtimePath = getRuntimePath();
-		for (int i = 0; i < theComponentResources.length; i++) { 
-			currentPath = theComponentResources[i].getRuntimePath();
-			
-			if(currentPath.isPrefixOf(runtimePath)) {			
-				if(currentPath.segmentCount() == runtimePath.segmentCount())
-					return theComponentResources[i].getSourcePath();
-				
-				currentMatchLength = currentPath.matchingFirstSegments(runtimePath);				
-				if(currentMatchLength == currentPath.segmentCount() && currentMatchLength > bestMatchLength) {
-					bestMatchLength = currentMatchLength;
-					IPath sourcePath = theComponentResources[i].getSourcePath();
-					IPath subpath = runtimePath.removeFirstSegments(currentMatchLength);
-					estimatedPath = sourcePath.append(subpath);  
-				} 
-			}
-		}    
-		return estimatedPath;
-	}
-	 
-	public String getName() {
-		return getRuntimePath().lastSegment();
-	}
-	
-	public IVirtualComponent getComponent() {
-		if(component == null)
-			component = ComponentCore.createComponent(getProject(), getComponentHandle().getName());
-		return component;
-	}
- 
-	public IVirtualContainer getParent() {
-		if(getRuntimePath().segmentCount() > 1)
-			return new VirtualFolder(getComponentHandle(), getRuntimePath().removeLastSegments(1));
-		return getComponent();
-	} 
-
-	public IProject getProject() {
-		return getComponentHandle().getProject();
-	}
-
-	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 = "["+getComponentHandle()+":"+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 );
-	} 
-	 
-	
-	//TODO Persist the resource type to the model
-	public void setResourceType(String aResourceType) {
-		resourceType = aResourceType;		
-	}
-	
-	//TODO Fetch the resource type from the model.
-	public String getResourceType() {
-		return resourceType;
-	}
-
-	protected ComponentHandle getComponentHandle() {
-		return componentHandle;
-	} 
-	
-	protected void createResource(IContainer resource, int updateFlags, IProgressMonitor monitor) throws CoreException {
-
-		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());
-	}
- 
-}
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 502bf1c..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ArtifactEditAdapterFactory.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
- *******************************************************************************/
-package org.eclipse.wst.common.componentcore.internal.util;
-
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.wst.common.componentcore.ArtifactEdit;
-import org.eclipse.wst.common.componentcore.internal.ArtifactEditModel;
-
-/**
- * <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;
-	
-	/**
-	 * <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 == ArtifactEdit.ADAPTER_TYPE) {
-			if (anAdaptableObject instanceof ArtifactEditModel)
-				return new ArtifactEdit((ArtifactEditModel) anAdaptableObject);
-		}
-		return null;
-	}
-
-	/**  
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
-	 */
-	public Class[] getAdapterList() {
-		return new Class[]{ARTIFACT_EDIT_MODEL_CLASS};
-	}
-
-}
\ No newline at end of file
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 f92b886..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentcoreAdapterFactory.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ComponentcoreAdapterFactory.java,v 1.1 2005/04/04 07:04:58 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.*;
-
-/**
- * <!-- 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 4bbcbb0..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentcoreSwitch.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ComponentcoreSwitch.java,v 1.1 2005/04/04 07:04:58 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.*;
-
-/**
- * <!-- 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 e7cc3b9..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, 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
- *
- * 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 2592b24..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, 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.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 5c3e60e..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/EclipseResourceAdapter.java
+++ /dev/null
@@ -1,77 +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.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.core.runtime.Path;
-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.UnresolveableURIException;
-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() {
-		if (resource != null || hasSearchFailed)
-			return resource;
-		synchronized (this) {
-			if (resource == null) {
-				ComponentResource moduleResource = (ComponentResource) getTarget();
-				IPath sourcePath = moduleResource.getSourcePath();
-				IProject container = StructureEdit.getContainingProject(moduleResource.getComponent());
-				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/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 a91fda5..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/IModuleConstants.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
- *******************************************************************************/
-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 static String COMPONENT_STRUCTURAL_BUILDER_ID = "org.eclipse.wst.common.modulecore.ComponentStructuralBuilder"; //$NON-NLS-1$
-    public static String COMPONENT_STRUCTURAL_DEPENDENCY_RESOLVER_ID = "org.eclipse.wst.common.modulecore.ComponentStructuralBuilderDependencyResolver"; //$NON-NLS-1$
-     
-	public final static Path WTPMODULE_FILE_PATH = new Path(".wtpmodules"); //$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 DEPENDENT_MODULE = "dependent"; //$NON-NLS-1$
-	
-	public final static String J2EE_VERSION_1_2 = "1.2"; //$NON-NLS-1$
-	public final static String J2EE_VERSION_1_3 = "1.3"; //$NON-NLS-1$
-	public final static String J2EE_VERSION_1_4 = "1.4"; //$NON-NLS-1$
-	
-	
-	public final static String JSP_VERSION_1_1 = "1.1"; //$NON-NLS-1$
-	public final static String JSP_VERSION_1_2 = "1.2"; //$NON-NLS-1$
-	public final static String JSP_VERSION_2_0 = "2.0";	//$NON-NLS-1$	
-	
-	
-	public final static String SERVLET_VERSION_2_2 = "2.2"; //$NON-NLS-1$
-	public final static String SERVLET_VERSION_2_3 = "2.3"; //$NON-NLS-1$
-	public final static String SERVLET_VERSION_2_4 = "2.4"; //$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 6593c84..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, 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.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 e107988..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, 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.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 e13a2ce..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ModuleCoreEclipseAdapterFactory.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.componentcore.internal.util;
-
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.wst.common.componentcore.internal.ModuleStructuralModel;
-import org.eclipse.wst.common.componentcore.internal.StructureEdit;
-
-/**
- * <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[] ADAPTER_LIST = new Class[] { MODULE_CORE_CLASS };
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class)
-	 */
-	public Object getAdapter(Object aModuleStructuralModel, Class anAdapterType) {
-		if(aModuleStructuralModel instanceof ModuleStructuralModel) 
-			if(anAdapterType == MODULE_CORE_CLASS)
-				return new StructureEdit((ModuleStructuralModel)aModuleStructuralModel);
-		return null;
-	}
-
-	/* (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 67adc8c..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, 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.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 ebf3fa3..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, 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.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 d532e68..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/WTPModulesTranslator.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package org.eclipse.wst.common.componentcore.internal.util;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-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())
-		});
-		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 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 52592d9..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/WTPModulesXmlMapperI.java
+++ /dev/null
@@ -1,22 +0,0 @@
-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 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 3ee2be9..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ZipFileExporter.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.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 {
-	ByteArrayOutputStream output = null;
-	InputStream contentStream = null;
-
-	try {
-		output = new ByteArrayOutputStream();
-		contentStream = resource.getContents(false);
-		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();
-		if (contentStream != null)
-			contentStream.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/ComponentHandle.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/ComponentHandle.java
deleted file mode 100644
index 258ecba..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/ComponentHandle.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.componentcore.resources;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.wst.common.componentcore.UnresolveableURIException;
-import org.eclipse.wst.common.componentcore.internal.StructureEdit;
-
-/**
- * Provides a handle to a component within a project.
- * <p>
- * This class provides a way to access ArtifactEdit instances. The component
- * referenced by its handle may not exist. 
- * </p>
- * <p>
- * The following class is not intended to be extended.
- * </p>
- * @since 1.0
- */
-public class ComponentHandle {
-
-	private final IProject project;
-
-	private final String name;
-
-	private String toString;
-
-	private int hashCode;
-
-	/**
-	 * @param aProject
-	 *            The containing project
-	 * @param aComponentName
-	 *            The name of the expected component
-	 */
-	private ComponentHandle(IProject aProject, String aComponentName) {
-		project = aProject;
-		name = aComponentName;
-	}
-
-	/**
-	 * The name of the component.
-	 * @return The name of the component
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * A handle to a valid, accessible project.
-	 * @return The project that contains the component
-	 */
-	public IProject getProject() {
-		return project;
-	}
-
-	/**
-	 * Creates a component handle that indicates a component with the name
-	 * <code>aComponentName</code> contained by the project
-	 * <code>aProject</code>.
-	 * 
-	 * @param aProject
-	 *            The project that will contain the component
-	 * @param aComponentName
-	 *            The name of the component
-	 * @return A ComponentHandle that references the component indicated by the
-	 *         project and component name.
-	 */
-	public static ComponentHandle create(IProject aProject,
-			String aComponentName) {
-		return new ComponentHandle(aProject, aComponentName);
-	}
-
-	/**
-	 * Creates a component handle that indicates a component identified by
-	 * <code>aComponentURI</code>. The project specified by
-	 * <code>aContext</code> is used to resolve the component if the component
-	 * URI is not fully qualified.
-	 * 
-	 * @param aContext
-	 *            A starting place to begin resolving the component
-	 * @param aComponentURI
-	 *            A URI that is either fully qualified or relative to the
-	 *            supplied project
-	 * @return A ComponentHandle that references the component resolved from the
-	 *         URI.
-	 */
-	public static ComponentHandle create(IProject aContext, URI aComponentURI) {
-		IProject componentProject = null;
-		String componentName = null;
-		if (aComponentURI == null)
-			return null;
-		if (aComponentURI.segmentCount() == 1) {
-			componentProject = aContext;
-			componentName = aComponentURI.segment(0);
-		} else {
-			try {
-				componentProject = StructureEdit
-						.getContainingProject(aComponentURI);
-				componentName = StructureEdit.getDeployedName(aComponentURI);
-			} catch (UnresolveableURIException e) {
-				return null;
-			}
-		}
-
-		return new ComponentHandle(componentProject, componentName);
-	}
-
-	/**
-	 * @return A string representation of the form [projectpath]:componentName
-	 */
-	public String toString() {
-		if (toString == null)
-			toString = "[" + project.getFullPath() + "]:" + name; //$NON-NLS-1$ //$NON-NLS-2$   
-		return toString;
-	}
-
-	/**
-	 * @return A hashCode derived from the string representation
-	 */
-	public int hashCode() {
-		if (hashCode == 0)
-			hashCode = toString().hashCode();
-		return hashCode;
-	}
-
-	/**
-	 * @param obj
-	 *            Another object to compare for equality.
-	 * @return true if obj instanceof ComponentHandle && this.project ==
-	 *         obj.project && this.name == obj.name
-	 */
-	public boolean equals(Object obj) {
-		if (obj instanceof ComponentHandle) {
-			ComponentHandle other = (ComponentHandle) obj;
-			return getProject().equals(other.getProject())
-					&& ((getName() == null && other.getName() == null) || getName()
-							.equals(other.getName()));
-		}
-		return false;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IFlexibleProject.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IFlexibleProject.java
deleted file mode 100644
index 98990ec..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IFlexibleProject.java
+++ /dev/null
@@ -1,64 +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.componentcore.resources;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IProgressMonitor;
-
-/**
- * Represents a project that supports a flexible project model.
- * <p>
- * Flexible projects contain logical "workbench components" which allow clients
- * to group project resources to satisfy certain expected structures.
- * </p>
- * 
- * @since 1.0
- */
-public interface IFlexibleProject {
-	/**
-	 * Finds and returns the components within this project, defined by the
-	 * component model.
-	 * 
-	 * @return the array of components within this project
-	 */
-	IVirtualComponent[] getComponents();
-
-	/**
-	 * Finds and returns the component within this project, defined by the
-	 * component model, specified by the component name. Returns
-	 * <code>null</code> if no such component exists.
-	 * 
-	 * @param aComponentName
-	 *            the string name of the component
-	 * @return the component within this project with the given name or
-	 *         <code>null</code> if no such component exists
-	 */
-	IVirtualComponent getComponent(String aComponentName);
-
-	/**
-	 * Returns the underlying IProject
-	 * 
-	 * @return the underlying IProject
-	 */
-	IProject getProject();
-
-	/**
-	 * @return true if the underlying IProject is flexible
-	 */
-	boolean isFlexible();
-
-	/**
-	 * Creates an IFlexible Project model for the underlying IProject. Assumes a
-	 * valid IProject has already been created.	
-	 */
-	void create(int theFlags, IProgressMonitor aMonitor);
-
-}
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 8f1a6d5..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualComponent.java
+++ /dev/null
@@ -1,146 +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.componentcore.resources;
-
-import java.util.Properties;
-
-import org.eclipse.core.runtime.IPath;
-
-/**
- * Represents a component as defined by the .wtpmodules file.
- * <p>
- * A component is a container of virtual resources which has other features that describe the
- * component including:
- * <ul>
- * <li>{@link #getComponentTypeId()}
- * </p>
- * @since 1.0
- */
-public interface IVirtualComponent extends IVirtualContainer {
-
-	/**
-	 * The name of the component must be unique within its enclosing project.
-	 * 
-	 * @return The name of the component.
-	 */
-	String getName();
-
-	/**
-	 * 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();
-
-	/**
-	 * 
-	 * 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();
-
-	/**
-	 * 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);
-
-	/**
-	 * Returns all virtual resources of a given type. 
-	 * <p>
-	 * Virtual Resources can have a
-	 * {@link org.eclipse.wst.common.componentcore.internal.ComponentResource#getResourceType() type}&nbsp;
-	 * associated with them. This method will find those resources
-	 * which are tagged with a given resource type The returned array
-	 * could be a mix of {@link IVirtualFile}s or {@link IVirtualFolder}s 
-	 * </p>
-	 * <p><b>null</b> may be supplied to this method, which will return all resources without a resourceType.</p> 
-	 * 
-	 * @param aResourceType A client-defined resource type that was used to create 0 or more resources within this component
-	 * @return An array of those resources which matched the resourceType
-	 */
-	IVirtualResource[] getResources(String aResourceType);
-
-	/**
-	 * 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);
-
-
-}
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 549d2bd..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualContainer.java
+++ /dev/null
@@ -1,281 +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.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>
- * @since 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()
-	 * @since 2.0
-	 */
-	public IVirtualResource[] members(int memberFlags) throws CoreException;
-}
- 
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 53a3588..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, 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.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>
- * @since 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 aa3d6fe..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, 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.componentcore.resources;
-
-import org.eclipse.core.resources.IFolder;
-/**
- * Represents a folder that can be navigated through 
- * an abstract ("virtual") path.
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * @since 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 IFolder 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 IFolder[] 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 b423d93..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, 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.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>
- * @since 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 de78d92..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualResource.java
+++ /dev/null
@@ -1,389 +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.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>
- * @since 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>
-	 * 
-	 * @since 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.
-	 * 
-	 * @since 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;
-
-	/**   
-	 * 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 7c679b7..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>modulecore 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.xml b/plugins/org.eclipse.wst.common.modulecore/plugin.xml
deleted file mode 100644
index fca1b24..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/plugin.xml
+++ /dev/null
@@ -1,103 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="org.eclipse.wst.common.modulecore"
-   name="Modulecore Plug-in"
-   version="1.0.0"
-   provider-name=""
-   class="org.eclipse.wst.common.componentcore.internal.ModulecorePlugin">
-
-   <runtime>
-      <library name="modulecore.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-
-   <requires>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.eclipse.wst.common.frameworks"/>
-      <import plugin="org.eclipse.core.resources"/>
-      <import plugin="org.eclipse.emf.ecore"/>
-      <import plugin="org.eclipse.wst.common.emfworkbench.integration"/>
-      <import plugin="org.eclipse.wst.common.emf"/>
-      <import plugin="org.eclipse.emf.ecore.xmi"/>
-      <import plugin="org.eclipse.wst.server.core"/>
-      <import plugin="org.eclipse.core.commands"/>
-      <import plugin="org.eclipse.emf.edit"/>
-   </requires>
-
-   
-   <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=".wtpmodules"/>
-      </editModel> 
-   </extension>
-   <!--============================-->
-   <!-- Component Structural Builder Contribution-->
-   <!--============================-->
-   <extension
-         id="ComponentStructuralBuilder"
-         name="Component Structural Builder"
-         point="org.eclipse.core.resources.builders">
-      <builder>
-         <run
-               class="org.eclipse.wst.common.componentcore.internal.builder.ComponentStructuralBuilder">
-         </run>
-      </builder>
-   </extension>
-   <extension
-         id="ComponentStructuralBuilderDependencyResolver"
-         name="Component Structural Dependency Resolver"
-         point="org.eclipse.core.resources.builders">
-      <builder>
-         <run
-               class="org.eclipse.wst.common.componentcore.internal.builder.ComponentStructuralBuilderDependencyResolver">
-         </run>
-      </builder>
-   </extension>
-   <!--============================-->
-   <!-- Builder Provider registrations-->
-   <!--============================-->
-   <extension
-         point="org.eclipse.wst.common.frameworks.DataModelProviderExtension">
-      <DataModelProvider
-            class="org.eclipse.wst.common.componentcore.internal.builder.ReferencedComponentBuilderDataModelProvider"
-            id="org.eclipse.wst.common.componentcore.internal.builder.ReferencedComponentBuilderDataModelProvider"/>
-      <ProviderDefinesType
-      		providerType="dependent.builder"
-      		providerID="org.eclipse.wst.common.componentcore.internal.builder.ReferencedComponentBuilderDataModelProvider"/>
-	</extension>
-	
-	<extension point="org.eclipse.core.runtime.contentTypes">
- 			<file-association
-				content-type="org.eclipse.core.runtime.xml"
-				file-names=".wtpmodules"/>
-	</extension>
-   
-</plugin>
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 065ac06..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.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<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 db7cdf2..0000000
--- a/plugins/org.eclipse.wst.common.ui/.cvsignore
+++ /dev/null
@@ -1,5 +0,0 @@
-bin
-ui.jar
-build.xml
-temp.folder
-org.eclipse.wst.common.ui_1.0.0.jar
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/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/build.properties b/plugins/org.eclipse.wst.common.ui/build.properties
deleted file mode 100644
index 89adbc5..0000000
--- a/plugins/org.eclipse.wst.common.ui/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-bin.includes = plugin.properties,\
-               plugin.xml,\
-               ui.jar
-jars.compile.order = ui.jar
-source.ui.jar = src/
-output.ui.jar = bin/
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 a071f69..0000000
--- a/plugins/org.eclipse.wst.common.ui/component.xml
+++ /dev/null
@@ -1,61 +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" />
-	<plugin id="org.eclipse.wst.common.dependencychecker" fragment="false" />
-
-<!--	<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" />
-		<type name="URIResolver" />
-		<type name="URIResolverExtension" />
-	</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 d704fdb..0000000
--- a/plugins/org.eclipse.wst.common.ui/plugin.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="org.eclipse.wst.common.ui"
-   name="Eclipse Base UI extensions"
-   version="1.0.0"
-   provider-name="Eclipse.org"
-   class="org.eclipse.wst.common.ui.internal.UIPlugin">
-
-   <runtime>
-      <library name="ui.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.core.runtime.compatibility"/>
-      <import plugin="org.eclipse.ui.ide"/>
-      <import plugin="org.eclipse.ui.views"/>
-      <import plugin="org.eclipse.jface.text"/>
-      <import plugin="org.eclipse.ui.workbench.texteditor"/>
-      <import plugin="org.eclipse.ui.editors"/>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.eclipse.core.resources"/>
-   </requires>
-   
-    <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 2786bcb..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.examples.xml.org.eclipse.wst.examples">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.examples.xml.org.eclipse.wst.examples" 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>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  Unique identifier for the extension
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  Optional name of the extension
-               </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>
-         November 2004
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &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;
-      </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) 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
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/ImageFactory.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/ImageFactory.java
deleted file mode 100644
index 925bde8..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/ImageFactory.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - Initial API and implementation
-*   Jens Lukowski/Innoopract - initial renaming/restructuring
-* 
-*/
-package org.eclipse.wst.common.ui.internal;
-
-import java.util.Hashtable;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.ui.internal.ide.misc.OverlayIcon;
-import org.eclipse.ui.internal.misc.OverlayComposite;
-
-public class ImageFactory
-{                                
-  public static final String copyright = "(c) Copyright IBM Corporation 2000, 2002.";
-  public static final int TOP_LEFT = 1;
-  public static final int TOP_RIGHT = 2;
-  public static final int BOTTOM_LEFT = 3;
-  public static final int BOTTOM_RIGHT = 4;     
-
-  protected static final int[][] OVERLAY_COORDINATE = {{0,0},{0,2},{2,0},{2,2}};
-
-  protected Hashtable compositeImageTable = new Hashtable();
-
-  public ImageFactory()
-  {
-  }
-
-  public Image createCompositeImage(Image a, Image b)
-  {
-    String key = a + "*" + b;
-    Image result = (Image)compositeImageTable.get(key);
-    if (result == null)
-    {
-      OverlayComposite composite = new OverlayComposite(a.getImageData());
-      composite.addForegroundImage(b.getImageData());
-      result = composite.createImage();
-      compositeImageTable.put(key, result);
-    }
-    return result;
-  }
-
-  public Image createCompositeImage(Image base, Image overlay, int overlayPosition)
-  {                                                   
-    String key = base + "*" + overlay + "*" + overlayPosition;
-    Image result = (Image)compositeImageTable.get(key);
-    if (result == null)
-    {
-      ImageDescriptor overlays[][] = new ImageDescriptor[3][3]; 
-      int[] coord = OVERLAY_COORDINATE[overlayPosition];
-      overlays[coord[1]][coord[0]] = new ImageBasedImageDescriptor(overlay);
-      OverlayIcon icon = new OverlayIcon(new ImageBasedImageDescriptor(base), overlays, new Point(16, 16));
-      result = icon.createImage();
-      compositeImageTable.put(key, result);
-    }
-    return result;
-  }  
-
-
-  public static ImageDescriptor createImageDescriptorWrapper(Image image)
-  {
-    return new ImageBasedImageDescriptor(image);
-  }
-
-
-  protected static class ImageBasedImageDescriptor extends ImageDescriptor
-  {
-    protected Image image;
-
-    public ImageBasedImageDescriptor(Image image)
-    {
-      this.image = image;
-    }                    
-
-    public ImageData getImageData()
-    {
-      return image.getImageData();
-    }
-  }  
-}
-
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/OverlayIconManager.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/OverlayIconManager.java
deleted file mode 100644
index 24f6616..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/OverlayIconManager.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - Initial API and implementation
-*   Jens Lukowski/Innoopract - initial renaming/restructuring
-* 
-*/
-package org.eclipse.wst.common.ui.internal;
-
-import org.eclipse.core.resources.*;
-//import org.eclipse.jface.resource.*;
-import org.eclipse.jface.viewers.*;
-//import org.eclipse.swt.events.*;
-import org.eclipse.swt.graphics.*; 
-import org.eclipse.swt.widgets.Display;
-import java.util.*;
- 
-/**         
- * This class used to track the icon overlays that should be used to decorate the icons in a view.  
- * Clients should implement the method 'locateObjectForOffset()' that will be used to associate a model object with each marker.
- * When markers are changed, a table of objects -> markers is maintained.  When the time comes to display the object in a view
- * the client can call 'getOverlayImageForObject()' to determine the annotation image that should be used when displaying the object.
- */
-public abstract class OverlayIconManager
-{ 
-	public static final String copyright = "(c) Copyright IBM Corporation 2000, 2002.";
-	protected IResource resource;
-	protected IWorkspace workspace;    
-	protected Hashtable hashtable = new Hashtable();
-	protected ResourceChangeListener resourceChangeListener = new ResourceChangeListener();
-	protected List viewerList = new Vector();     
- 
-	// todo... get images for these other kinds of markers
-	//                                        
-	protected static final Image taskOverlayImage = null; //B2BGUIPlugin.getInstance().getImage("icons/error-overlay.gif");
-	protected static final Image bookmarkOverlayImage = null; //B2BGUIPlugin.getInstance().getImage("icons/error-overlay.gif");
-	protected static final Image problemInfoOverlayImage = null; //B2BGUIPlugin.getInstance().getImage("icons/error-overlay.gif");
-// TODO protected static final Image problemWarningOverlayImage = B2BGUIPlugin.getInstance().getImage("icons/warning-overlay.gif");
-	protected static final Image problemWarningOverlayImage = null;
-// TODO protected static final Image problemErrorOverlayImage = B2BGUIPlugin.getInstance().getImage("icons/error-overlay.gif");
-	protected static final Image problemErrorOverlayImage = null;
-
-	/**
-	 * Internal resource change listener.
-	 */
-	class ResourceChangeListener implements IResourceChangeListener 
-	{
-		protected boolean needsUpdate;
-
-		public void resourceChanged(IResourceChangeEvent e) 
-		{	      
-			//if (e.getResource() == resource)
-			{
-				if (!needsUpdate)
-				{           
-					needsUpdate = true;
-					Runnable delayedUpdate = new Runnable()
-					{
-						public void run()
-						{
-							doUpdate();
-						}
-					}; 
-
-					// It seems like this current dislay is actually coming back null sometimes.
-					// Without this test we get an occasional NPE logged (defect 187099).
-					if (Display.getCurrent() != null)
-					{ 
-						Display.getCurrent().asyncExec(delayedUpdate);
-					}
-				}             
-			}
-		}
-
-		public void doUpdate()
-		{              
-			needsUpdate = false;
-			update();
-		}
-	};   
-                                                        
-
-	public OverlayIconManager()
-	{
-	}       
-
-
-	public void setResource(IResource newResource)
-	{
-		this.resource = newResource; 
-		setWorkspace(newResource != null ? newResource.getWorkspace() : null);
-	}     
-
-              
-	// I'm not sure why there can be more than 1 workspace.... do I misunderstand something?
-	protected void setWorkspace(IWorkspace newWorkspace)
-	{
-		if (workspace != null && workspace != newWorkspace)
-		{
-			workspace.removeResourceChangeListener(resourceChangeListener);
-		} 
-		if (newWorkspace != null)
-		{
-			newWorkspace.addResourceChangeListener(resourceChangeListener);
-		}
-		workspace = newWorkspace;
-	}
-
-  
-	//
-	public IResource getResource()
-	{
-		return resource;
-	}       
-
-	public void addViewer(Viewer viewer)
-	{
-		viewerList.add(viewer);
-	}                 
-
-	public void removeViewer(Viewer viewer)
-	{
-		viewerList.remove(viewer);
-	}      
-
-	protected void updateListeners()
-	{
-		for (Iterator i = viewerList.iterator(); i.hasNext(); )
-		{
-			Viewer viewer = (Viewer)i.next();
-
-			// Make sure the viewer is not disposed before calling refresh on it
-			if ( viewer.getControl() != null && 
-					!viewer.getControl().isDisposed() )
-			{
-				viewer.refresh();
-			}
-		}
-	}
-  
-	public void update()
-	{   
-		// if resource is null, do nothing                        
-		if (resource == null)
-			return;
-      
-		try
-		{                                                                         
-			hashtable = new Hashtable();                  
-			IMarker[] markers = resource.findMarkers(IMarker.MARKER, true, IResource.DEPTH_ZERO);
-			for (int i = 0 ; i < markers.length; i++)
-			{       
-				IMarker marker = markers[i];
-				Object object = locateObjectForMarker(marker);
-				Object key = object != null ? getKeyForObject(object) : null;
-				if (key != null)
-				{                     
-					hashtable.put(key, marker);
-				}
-			}   
-		}
-		catch (Exception e)
-		{   
-// TODO			B2BGUIPlugin.getPlugin().getMsgLogger().writeCurrentThread(); 
-		}
-		updateListeners();
-	}
-
-
-	protected abstract Object locateObjectForOffset(int offset);
-                                                          
-	protected Object locateObjectForMarker(IMarker marker)
-	{ 
-		Object result = null;
-		int offset = marker.getAttribute(IMarker.CHAR_START, -1);
-		if (offset != -1)
-		{
-			result = locateObjectForOffset(offset);
-		}
-		return result;
-	}    
-
-
-	protected Object getKeyForObject(Object object)
-	{     
-		return object;
-	}    
-
-                                                   
-	public Image getOverlayImageForObject(Object object)
-	{ 
-		Image result = null;                                          
-		try
-		{
-			IMarker marker = getMarkerForObject(object);
-			if (marker != null)
-			{          
-				if (marker.isSubtypeOf(IMarker.TASK)) 
-				{
-					result= taskOverlayImage;
-				} 
-				else if (marker.isSubtypeOf(IMarker.BOOKMARK)) 
-				{
-					result = bookmarkOverlayImage;
-				}
-				else if (marker.isSubtypeOf(IMarker.PROBLEM))
-				{
-					switch (marker.getAttribute(IMarker.SEVERITY, IMarker.SEVERITY_INFO)) 
-					{                                 
-						case IMarker.SEVERITY_INFO:     { result = problemInfoOverlayImage; break; }
-						case IMarker.SEVERITY_WARNING:  { result = problemWarningOverlayImage; break; }
-						case IMarker.SEVERITY_ERROR:    { result = problemErrorOverlayImage; break; }
-					}			
-				}     
-			}
-		}
-		catch (Exception e)
-		{
-		}
-		return result;
-	}  
-
-
-	public IMarker getMarkerForObject(Object object)
-	{           
-		IMarker result = null;
-		Object key = object != null ? getKeyForObject(object) : null;
-		if (key != null)
-		{                     
-			result = (IMarker)hashtable.get(key);
-		}         
-		return result;
-	}       
-}
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 fcdd6a9..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/UIPlugin.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - 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/WindowUtility.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/WindowUtility.java
deleted file mode 100644
index 2c7127c..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/WindowUtility.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - Initial API and implementation
-*   Jens Lukowski/Innoopract - initial renaming/restructuring
-* 
-*/
-package org.eclipse.wst.common.ui.internal;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Shell;
-
-public class WindowUtility
-{
-	public static final String copyright = "(c) Copyright IBM Corporation 2000, 2002.";
-	public static Object getSelection(ISelection selection)
-	{
-		if (selection == null)
-		{
-			return null;
-		} // end of if ()
-
-		Object result = null;
-		if (selection instanceof IStructuredSelection)
-		{
-			 IStructuredSelection es= (IStructuredSelection)selection;
-			 Iterator i= es.iterator();
-			 if (i.hasNext())
-			 {
-				 result= i.next();
-			 }
-		}                     
-		return result;
-	}
-
-	public static List getSelectionList(ISelection selection)
-	{
-		List result = null;
-		if (selection != null)
-		{
-			if (selection instanceof IStructuredSelection)
-			{
-				IStructuredSelection es= (IStructuredSelection)selection;
-				result = new Vector();
-				for (Iterator i= es.iterator(); i.hasNext(); )
-				{
-					result.add(i.next());
-				}
-			}
-		}                     
-		return result;
-	} 
-
-	public static void openErrorCreatingFile(Shell shell, IResource resource)
-	{                   
-		 String title = null;
-		 String briefMessage = null;
-		 String reason = null;
-		 String details = null;
-
-//	KCPort TODO
-//		 title = B2BGUIPlugin.getInstance().getString("_UI_ERROR_CREATING_FILE_TITLE");
-//		 briefMessage = B2BGUIPlugin.getInstance().getString("_UI_ERROR_CREATING_FILE_SHORT_DESC", resource.getName());
-//		 details = B2BGUIPlugin.getInstance().getString("_UI_ERROR_CREATING_FILE_LONG_DESC", resource.getLocation().toOSString()); 
-//      
-//		 IResource parent = resource.getParent();     
-//		 if (parent != null) 
-//		 {                   
-//			 if (parent.isReadOnly())
-//			 {
-//				 reason = B2BGUIPlugin.getInstance().getString("_UI_PARENT_FOLDER_IS_READ_ONLY", parent.getName());     
-//			 }
-//			 else
-//			 {
-//				 // on windows the isReadOnly() = false for read only shared directory... so we give a hint
-//				 reason = B2BGUIPlugin.getInstance().getString("_UI_UNKNOWN_ERROR_WITH_HINT", parent.getName());  
-//			 }
-//		 } 
-//
-//		 if (reason == null)
-//		 {
-//			 reason = B2BGUIPlugin.getInstance().getString("_UI_UNKNOWN_ERROR");
-//		 }
-
-		 openError(shell, title, briefMessage, reason, details);
-	}      
-
-	public static void openError(Shell shell, String title, String briefMessage, String reason, String detailedMessage)
-	{
-		ErrorDialog.openError(shell, title, briefMessage, createStatus(reason, detailedMessage));                                  
-	}      
-
-	private static IStatus createStatus(String reason, String msg)
-	{
-// KCPort TODO
-//	  String pluginId = B2BGUIPlugin.getInstance().getDescriptor().getUniqueIdentifier();
-	  String pluginId = "";
-		MultiStatus multiStatus = new MultiStatus(pluginId, 0, reason, null);
-		Status status = new Status(IStatus.ERROR, pluginId, 0, msg, null);
-		multiStatus.add(status);
-		return multiStatus;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/actionhandler/ActionHandlerListener.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/actionhandler/ActionHandlerListener.java
deleted file mode 100644
index 2a8f0d8..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/actionhandler/ActionHandlerListener.java
+++ /dev/null
@@ -1,325 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - Initial API and implementation
-*   Jens Lukowski/Innoopract - initial renaming/restructuring
-* 
-*/
-package org.eclipse.wst.common.ui.internal.actionhandler;
-
-import java.util.ArrayList;
-
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.window.ApplicationWindow;
-import org.eclipse.swt.events.MenuEvent;
-import org.eclipse.swt.events.MenuListener;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IPartListener;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.internal.PartSite;
-import org.eclipse.wst.common.ui.internal.actionhandler.action.CopyAction;
-import org.eclipse.wst.common.ui.internal.actionhandler.action.CutAction;
-import org.eclipse.wst.common.ui.internal.actionhandler.action.EditAction;
-import org.eclipse.wst.common.ui.internal.actionhandler.action.PasteAction;
-
-
-
-public class ActionHandlerListener implements IPartListener, MenuListener
-{
-  public static final String copyright = "(c) Copyright IBM Corporation 2000, 2002.";
-  
-  /**
-   * Constructor for ActionHandlerListener.
-   */
-  public ActionHandlerListener()
-  {
-    super();
-    createEditActions();
-  }
-
-  /**
-   * Method connectPart.  This call registers your part to the actionhandler listener
-   * if it hasn't been registered already and hooks up the generic cut/copy/paste action handlers.
-   * Invoke this method from the init() routine of your #IViewPart or #IEditorPart if you do not
-   * have any custom cut/copy/paste action handlers.
-   * 
-   * If you have a customized cut/copy/paste action handlers, invoke this method after you
-   * have finished your custom processing to add/remove your actionhandlers.
-   * 
-   * @param part - the workbench part that you would like to connect the generic cut/copy/paste handlers
-   */
-  static public void connectPart(IWorkbenchPart part)
-  {
-    getInstance().connectWorkbenchPart(part);
-  }
-
-  static protected ActionHandlerListener actionHandlerListener;
-  static protected ActionHandlerListener getInstance()
-  {
-		if (actionHandlerListener == null)
-		{
-			actionHandlerListener = new ActionHandlerListener();
-		}
-    return actionHandlerListener;
-  }
-  
-  
-  
-  protected ArrayList workbenchWindows = new ArrayList();
-  public void listenToWorkbenchWindow(IWorkbenchWindow workbenchWindow)
-  {
-    if (!workbenchWindows.contains(workbenchWindow))
-    {
-      workbenchWindows.add(workbenchWindow);
-      workbenchWindow.getPartService().addPartListener(this);
-      MenuManager editMenu = (MenuManager) ((ApplicationWindow)workbenchWindow).getMenuBarManager().findMenuUsingPath(IWorkbenchActionConstants.M_EDIT);
-      if (editMenu != null)
-        editMenu.getMenu().addMenuListener(this);
-    }
-  }
-  
-  protected void createEditActions()
-  {
-    cut = new CutAction();
-    copy = new CopyAction();
-    paste = new PasteAction();
-  }
-  
-  protected IActionBars getActionBars(IWorkbenchPart part)
-  {
-    IActionBars actionBars = null;
-    if (part != null)
-    {
-      IWorkbenchPartSite partSite = part.getSite();
-      if (partSite instanceof PartSite)
-      {
-        actionBars = ((PartSite)partSite).getActionBars();
-      }
-    }
-    return actionBars;
-  }
-
-  /**
-   * Method connectWorkbenchPart.  Ensure we are already listening to the workbenchwindow,
-   * register the part's id and then connect the cut/copy/paste actions
-   * @param part
-   */
-  public void connectWorkbenchPart(IWorkbenchPart part)
-  {
-    IWorkbenchWindow wbw = part.getSite().getWorkbenchWindow();
-    listenToWorkbenchWindow(wbw);
-    registerPartId(part);
-    connectCutCopyPasteActions(part);
-  }
-
-  /**
-   * Method isRegisteredPart.  Returns whether the part has already been
-   * registered as being a candidate for the generic cut/copy/paste actions.
-   * 
-   * @param part
-   * @return boolean
-   */
-  public boolean isRegisteredPart(IWorkbenchPart part)
-  {
-    String partId = part.getSite().getId();
-    return registeredParts.contains(partId);
-  }
-    
-  protected ArrayList registeredParts = new ArrayList();
-  protected void registerPartId(IWorkbenchPart part)
-  {
-    if (!isRegisteredPart(part))
-    {
-      String partId = part.getSite().getId();
-      registeredParts.add(partId);
-    }
-  }
-  
-  /**
-   * Method connectCutCopyPasteActions.  Connect the cut/copy/paste actions
-   * to the workbench part.
-   * 
-   * @param part
-   */
-  public void connectCutCopyPasteActions(IWorkbenchPart part)
-  {
-    IActionBars actionBars = getActionBars(part);
-    if (actionBars != null)
-    {
-      part.getSite().getKeyBindingService().registerAction(cut);
-      part.getSite().getKeyBindingService().registerAction(copy);
-      part.getSite().getKeyBindingService().registerAction(paste);
-      //connectCutCopyPasteActions(actionBars);
-    }
-  }
-  
-  
-  /**
-   * Method connectCutCopyPasteActions.  Only set the actionhandlers if
-   * there isn't one active for the appropriate action.
-   * 
-   * @param actionBars
-   */
-  public void connectCutCopyPasteActions(IActionBars actionBars)
-  {
-    if (actionBars.getGlobalActionHandler(ActionFactory.CUT.getId()) == null)
-    {
-      actionBars.setGlobalActionHandler(ActionFactory.CUT.getId(), cut);
-    }
-    if (actionBars.getGlobalActionHandler(ActionFactory.COPY.getId()) == null)
-    {
-      actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(), copy);
-    }
-    if (actionBars.getGlobalActionHandler(ActionFactory.PASTE.getId()) == null)
-    {
-      actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(), paste);
-    }
-    enableActions();
-    actionBars.updateActionBars();  
-  }
-
-  protected IWorkbenchPart getWorkbenchPart()
-  {
-    IWorkbenchWindow wbw = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-    if (wbw == null)
-      return null;
-      
-    IWorkbenchPage wbp = wbw.getActivePage();
-    if (wbp == null)
-      return null;
-      
-    return wbp.getActivePart();
-  }
-      
-  protected void updateActions()
-  {
-    IWorkbenchPart part = getWorkbenchPart();
-    if (part != null &&
-        isRegisteredPart(part))
-    {
-      IActionBars actionBars = getActionBars(part);
-      
-      Control focusControl = cut.getFocusControl();
-      boolean enable = true;
-      if (isValidFocusControl() &&
-          actionBars != null)
-      {
-        String clipboardText = paste.getClipboardText();
-        String selectionText = copy.getSelectionText();
-        boolean isReadOnly = paste.isReadOnlyFocusControl();
-        boolean clipboardNotEmpty = clipboardText != null && !clipboardText.equals("");
-        boolean textSelected = selectionText != null && !selectionText.equals("");
-        
-        cut.setEnabled(!isReadOnly && textSelected);
-        copy.setEnabled(textSelected && !(focusControl instanceof Combo && isReadOnly));
-        paste.setEnabled(!isReadOnly && clipboardNotEmpty);
-      }
-      else
-      {
-        cut.setEnabled(false);
-        copy.setEnabled(false);
-        paste.setEnabled(false);
-      }      
-      actionBars.updateActionBars();     
-    }
-  }
-  
-  protected boolean isValidFocusControl()
-  {
-    // delgate to one of the edit actions
-    return cut.isValidFocusControl();
-  }
-  
-  protected void enableActions()
-  {
-    cut.setEnabled(true);
-    copy.setEnabled(true);
-    paste.setEnabled(true);
-  }    
- 
-  /**
-   * Connect the cut/copy/paste actions if a registered part is activated.
-   * 
-   * @see IPartListener#partActivated(IWorkbenchPart)
-   */
-  public void partActivated(IWorkbenchPart part)
-  {
-    if (isRegisteredPart(part))
-    {
-//      System.out.println("registered part activated" + part);
-      connectCutCopyPasteActions(part);
-    }
-  }
-
-  protected EditAction cut,copy,paste;
-
-  /**
-   * @see IPartListener#partBroughtToTop(IWorkbenchPart)
-   */
-  public void partBroughtToTop(IWorkbenchPart part)
-  {
-  }
-  /**
-   * @see IPartListener#partClosed(IWorkbenchPart)
-   */
-  public void partClosed(IWorkbenchPart part)
-  {
-  }
-  /**
-   * @see IPartListener#partDeactivated(IWorkbenchPart)
-   */
-  public void partDeactivated(IWorkbenchPart part)
-  {
-  }
-  /**
-   * @see IPartListener#partOpened(IWorkbenchPart)
-   */
-  public void partOpened(IWorkbenchPart part)
-  {
-  }
-
-
-  /**
-   * If the menu is hidden on a registered part, then renable all actions.  This
-   * takes away the need for us to monitor the control traversal.  If the individual
-   * action isn't applicable when it is invoked, the action becomes a no op.
-   * @see MenuListener#menuHidden(MenuEvent)
-   */
-  public void menuHidden(MenuEvent e)
-  {
-    IWorkbenchPart part = getWorkbenchPart();
-    if (part != null &&
-        isRegisteredPart(part))
-    {
-      enableActions();
-   
-      IActionBars actionbars = getActionBars(part);
-      actionbars.updateActionBars();
-    }
-  }
-
-  /**
-   * Update the cut/copy/paste enablement (if a registered part is active) just
-   * before showing the edit menu.
-   * 
-   * @see MenuListener#menuShown(MenuEvent)
-   */
-  public void menuShown(MenuEvent e)
-  {
-    updateActions();
-  }
-
-}
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/actionhandler/action/CopyAction.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/actionhandler/action/CopyAction.java
deleted file mode 100644
index 2e7a488..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/actionhandler/action/CopyAction.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - Initial API and implementation
-*   Jens Lukowski/Innoopract - initial renaming/restructuring
-* 
-*/
-package org.eclipse.wst.common.ui.internal.actionhandler.action;
-
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds;
-
-public class CopyAction extends EditAction
-{
-  public static final String copyright = "(c) Copyright IBM Corporation 2000, 2002.";
-
-  /* (non-Javadoc)
-   * @see org.eclipse.jface.action.IAction#getActionDefinitionId()
-   */
-  public String getActionDefinitionId()
-  {
-    return IWorkbenchActionDefinitionIds.COPY;
-  }
-
-  public void run()
-  {
-    Control control = getFocusControl();
-    if (control instanceof Text)
-    {
-      ((Text)control).copy();
-    }
-    else if (control instanceof StyledText)
-    {
-      ((StyledText)control).copy();
-    }
-    else if (control instanceof Combo)
-    {
-      ((Combo)control).copy();
-    }
-  }
-}
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/actionhandler/action/CutAction.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/actionhandler/action/CutAction.java
deleted file mode 100644
index 439e801..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/actionhandler/action/CutAction.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - Initial API and implementation
-*   Jens Lukowski/Innoopract - initial renaming/restructuring
-* 
-*/
-package org.eclipse.wst.common.ui.internal.actionhandler.action;
-
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds;
-
-public class CutAction extends EditAction
-{
-  public static final String copyright = "(c) Copyright IBM Corporation 2000, 2002.";
-
-  /* (non-Javadoc)
-   * @see org.eclipse.jface.action.IAction#getActionDefinitionId()
-   */
-  public String getActionDefinitionId()
-  {
-    return IWorkbenchActionDefinitionIds.CUT;
-  }
-
-  public void run()
-  {
-    Control control = getFocusControl();
-    if (control instanceof Text)
-    {
-      ((Text)control).cut();
-    }
-    if (control instanceof StyledText)
-    {
-      ((StyledText)control).cut();
-    }
-    if (control instanceof Combo)
-    {
-      ((Combo)control).cut();
-    }
-  }  
-}
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/actionhandler/action/EditAction.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/actionhandler/action/EditAction.java
deleted file mode 100644
index 9918d87..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/actionhandler/action/EditAction.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - Initial API and implementation
-*   Jens Lukowski/Innoopract - initial renaming/restructuring
-* 
-*/
-package org.eclipse.wst.common.ui.internal.actionhandler.action;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Text;
-
-public class EditAction extends Action
-{
-  public static final String copyright = "(c) Copyright IBM Corporation 2000, 2002.";
-  public Control getFocusControl()
-  {
-    return Display.getCurrent().getFocusControl();
-  }
-  
-  public String getClipboardText()
-  {
-    Control focusControl = getFocusControl();
-    if (focusControl != null)
-    {
-      Clipboard clipboard = new Clipboard(getFocusControl().getDisplay());
-      TextTransfer textTransfer = TextTransfer.getInstance();
-      String availableText = (String) clipboard.getContents(textTransfer);
-      clipboard.dispose();
-      return availableText;
-    }
-    return null;
-//	String string = "";
-//	if (OS.OpenClipboard (0)) {
-//		int hMem = OS.GetClipboardData (OS.IsUnicode ? OS.CF_UNICODETEXT : OS.CF_TEXT);
-//		if (hMem != 0) {
-//			int byteCount = OS.GlobalSize (hMem);
-//			int ptr = OS.GlobalLock (hMem);
-//			if (ptr != 0) {
-//				/* Use the character encoding for the default locale */
-//				TCHAR buffer = new TCHAR (0, byteCount / TCHAR.sizeof);
-//				OS.MoveMemory (buffer, ptr, byteCount);
-//				string = buffer.toString (0, buffer.strlen ());
-//				OS.GlobalUnlock (hMem);
-//			}
-//		}
-//		OS.CloseClipboard ();
-//	}
-//	return string;
-  }
-  
-  public String getSelectionText()
-  {
-    Control control = getFocusControl();
-    if (control instanceof Text)
-    {
-      return ((Text)control).getSelectionText();
-    }
-    if (control instanceof StyledText)
-    {
-      return ((StyledText)control).getSelectionText();
-    }
-    if (control instanceof Combo)
-    {
-      Combo combo = (Combo)control;
-      Point selection = combo.getSelection();
-	  return combo.getText().substring(selection.x, selection.y);
-    }
-    return "";
-  }
-  
-  public boolean isReadOnlyFocusControl()
-  {
-    Control control = getFocusControl();
-    if (control instanceof Text)
-    {
-      return !((Text)control).getEditable();
-    }
-    if (control instanceof StyledText)
-    {
-      return !((StyledText)control).getEditable();
-    }
-    if (control instanceof Combo)
-    {
-      Combo combo = (Combo)control;
-	  return (combo.getStyle() & SWT.READ_ONLY) == SWT.READ_ONLY;
-    }
-    return false;
-  }
-  
-  public boolean isValidFocusControl()
-  {
-    Control control = getFocusControl();
-    return (control instanceof Text ||
-            control instanceof StyledText ||
-            control instanceof Combo);
-  }
-}
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/actionhandler/action/PasteAction.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/actionhandler/action/PasteAction.java
deleted file mode 100644
index 38a25a5..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/actionhandler/action/PasteAction.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - Initial API and implementation
-*   Jens Lukowski/Innoopract - initial renaming/restructuring
-* 
-*/
-package org.eclipse.wst.common.ui.internal.actionhandler.action;
-
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds;
-
-public class PasteAction extends EditAction
-{
-  public static final String copyright = "(c) Copyright IBM Corporation 2000, 2002.";
-
-  /* (non-Javadoc)
-   * @see org.eclipse.jface.action.IAction#getActionDefinitionId()
-   */
-  public String getActionDefinitionId()
-  {
-    return IWorkbenchActionDefinitionIds.PASTE;
-  }
-
-  public void run()
-  {
-    Control control = getFocusControl();
-    if (control instanceof Text)
-    {
-      ((Text)control).paste();
-    }
-    if (control instanceof StyledText)
-    {
-      ((StyledText)control).paste();
-    }
-    if (control instanceof Combo)
-    {
-      ((Combo)control).paste();
-    }
-  }
-}
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 cec4bc6..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/dialogs/SelectSingleFileDialog.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - 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.IWorkbenchGraphicConstants;
-import org.eclipse.ui.internal.WorkbenchImages;
-import org.eclipse.wst.common.ui.internal.viewers.SelectSingleFileView;
-
-
-
-public class SelectSingleFileDialog extends TitleAreaDialog
-{            
-  public static final String copyright = "(c) Copyright IBM Corporation 2000, 2001, 2002.";
-  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(IWorkbenchGraphicConstants.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 4a7f330..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/dnd/DefaultDragAndDropCommand.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - 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
-{
-  public static final String copyright = "(c) Copyright IBM Corporation 2000, 2002.";
-  /**
-   * 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 634140e..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/dnd/DragAndDropCommand.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - 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 static final String copyright = "(c) Copyright IBM Corporation 2000, 2002.";
-  //  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 95c8fe5..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/dnd/DragAndDropManager.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - 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 static final String copyright = "(c) Copyright IBM Corporation 2000, 2002.";
-  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 5dfb568..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/dnd/ObjectTransfer.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - 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
-{
-  public static final String copyright = "(c) Copyright IBM Corporation 2000, 2002.";
-  /**
-   * 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 f9f30d0..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/dnd/ViewerDragAdapter.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - 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
-{
-  public static final String copyright = "(c) Copyright IBM Corporation 2000, 2002.";
-  /**
-   * 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 8e412b9..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/dnd/ViewerDropAdapter.java
+++ /dev/null
@@ -1,770 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - 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
-{
-  public static final String copyright = "(c) Copyright IBM Corporation 2000, 2002.";
-  /**
-   * 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/resource/ResourceDeleteListener.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/resource/ResourceDeleteListener.java
deleted file mode 100644
index 97bac99..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/resource/ResourceDeleteListener.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - Initial API and implementation
-*   Jens Lukowski/Innoopract - initial renaming/restructuring
-* 
-*/
-package org.eclipse.wst.common.ui.internal.resource;
-
-import java.util.ArrayList;
-
-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.swt.widgets.Display;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.wst.common.ui.internal.UIPlugin;
-
-
-public class ResourceDeleteListener implements IResourceChangeListener, IResourceDeltaVisitor
-{
-  public static final String copyright = "(c) Copyright IBM Corporation 2000, 2002.";
-  protected ArrayList recognizedEditorParts = new ArrayList();
-
-  public void addEditorPartClass(Class editorPartClass)
-  {
-    recognizedEditorParts.add(editorPartClass);
-  }
-
-  public void resourceChanged(IResourceChangeEvent event)
-  {
-    IResourceDelta resourceDelta = event.getDelta();
-
-    try
-    {
-      if (resourceDelta != null) 
-      {
-        resourceDelta.accept(this);
-      }
-    }
-    catch (Exception e)
-    {
-//      B2BGUIPlugin.getPlugin().getMsgLogger().write("Exception caught during resource change" + e);
-//      B2BGUIPlugin.getPlugin().getMsgLogger().writeCurrentThread(); 
-    }      
-  }
-
-  public boolean visit(IResourceDelta delta)
-  {
-    if (delta.getKind() == IResourceDelta.REMOVED)
-    {
-      // handle removed resource
-      //closeEditors(delta.getResource());
-      /*
-       * defect 235374
-       * Without ayncExec, RuntimeException is raised:
-       *   "The resource tree is locked for modifications."
-       *   from Resource.refreshLocal().
-       */
-      Display.getDefault().asyncExec
-        (new CloseEditors(recognizedEditorParts,delta.getResource()));
-    }
-    return true;
-  }
-
-  public static class CloseEditors implements Runnable
-  {
-    private IResource resource;
-    private ArrayList recognizedEditorParts;
-
-    public CloseEditors(ArrayList editorParts, IResource res)
-    {
-      recognizedEditorParts = editorParts;
-      resource = res;
-    }
-
-    public void run()
-    {
-      // close all associated editors that are editing this resource,
-      // if it is one of the recognizedEditorParts
-      IWorkbenchWindow windows[] = 
-        UIPlugin.getDefault().getWorkbench().getWorkbenchWindows();
-    
-      for (int i = 0; i < windows.length; i++) 
-      {
-        IWorkbenchPage pages[] = windows[i].getPages();
-      
-        for (int j = 0; j < pages.length; j++ ) 
-        {
-          IEditorPart editors[] = pages[j].getEditors();
-          for (int k = 0; k < editors.length; k++) 
-          {
-            IEditorPart editor = editors[k];
-            IEditorInput editorInput = editor.getEditorInput();
-          
-            if (editorInput instanceof IFileEditorInput) 
-            {
-              if (((IFileEditorInput)editorInput).getFile().equals(resource) &&
-                  recognizedEditorParts.contains(editor.getClass())) 
-              {
-                IWorkbenchPage page = pages[j];
-                page.closeEditor(editor, false);
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-            
-  /*
-  private void closeEditors(IResource deletedResource)
-  {
-    // close all associated editors that are editing this resource,
-    // if it is one of the recognizedEditorParts
-    IWorkbenchWindow windows[] = B2BGUIPlugin.getInstance().getWorkbench().getWorkbenchWindows();
-    
-    for (int i = 0; i < windows.length; i++) 
-    {
-      IWorkbenchPage pages[] = windows[i].getPages();
-      
-      for (int j = 0; j < pages.length; j++ ) 
-      {
-        IEditorPart editors[] = pages[j].getEditors();
-        for (int k = 0; k < editors.length; k++) 
-        {
-          IEditorPart editor = editors[k];
-          IEditorInput editorInput = editor.getEditorInput();
-          
-          if (editorInput instanceof IFileEditorInput) 
-          {
-            if (((IFileEditorInput)editorInput).getFile().equals(deletedResource) &&
-                recognizedEditorParts.contains(editor.getClass())) 
-            {
-              IWorkbenchPage page = pages[j];
-              org.eclipse.swt.widgets.
-                Display.getDefault().asyncExec(new CloseEditor(page, editor));
-            }
-          }
-        }
-      }
-    }
-  }
-  */
-
-  public static class CloseEditor implements Runnable
-  {
-    protected IWorkbenchPage page;
-    protected IEditorPart editor;
-    public CloseEditor(IWorkbenchPage page, IEditorPart editor)
-    {
-      this.page = page;
-      this.editor = editor;
-    }
-    public void run()
-    {
-      page.closeEditor(editor, false);
-    }
-  }
-}
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/resources/ChangeHelper.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/resources/ChangeHelper.java
deleted file mode 100644
index 46a6802..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/resources/ChangeHelper.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - Initial API and implementation
-*   Jens Lukowski/Innoopract - initial renaming/restructuring
-* 
-*/
-package org.eclipse.wst.common.ui.internal.resources;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.wst.common.ui.internal.UIPlugin;
-
-
-public class ChangeHelper 
-{
-  public static final String copyright = "(c) Copyright IBM Corporation 2000, 2002.";
-  protected IEditorPart editor;
-
-  public ChangeHelper(IEditorPart editor)
-  {
-    this.editor = editor;
-  }
-
-  boolean handlingEditorInput = false;
-  
-  public void handleEditorInputChanged()
-  {
-    if (handlingEditorInput)
-      return;
-      
-    handlingEditorInput = true;
-    
-    if (isDeleted(editor.getEditorInput())) 
-    {
-      // if saveas is allowed, give the user an opportunity to 
-      // save the existing contents to another file
-      if (editor.isDirty() && editor.isSaveAsAllowed())
-      {
-      	boolean isDone = false;
-      	while (isDone == false)
-      	{
-      	  String[] buttons= { UIPlugin.getResourceString("_UI_SAVE_BUTTON"),
-		              UIPlugin.getResourceString("_UI_CLOSE_BUTTON") };
-         			
-          final MessageDialog msg = new MessageDialog(editor.getSite().getShell(),
-                                                      UIPlugin.getResourceString("_UI_FILE_CHANGED_TITLE"),
-                                                      null,
-                                                      UIPlugin.getResourceString("_UI_FILE_DELETED_SAVE_CHANGES"),
-                                                      MessageDialog.QUESTION,
-                                                      buttons,
-                                                      0);
-              
-          int rc = msg.open();
-          if (rc == 0) 
-          {
-            editor.doSaveAs();
-          }
-          else 
-          {
-            close(false);
-            break;
-          }
-          if (!editor.isDirty())//!isDeleted(editor.getEditorInput()))
-          {
-            isDone = true;
-          }
-      	}
-      	// refresh it so it gets removed from the workspace
-//      	WorkbenchUtility.refreshLocalWorkspaceFile(((IFileEditorInput)editor.getEditorInput()).getFile(), new NullProgressMonitor());
-      }
-      else 
-      {
-      	// otherwise time to shutdown the editor.
-//        MessageDialog.openConfirm(editor.getSite().getShell(), B2BGUIPlugin.getGUIString("_UI_FILE_CHANGED_TITLE"), B2BGUIPlugin.getGUIString("_UI_FILE_DELETED_EDITOR_CLOSED"));
-        close(false);
-      }
-    }
-    else 
-    {
-      // The file has just had its contents modified
-      if (editor instanceof IExternalChangeEditorListener)
-      {
-        
-        boolean rc = MessageDialog.openQuestion(editor.getSite().getShell(), UIPlugin.getResourceString("_UI_FILE_CHANGED_TITLE"), UIPlugin.getResourceString("_UI_FILE_CHANGED_LOAD_CHANGES"));
-        if (rc == true)
-        {
-          ((IExternalChangeEditorListener)editor).reload();
-        }
-      }
-    }
-    handlingEditorInput = false;
-  }
-
-  // close the editor
-  public void close(final boolean save)
-  {
-    Display display= editor.getSite().getShell().getDisplay();
-    display.asyncExec(new Runnable()
-    {
-      public void run()
-      {
-        editor.getSite().getPage().closeEditor(editor, save);
-      }
-    });
-  }
-  	
-  /*
-   * check if file is deleted
-   */
-  public boolean isDeleted(Object element)
-  {
-    if (element instanceof IFileEditorInput)
-    {
-      IFileEditorInput input= (IFileEditorInput) element;
-      
-      IPath path= input.getFile().getLocation();
-      if (path == null)
-      {
-        return true;
-      }
-      return !path.toFile().exists();
-    }
-    return false;
-  }
-}// ChangeHelper
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/resources/IExternalChangeEditorListener.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/resources/IExternalChangeEditorListener.java
deleted file mode 100644
index 5474096..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/resources/IExternalChangeEditorListener.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - Initial API and implementation
-*   Jens Lukowski/Innoopract - initial renaming/restructuring
-* 
-*/
-package org.eclipse.wst.common.ui.internal.resources;
-
-import org.eclipse.core.runtime.IPath;
-
-public interface IExternalChangeEditorListener 
-{
-  public static final String copyright = "(c) Copyright IBM Corporation 2000, 2002.";
-  public void handleEditorInputChanged();
-  public void handleEditorPathChanged(IPath newPath);  
-  public void reload();
-}
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/resources/IValidateEditEditor.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/resources/IValidateEditEditor.java
deleted file mode 100644
index d24fd7d..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/resources/IValidateEditEditor.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - Initial API and implementation
-*   Jens Lukowski/Innoopract - initial renaming/restructuring
-* 
-*/
-package org.eclipse.wst.common.ui.internal.resources;
-
-public interface IValidateEditEditor
-{
-  public static final String copyright = "(c) Copyright IBM Corporation 2002.";
-   public void undoChange();
-}
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/resources/PropertyResourceChangeListener.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/resources/PropertyResourceChangeListener.java
deleted file mode 100644
index be15730..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/resources/PropertyResourceChangeListener.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - Initial API and implementation
-*   Jens Lukowski/Innoopract - initial renaming/restructuring
-* 
-*/
-package org.eclipse.wst.common.ui.internal.resources;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IPropertyListener;
-import org.eclipse.wst.common.ui.internal.UIPlugin;
-
-
-public class PropertyResourceChangeListener extends ResourceChangeListener implements IPropertyListener
-{
-  public static final String copyright = "(c) Copyright IBM Corporation 2002.";
-  public PropertyResourceChangeListener(IEditorPart editPart)
-  {
-    super(editPart);
-    editPart.addPropertyListener(this); 
-  }
-
-  boolean dirtyState = false;
-  IFile[] iFileList = null;
-  IEditorPart editorPart = null;
-  Runnable currentRunnable = null;
-  boolean inValidateEditCall = false;
-  
-  public void propertyChanged(Object source, int propId) 
-  {
-    if (propId == IEditorPart.PROP_DIRTY)
-    {
-      if ((source instanceof IEditorPart) && (currentRunnable == null))
-      {
-        editorPart = (IEditorPart)source;
-        if (editorPart.isDirty() && (editorPart.getEditorInput() instanceof IFileEditorInput))
-        {
-		  IFileEditorInput editorInput = (IFileEditorInput)(editorPart.getEditorInput());
-          // Only call validateEdit if the file is read only
-          if (editorInput.getFile().isReadOnly()) 
-          {
-			iFileList = new IFile[1];
-           	iFileList[0] = editorInput.getFile();
-
-       	    currentRunnable = new Runnable()
-      	    { 
-              public void run()
-              {
-              	inValidateEditCall = true;                  
-            	IStatus status = ResourcesPlugin.getWorkspace().validateEdit(iFileList, editorPart.getSite().getShell());          
-            	if (status.getCode() != IStatus.OK)
-            	{ 
-	      	  	  ((IValidateEditEditor)editorPart).undoChange();
-              	  setDirtyState(editorPart.isDirty());
-              	  
-              	  if (status.getCode() == IStatus.ERROR)
-				    MessageDialog.openError(Display.getCurrent().getActiveShell() , 
-				    						UIPlugin.getResourceString("_UI_ERROR_VALIDATE_EDIT_FAIL_ONE_FILE"), 
-				    						status.getMessage());
-            	}
-            	else
-            	{
-            	  checkChanged(editorPart);
-            	}
-            	  
-            	inValidateEditCall = false;
-            	currentRunnable = null;
-              }   
-            };
-            
-            // we need to ensure that this is run via 'asyncExec' since these 
-            // notifications can come from a non-ui thread
-            if (Display.getCurrent() != null)
-              Display.getCurrent().timerExec(100,currentRunnable);
-            else
-              Display.getDefault().timerExec(100,currentRunnable);
-          }
-        }
-      }
-    }
-  }
-
-public boolean inValidateEditCall()
-{
-  return inValidateEditCall;	
-}
-
-/**
- * Gets the dirtyState.
- * @return Returns a boolean
- */
-public boolean getDirtyState() {
-	return dirtyState;
-}
-
-/**
- * Sets the dirtyState.
- * @param dirtyState The dirtyState to set
- */
-public void setDirtyState(boolean dirtyState) {
-	this.dirtyState = dirtyState;
-}
-
-}
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/resources/ResourceChangeListener.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/resources/ResourceChangeListener.java
deleted file mode 100644
index 18b64d4..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/resources/ResourceChangeListener.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - Initial API and implementation
-*   Jens Lukowski/Innoopract - initial renaming/restructuring
-* 
-*/
-package org.eclipse.wst.common.ui.internal.resources;
-
-import java.util.ArrayList;
-
-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.runtime.IPath;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IPartListener;
-import org.eclipse.ui.IWorkbenchPart;
-
-public class ResourceChangeListener implements IPartListener, IResourceChangeListener, IResourceDeltaVisitor
-{
-  public static final String copyright = "(c) Copyright IBM Corporation 2000, 2002.";
-  protected ArrayList recognizedEditorParts = new ArrayList();
-  protected IEditorPart editor;
-  protected long fileTimestamp;
-
-  public ResourceChangeListener(IEditorPart editPart)
-  {
-    editor = editPart;
-    // add a part activate listener
-    editor.getSite().getWorkbenchWindow().getPartService().addPartListener(this);
-    // add resource change listener
-    getFile().getWorkspace().addResourceChangeListener(this);
-    setTimestamp();
-  }
-  
-  protected void setTimestamp()
-  {
-    fileTimestamp = computeModificationStamp(getFile());
-  }
-  
-  /**
-   * Computes the initial modification stamp for the given resource.
-   * 
-   * @param resource the resource
-   * @return the modification stamp
-   */
-  protected long computeModificationStamp(IResource resource) {
-    long modificationStamp= resource.getModificationStamp();
-    
-    IPath path= resource.getLocation();
-    if (path == null)
-     return modificationStamp;
-    
-    modificationStamp= path.toFile().lastModified();
-    return modificationStamp;
-  }
-  
-  protected IFile getFile()
-  {
-    IFileEditorInput fileInput = (IFileEditorInput) editor.getEditorInput();
-    return fileInput.getFile();
-  }
-  
-  protected void checkChanged(final IEditorPart editorPart)
-  {
-    if (!getFile().exists() ||
-         fileTimestamp != computeModificationStamp(getFile()))
-    {
-      if (editorPart instanceof IExternalChangeEditorListener)
-      {
-        editorPart.getSite().getShell().getDisplay().asyncExec(new Runnable()
-        {
-          public void run()
-          {
-            ((IExternalChangeEditorListener)editorPart).handleEditorInputChanged();
-            setTimestamp();
-          }
-        });
-      }
-    }
-  }
-  
-  /**
-   * @see IPartListener#partActivated(IWorkbenchPart)
-   */
-  public void partActivated(IWorkbenchPart part) 
-  {
-    if (part == editor)
-      checkChanged(editor);
-  }
-  
-  /**
-   * @see IPartListener#partBroughtToTop(IWorkbenchPart)
-   */
-  public void partBroughtToTop(IWorkbenchPart arg0) {
-//    if (arg0 == editor)
-//     B2BGUIPlugin.getPlugin().getMsgLogger().write("part brought to top");
-  }
-  
-  /**
-   * @see IPartListener#partClosed(IWorkbenchPart)
-   */
-  public void partClosed(IWorkbenchPart part) {
-    if (part == editor)
-    {
-      // add a part activate listener
-      editor.getSite().getWorkbenchWindow().getPartService().removePartListener(this);
-      // add resource change listener
-      getFile().getWorkspace().removeResourceChangeListener(this);      
-//      B2BGUIPlugin.getPlugin().getMsgLogger().write("part closed");
-    }
-  }
-  
-  /**
-   * @see IPartListener#partDeactivated(IWorkbenchPart)
-   */
-  public void partDeactivated(IWorkbenchPart part) {}
-  
-  /**
-   * @see IPartListener#partOpened(IWorkbenchPart)
-   */
-  public void partOpened(IWorkbenchPart part) {}
-  
-  // IResourceChangeListener interface
-  public void resourceChanged(IResourceChangeEvent event)
-  {
-    IResourceDelta resourceDelta = event.getDelta();
-
-    try
-    {
-      if (resourceDelta != null) 
-      {
-        resourceDelta.accept(this);
-      }
-    }
-    catch (Exception e)
-    {
-//      B2BGUIPlugin.getPlugin().getMsgLogger().write("Exception caught during resource change" + e);
-//      B2BGUIPlugin.getPlugin().getMsgLogger().writeCurrentThread();
-    }      
-  }
-
-  // IResourceDeltaVisitor
-  public boolean visit(IResourceDelta delta)
-  {
-    if (delta.getResource().equals(getFile()))
-    {
-      switch (delta.getKind())
-      {
-        case IResourceDelta.CHANGED:
-         setTimestamp();
-         break;
-        case IResourceDelta.REMOVED:
-         if ((IResourceDelta.MOVED_TO & delta.getFlags()) != 0)
-         {
-           final IPath movedToPath = delta.getMovedToPath();
-
-           editor.getSite().getShell().getDisplay().asyncExec(new Runnable()
-           {
-             public void run()
-             {
-               // if the resource has moved or been renamed, let the editor do some work now
-               ((IExternalChangeEditorListener)editor).handleEditorPathChanged(movedToPath);  
-               setTimestamp();
-             }
-           });
-         }
-         else
-         {
-           editor.getSite().getShell().getDisplay().asyncExec(new Runnable()
-           {
-             public void run()
-             {
-               // if the resource is deleted, let the editor do some work now
-               ((IExternalChangeEditorListener)editor).handleEditorInputChanged();  
-               setTimestamp();
-             }
-           });
-         
-         }
-         break;
-        
-      default:
-       break;
-      }
-    }
-    return true;
-  }
-}
- 
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 87e62fa..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/viewers/NavigableTableViewer.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - 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
-{
-  public static final String copyright = "(c) Copyright IBM Corporation 2000, 2002.";
-
-   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 d9fe312..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/viewers/ResourceFilter.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - 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 
-{
-  public static final String copyright = "(c) Copyright IBM Corporation 2002.";
-  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 3260cb0..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/viewers/SelectMultiFilePage.java
+++ /dev/null
@@ -1,392 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - 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 {
-  public static final String copyright =
-    "(c) Copyright IBM Corporation 2000, 2001, 2002.";
-  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 4cc7da1..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/viewers/SelectSingleFilePage.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - 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
-{
-  public static final String copyright = "(c) Copyright IBM Corporation 2000, 2001, 2002.";
-  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 26f278d..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/viewers/SelectSingleFileView.java
+++ /dev/null
@@ -1,403 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - 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
-{                                
-  public static final String copyright = "(c) Copyright IBM Corporation 2000, 2001, 2002.";
-  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
-  {
-	public static final String copyright = "(c) Copyright IBM Corporation 2002.";
-	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 b387d75..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/viewers/TableNavigator.java
+++ /dev/null
@@ -1,411 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - 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
-{
-  public static final String copyright = "(c) Copyright IBM Corporation 2000, 2002.";
-  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/internal/wizards/ExampleProjectCreationOperation.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/wizards/ExampleProjectCreationOperation.java
deleted file mode 100644
index 6c81918..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/wizards/ExampleProjectCreationOperation.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - Initial API and implementation
-*   Jens Lukowski/Innoopract - initial renaming/restructuring
-* 
-*/
-package org.eclipse.wst.common.ui.internal.wizards;
-
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.net.URL;
-import java.util.zip.ZipFile;
-
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.ui.dialogs.IOverwriteQuery;
-import org.eclipse.ui.wizards.datatransfer.ImportOperation;
-import org.eclipse.ui.wizards.datatransfer.ZipFileStructureProvider;
-import org.eclipse.wst.common.ui.internal.UIPlugin;
-import org.osgi.framework.Bundle;
-
-public class ExampleProjectCreationOperation implements IRunnableWithProgress {
-
-	private IResource elementToOpen;
-
-	private IOverwriteQuery overwriteQuery;
-
-	private ExampleProjectCreationWizardPage[] pages;
-
-	/**
-	 * Constructor for ExampleProjectCreationOperation
-	 */
-	public ExampleProjectCreationOperation(ExampleProjectCreationWizardPage[] myPages, IOverwriteQuery myOverwriteQuery) {
-		elementToOpen = null;
-		pages = myPages;
-		overwriteQuery = myOverwriteQuery;
-	}
-
-	private IProject configNewProject(IWorkspaceRoot root, String name, String[] natureIds, IProject[] referencedProjects, IProgressMonitor monitor) throws InvocationTargetException {
-		try {
-			IProject project = root.getProject(name);
-			if (!project.exists()) {
-				project.create(null);
-			}
-			if (!project.isOpen()) {
-				project.open(null);
-			}
-			IProjectDescription desc = project.getDescription();
-			desc.setLocation(null);
-			desc.setNatureIds(natureIds);
-			desc.setReferencedProjects(referencedProjects);
-
-			project.setDescription(desc, new SubProgressMonitor(monitor, 1));
-
-			return project;
-		}
-		catch (CoreException e) {
-			throw new InvocationTargetException(e);
-		}
-	}
-
-	private void createProject(IWorkspaceRoot root, ExampleProjectCreationWizardPage page, IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-		IConfigurationElement desc = page.getConfigurationElement();
-
-		IConfigurationElement[] imports = desc.getChildren("import"); //$NON-NLS-1$
-		IConfigurationElement[] natures = desc.getChildren("nature"); //$NON-NLS-1$
-		IConfigurationElement[] references = desc.getChildren("references"); //$NON-NLS-1$
-		int nImports = (imports == null) ? 0 : imports.length;
-		int nNatures = (natures == null) ? 0 : natures.length;
-		int nReferences = (references == null) ? 0 : references.length;
-
-		monitor.beginTask(UIPlugin.getResourceString("ExampleProjectCreationOperation.op_desc_proj"), nImports + 1); //$NON-NLS-1$
-
-		String name = page.getProjectName();
-
-		String[] natureIds = new String[nNatures];
-		for (int i = 0; i < nNatures; i++) {
-			natureIds[i] = natures[i].getAttribute("id"); //$NON-NLS-1$
-		}
-		IProject[] referencedProjects = new IProject[nReferences];
-		for (int i = 0; i < nReferences; i++) {
-			referencedProjects[i] = root.getProject(references[i].getAttribute("id")); //$NON-NLS-1$
-		}
-
-		IProject proj = configNewProject(root, name, natureIds, referencedProjects, monitor);
-
-		for (int i = 0; i < nImports; i++) {
-			doImports(proj, imports[i], new SubProgressMonitor(monitor, 1));
-		}
-
-		String open = desc.getAttribute("open"); //$NON-NLS-1$
-		if (open != null && open.length() > 0) {
-			IResource fileToOpen = proj.findMember(new Path(open));
-			if (fileToOpen != null) {
-				elementToOpen = fileToOpen;
-			}
-		}
-
-	}
-
-	private void doImports(IProject project, IConfigurationElement curr, IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-		try {
-			IPath destPath;
-			String name = curr.getAttribute("dest"); //$NON-NLS-1$
-			if (name == null || name.length() == 0) {
-				destPath = project.getFullPath();
-			}
-			else {
-				IFolder folder = project.getFolder(name);
-				if (!folder.exists()) {
-					folder.create(true, true, null);
-				}
-				destPath = folder.getFullPath();
-			}
-			String importPath = curr.getAttribute("src"); //$NON-NLS-1$
-			if (importPath == null) {
-				importPath = ""; //$NON-NLS-1$
-				UIPlugin.log("projectsetup descriptor: import missing"); //$NON-NLS-1$
-				return;
-			}
-
-			ZipFile zipFile = getZipFileFromPluginDir(importPath, getContributingPlugin(curr));
-			importFilesFromZip(zipFile, destPath, new SubProgressMonitor(monitor, 1));
-		}
-		catch (CoreException e) {
-			throw new InvocationTargetException(e);
-		}
-	}
-
-	private String getContributingPlugin(IConfigurationElement configurationElement) {
-		Object parent = configurationElement;
-		while (parent != null) {
-			if (parent instanceof IExtension)
-				return ((IExtension) parent).getNamespace();
-			parent = ((IConfigurationElement) parent).getParent();
-		}
-		return null;
-	}
-
-	public IResource getElementToOpen() {
-		return elementToOpen;
-	}
-
-	private ZipFile getZipFileFromPluginDir(String pluginRelativePath, String symbolicName) throws CoreException {
-		try {
-			Bundle bundle = Platform.getBundle(symbolicName);
-			URL starterURL = new URL(bundle.getEntry("/"), pluginRelativePath); //$NON-NLS-1$
-			return new ZipFile(Platform.asLocalURL(starterURL).getFile());
-		}
-		catch (IOException e) {
-			String message = pluginRelativePath + ": " + e.getMessage(); //$NON-NLS-1$
-			Status status = new Status(IStatus.ERROR, UIPlugin.getPluginId(), IStatus.ERROR, message, e);
-			throw new CoreException(status);
-		}
-	}
-
-	private void importFilesFromZip(ZipFile srcZipFile, IPath destPath, IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-		ZipFileStructureProvider structureProvider = new ZipFileStructureProvider(srcZipFile);
-		ImportOperation op = new ImportOperation(destPath, structureProvider.getRoot(), structureProvider, overwriteQuery);
-		op.run(monitor);
-	}
-
-	/*
-	 * @see IRunnableWithProgress#run(IProgressMonitor)
-	 */
-	public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-		if (monitor == null) {
-			monitor = new NullProgressMonitor();
-		}
-		try {
-			monitor.beginTask(UIPlugin.getResourceString("ExampleProjectCreationOperation.op_desc"), pages.length); //$NON-NLS-1$
-			IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-
-			for (int i = 0; i < pages.length; i++) {
-				createProject(root, pages[i], new SubProgressMonitor(monitor, 1));
-			}
-		}
-		finally {
-			monitor.done();
-		}
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/wizards/ExampleProjectCreationWizard.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/wizards/ExampleProjectCreationWizard.java
deleted file mode 100644
index a3cff74..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/wizards/ExampleProjectCreationWizard.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - Initial API and implementation
-*   Jens Lukowski/Innoopract - initial renaming/restructuring
-* 
-*/
-package org.eclipse.wst.common.ui.internal.wizards;
-
-import java.lang.reflect.InvocationTargetException;
-import java.net.URL;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExecutableExtension;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation;
-import org.eclipse.ui.dialogs.IOverwriteQuery;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.wizards.newresource.BasicNewProjectResourceWizard;
-import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard;
-import org.eclipse.wst.common.ui.internal.UIPlugin;
-
-public class ExampleProjectCreationWizard extends BasicNewResourceWizard implements INewWizard, IExecutableExtension {
-
-	private class ImportOverwriteQuery implements IOverwriteQuery {
-
-		private int openDialog(final String file) {
-			final int[] result = {IDialogConstants.CANCEL_ID};
-			getShell().getDisplay().syncExec(new Runnable() {
-				public void run() {
-					String title = UIPlugin.getResourceString("ExampleProjectCreationWizard.overwritequery.title"); //$NON-NLS-1$
-					String msg = UIPlugin.getString("ExampleProjectCreationWizard.overwritequery.message", file); //$NON-NLS-1$
-					String[] options = {IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL, IDialogConstants.YES_TO_ALL_LABEL, IDialogConstants.CANCEL_LABEL};
-					MessageDialog dialog = new MessageDialog(getShell(), title, null, msg, MessageDialog.QUESTION, options, 0);
-					result[0] = dialog.open();
-				}
-			});
-			return result[0];
-		}
-
-		public String queryOverwrite(String file) {
-			String[] returnCodes = {YES, NO, ALL, CANCEL};
-			int returnVal = openDialog(file);
-			return returnVal < 0 ? CANCEL : returnCodes[returnVal];
-		}
-	}
-
-	private IConfigurationElement wizardConfigElement;
-	private IConfigurationElement exampleConfigElement;
-	
-	private String EXAMPLE_WIZARD_XP_ID = "org.eclipse.wst.common.ui.exampleProjectCreationWizard";  //$NON-NLS-1$
-
-	private ExampleProjectCreationWizardPage[] pages;
-
-	private final String WEB_BROWSER_ID = "org.eclipse.wst.internet.webbrowser";   //$NON-NLS-1$
-
-	public ExampleProjectCreationWizard() {
-		super();
-		setDialogSettings(UIPlugin.getDefault().getDialogSettings());
-		setWindowTitle(UIPlugin.getResourceString("ExampleProjectCreationWizard.title")); //$NON-NLS-1$
-		setNeedsProgressMonitor(true);
-	}
-
-	/*
-	 * @see Wizard#addPages
-	 */
-	public void addPages() {
-		super.addPages();
-
-		if(exampleConfigElement == null) return;
-		IConfigurationElement[] children = exampleConfigElement.getChildren("projectsetup"); //$NON-NLS-1$
-		if (children == null || children.length == 0) {
-			UIPlugin.log("descriptor must contain one ore more projectsetup tags"); //$NON-NLS-1$
-			return;
-		}
-
-		pages = new ExampleProjectCreationWizardPage[children.length];
-
-		for (int i = 0; i < children.length; i++) {
-			pages[i] = new ExampleProjectCreationWizardPage(i, children[i]);
-			addPage(pages[i]);
-		}
-	}
-	
-	protected IConfigurationElement[] getExtendedConfigurationElements() {
-		IExtensionRegistry registry = Platform.getExtensionRegistry();
-		IExtensionPoint exampleWizardXP = registry.getExtensionPoint(EXAMPLE_WIZARD_XP_ID);
-		if(exampleWizardXP == null){
-			return new IConfigurationElement[0];
-		}
-		IExtension extension = exampleWizardXP.getExtension(getWizardExtensionId());
-		if(extension != null){
-			return extension.getConfigurationElements();
-		}
-		IConfigurationElement[] exampleWizardCEs = exampleWizardXP.getConfigurationElements();
-		return exampleWizardCEs;
-	}
-
-	protected ImageDescriptor getImageDescriptor(String banner) {
-		return UIPlugin.getDefault().getImageDescriptor(banner);
-	}
-
-	private void handleException(Throwable target) {
-		String title = UIPlugin.getResourceString("ExampleProjectCreationWizard.op_error.title"); //$NON-NLS-1$
-		String message = UIPlugin.getResourceString("ExampleProjectCreationWizard.op_error.message"); //$NON-NLS-1$
-		if (target instanceof CoreException) {
-			IStatus status = ((CoreException) target).getStatus();
-			ErrorDialog.openError(getShell(), title, message, status);
-			UIPlugin.log(status);
-		}
-		else {
-			MessageDialog.openError(getShell(), title, target.getMessage());
-			UIPlugin.log(target);
-		}
-	}
-
-	public void initializeDefaultPageImageDescriptor() {
-		if (exampleConfigElement != null) {
-			String banner = exampleConfigElement.getAttribute("banner"); //$NON-NLS-1$
-			if (banner != null) {
-				URL imageURL = Platform.find(Platform.getBundle(exampleConfigElement.getDeclaringExtension().getNamespace()), new Path(banner));
-				ImageDescriptor desc = ImageDescriptor.createFromURL(imageURL);
-				setDefaultPageImageDescriptor(desc);
-			}
-		}
-	}
-
-	private void openResource(final IResource resource) {
-		if (resource.getType() != IResource.FILE) {
-			return;
-		}
-		IWorkbenchWindow window = UIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow();
-		if (window == null) {
-			return;
-		}
-		final IWorkbenchPage activePage = window.getActivePage();
-		if (activePage != null) {
-			final Display display = getShell().getDisplay();
-			display.asyncExec(new Runnable() {
-				public void run() {
-					try {
-						IDE.openEditor(activePage, (IFile) resource, WEB_BROWSER_ID, true);
-					}
-					catch (PartInitException e) {
-						UIPlugin.log(e);
-					}
-				}
-			});
-			BasicNewResourceWizard.selectAndReveal(resource, activePage.getWorkbenchWindow());
-		}
-	}
-
-	/*
-	 * @see Wizard#performFinish
-	 */
-	public boolean performFinish() {
-		ExampleProjectCreationOperation runnable = new ExampleProjectCreationOperation(pages, new ImportOverwriteQuery());
-
-		IRunnableWithProgress op = new WorkspaceModifyDelegatingOperation(runnable);
-		try {
-			getContainer().run(false, true, op);
-		}
-		catch (InvocationTargetException e) {
-			handleException(e.getTargetException());
-			return false;
-		}
-		catch (InterruptedException e) {
-			return false;
-		}
-		BasicNewProjectResourceWizard.updatePerspective(wizardConfigElement);
-		IResource res = runnable.getElementToOpen();
-		if (res != null) {
-			openResource(res);
-		}
-		return true;
-	}
-
-	/**
-	 * Stores the configuration element for the wizard. The config element
-	 * will be used in <code>performFinish</code> to set the result
-	 * perspective.
-	 */
-	public void setInitializationData(IConfigurationElement cfig, String propertyName, Object data) {
-		wizardConfigElement = cfig;
-		String title = wizardConfigElement.getAttribute("name"); //$NON-NLS-1$
-		if (title != null) {
-			setWindowTitle(title);
-		}
-		String wizardId = getWizardExtensionId(); //$NON-NLS-1$
-		IConfigurationElement[] exampleWizardCEs = getExtendedConfigurationElements();
-		for (int i = 0; i < exampleWizardCEs.length; i++) {
-			IConfigurationElement element = exampleWizardCEs[i];
-			String extWizardId = element.getAttribute("id"); //$NON-NLS-1$
-			if(wizardId != null && extWizardId != null && wizardId.equals(extWizardId)){
-				exampleConfigElement = element;
-			}
-		}
-//		initializeDefaultPageImageDescriptor();
-	}
-	
-	public String getWizardExtensionId(){
-		return wizardConfigElement.getAttribute("id"); //$NON-NLS-1$
-	}
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/wizards/ExampleProjectCreationWizardPage.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/wizards/ExampleProjectCreationWizardPage.java
deleted file mode 100644
index 705a184..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/wizards/ExampleProjectCreationWizardPage.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - Initial API and implementation
-*   Jens Lukowski/Innoopract - initial renaming/restructuring
-* 
-*/
-
-package org.eclipse.wst.common.ui.internal.wizards;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jface.wizard.IWizard;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.ui.dialogs.WizardNewProjectCreationPage;
-import org.eclipse.wst.common.ui.internal.UIPlugin;
-
-public class ExampleProjectCreationWizardPage extends WizardNewProjectCreationPage {
-
-	private IConfigurationElement configurationElement;
-
-	public ExampleProjectCreationWizardPage(int pageNumber, IConfigurationElement elem) {
-
-		super("page" + pageNumber); //$NON-NLS-1$
-		configurationElement = elem;
-
-		String name = getAttribute(elem, "name"); //$NON-NLS-1$
-		setInitialProjectName(calculateInitialProjectName(name));
-
-		setDescription(getAttribute(configurationElement, "pagedescription")); //$NON-NLS-1$
-		setTitle(getAttribute(configurationElement, "pagetitle")); //$NON-NLS-1$
-
-	}
-
-	/*
-	 * Set the default project name that is to appear on the initialPage page
-	 * of this wizard.
-	 */
-	protected String calculateInitialProjectName(String projectName) {
-		IProject projectHandle = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
-		if (!projectHandle.exists()) {
-			return projectName;
-		}
-		// Change the name until it doesn't exists. Try 9 times and then
-		// give up.
-		for (int i = 1; i < 10; i++) {
-			projectHandle = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName + i);
-			if (!projectHandle.exists()) {
-				return projectName + i;
-			}
-		}
-		return projectName + "9"; //$NON-NLS-1$
-
-	}
-
-	private String getAttribute(IConfigurationElement elem, String tag) {
-		String res = elem.getAttribute(tag);
-		if (res == null) {
-			return '!' + tag + '!';
-		}
-		return res;
-	}
-
-
-
-	/**
-	 * Returns the configuration element of this page.
-	 * 
-	 * @return Returns a IConfigurationElement
-	 */
-	public IConfigurationElement getConfigurationElement() {
-		return configurationElement;
-	}
-
-	/**
-	 * @see org.eclipse.ui.dialogs.WizardNewProjectCreationPage#validatePage()
-	 */
-	protected boolean validatePage() {
-		if (!super.validatePage())
-			return false;
-
-		String projectName = getProjectName();
-		if (projectName == null)
-			return false;
-
-		IWizard wizard = getWizard();
-		if (wizard instanceof ExampleProjectCreationWizard) {
-			IWizardPage[] pages = wizard.getPages();
-			for (int i = 0; i < pages.length; i++) {
-				if ((pages[i] != this) && (pages[i] instanceof ExampleProjectCreationWizardPage)) {
-					if (projectName.equals(((ExampleProjectCreationWizardPage) pages[i]).getProjectName())) {
-						setErrorMessage(UIPlugin.getResourceString("ExampleProjectCreationWizardPage.error.alreadyexists")); //$NON-NLS-1$
-						return false;
-					}
-				}
-			}
-		}
-
-		return true;
-	}
-
-
-
-}
diff --git a/plugins/org.eclipse.wst.common.uriresolver/.classpath b/plugins/org.eclipse.wst.common.uriresolver/.classpath
deleted file mode 100644
index 065ac06..0000000
--- a/plugins/org.eclipse.wst.common.uriresolver/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/plugins/org.eclipse.wst.common.uriresolver/.cvsignore b/plugins/org.eclipse.wst.common.uriresolver/.cvsignore
deleted file mode 100644
index 5b853a4..0000000
--- a/plugins/org.eclipse.wst.common.uriresolver/.cvsignore
+++ /dev/null
@@ -1,5 +0,0 @@
-bin
-uriresolver.jar
-build.xml
-temp.folder
-org.eclipse.wst.common.uriresolver_1.0.0.jar
diff --git a/plugins/org.eclipse.wst.common.uriresolver/.project b/plugins/org.eclipse.wst.common.uriresolver/.project
deleted file mode 100644
index e19b693..0000000
--- a/plugins/org.eclipse.wst.common.uriresolver/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.common.uriresolver</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.uriresolver/README.txt b/plugins/org.eclipse.wst.common.uriresolver/README.txt
deleted file mode 100644
index acaf514..0000000
--- a/plugins/org.eclipse.wst.common.uriresolver/README.txt
+++ /dev/null
@@ -1 +0,0 @@
-API for an URI resolver.
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.uriresolver/build.properties b/plugins/org.eclipse.wst.common.uriresolver/build.properties
deleted file mode 100644
index 08364ab..0000000
--- a/plugins/org.eclipse.wst.common.uriresolver/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-bin.includes = plugin.xml,\
-               uriresolver.jar
-jars.compile.order = uriresolver.jar
-source.uriresolver.jar = src/
-output.uriresolver.jar = bin/
diff --git a/plugins/org.eclipse.wst.common.uriresolver/plugin.xml b/plugins/org.eclipse.wst.common.uriresolver/plugin.xml
deleted file mode 100644
index a5f2f1a..0000000
--- a/plugins/org.eclipse.wst.common.uriresolver/plugin.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="org.eclipse.wst.common.uriresolver"
-   name="org.eclipse.wst.common.uriresolver"
-   version="1.0.0"
-   provider-name="Eclipse.org"
-   class="org.eclipse.wst.common.uriresolver.internal.provisional.URIResolverPlugin">
-
-   <runtime>
-      <library name="uriresolver.jar">
-			<export name="*" />
-		</library>      
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.core.runtime.compatibility"/>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.eclipse.core.resources"/>
-   </requires>
-
-
-   <extension-point id="resolverExtensions" name="URI Resolver Extension"/>
-
-</plugin>
diff --git a/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/ExtensibleURIResolver.java b/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/ExtensibleURIResolver.java
deleted file mode 100644
index ac50ffa..0000000
--- a/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/ExtensibleURIResolver.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - Initial API and implementation
-*   Jens Lukowski/Innoopract - initial renaming/restructuring
-* 
-*/
-package org.eclipse.wst.common.uriresolver.internal;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolver;
-import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolverExtension;
-import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolverPlugin;
-
-
-/**
- * @author csalter
- * 
- * 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 ExtensibleURIResolver implements URIResolver
-{
-
-	//protected IProject project;
-
-	//TODO... consider ctor that takes a project arg
-	//public ExtensibleURIResolver(IProject project)
-	//{
-	//	this.project = project;
-	//}
-
-	public ExtensibleURIResolver()
-	{
-	}
-
-	public String resolve(String baseLocation, String publicId, String systemId)
-	{
-		String result = systemId;
-
-		// compute the project that holds the resource
-		//
-		IProject project = computeProject(baseLocation);
-		String fileName = null; // todo.. get the file name for systemId
-
-		URIResolverExtensionRegistry resolverRegistry = URIResolverPlugin.getInstance().getXMLResolverExtensionRegistry();
-		List list = resolverRegistry.getExtensionDescriptors(project);
-
-		// get the list of applicable pre-normalized resolvers from the
-		// extension registry
-		//
-		for (Iterator i = resolverRegistry.getMatchingURIResolvers(list, URIResolverExtensionRegistry.STAGE_PRENORMALIZATION).iterator(); i.hasNext();)
-		{
-			URIResolverExtension resolver = (URIResolverExtension) i.next();
-			String tempresult = resolver.resolve(project, baseLocation, publicId, result);
-			if(tempresult != null)
-			{
-			  result = tempresult;
-			}
-		}
-
-		// normalize the uri
-		//
-		result = normalize(baseLocation, result);
-
-		// get the list of applicable post-normalized resolvers from the
-		// extension registry
-		//		
-		for (Iterator i = resolverRegistry.getMatchingURIResolvers(list, URIResolverExtensionRegistry.STAGE_POSTNORMALIZATION).iterator(); i.hasNext();)
-		{
-			URIResolverExtension resolver = (URIResolverExtension) i.next();
-			String tempresult = resolver.resolve(project, baseLocation, publicId, result);
-			if(tempresult != null)
-			{
-			  result = tempresult;
-			}
-		}
-
-		return result;
-	}
-
-	protected String normalize(String baseLocation, String systemId)
-	{
-	  // If no systemId has been specified there is nothing to do
-	  // so return null;
-	  if(systemId == null)
-	    return null;
-		String result = systemId;
-		// normalize the URI
-		URI systemURI = URI.createURI(systemId);
-		if (systemURI.isRelative())
-		{
-			URI baseURI = URI.createURI(baseLocation);
-			try
-			{
-			  result = systemURI.resolve(baseURI).toString();
-			}
-			catch(IllegalArgumentException e)
-			{}
-			
-		}
-		return result;
-	}
-
-	protected IProject computeProject(String baseLocation)
-	{
-	  if(baseLocation != null)
-	  {
-		String pattern = "file:///";
-		if (baseLocation.startsWith(pattern))
-		{
-			baseLocation = baseLocation.substring(pattern.length());
-		}
-		IPath path = new Path(baseLocation);
-		//path = path.removeFirstSegments(1);
-		IFile file = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(path);
-		//IContainer c =
-		// ResourcesPlugin.getWorkspace().getRoot().getContainerForLocation(path);
-		return file != null ? file.getProject() : null;
-	  }
-	  return null;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/URI.java b/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/URI.java
deleted file mode 100644
index 3aac823..0000000
--- a/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/URI.java
+++ /dev/null
@@ -1,2019 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - Initial API and implementation
-*   Jens Lukowski/Innoopract - initial renaming/restructuring
-* 
-*/
-package org.eclipse.wst.common.uriresolver.internal;
-
-import java.io.File;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * A representation of a Uniform Resource Identifier (URI), as specified by
- * <a href="http://www.ietf.org/rfc/rfc2396.txt">RFC 2396</a>, with certain
- * enhancements.  A <code>URI</code> instance can be created by specifying
- * values for its components, or by providing a single URI string, which is
- * parsed into its components.  Static factory methods whose names begin
- * with "create" are used for both forms of object creation.  No public or
- * protected constructors are provided; this class can not be subclassed.
- *
- * <p>Like <code>String</code>, <code>URI</code> is an immutable class;
- * a <code>URI</code> instance offers several by-value methods that return a
- * new <code>URI</code> object based on its current state.  Most useful,
- * a relative <code>URI</code> can be {@link #resolve(URI) resolve}d against
- * a base absolute <code>URI</code> -- the latter typically identifies the
- * document in which the former appears.  The inverse to this is {@link
- * #deresolve(URI) deresolve}, which answers the question, "what relative
- * URI will resolve, against the given base, to this absolute URI?"
- *
- * <p>In the <a href="http://www.ietf.org/rfc/rfc2396.txt">RFC</a>, much
- * attention is focused on a hierarchical naming system used widely to
- * locate resources via common protocols such as HTTP, FTP, and Gopher, and
- * to identify files on a local file system.  Acordingly, most of this
- * class's functionality is for handling such URIs, which can be identified
- * via {@link #isHierarchical()}.
- *
- * <p><a name="device_explaination">
- * The primary enhancement beyond the RFC description is an optional
- * device component.  Instead of treating the device as just another segment
- * in the path, it can be stored as a separate component (almost a
- * sub-authority), with the root below it.  For example, resolving
- * <code>/bar</code> against <code>file:///c:/foo</code> would result in
- * <code>file:///c:/bar</code> being returned.  Also, you cannot take
- * the parent of a device, so resolving <code>..</code> against
- * <code>file:///c:/</code> would not yield <code>file:///</code>, as you
- * might expect.  This feature is useful when working with file-scheme
- * URIs, as devices do not typically occur in protocol-based ones.  A
- * device-enabled <code>URI</code> can be created by parsing a string with
- * {@link #createURI} or by specifying a non-null <code>device</code>
- * paramter for either the {@link #createHierarchicalURI(String, String,
- * String, String, String) no-path} or the {@link
- * #createHierarchicalURI(String, String, String, String[], String, String)
- * absolute-path} form of <code>createHierarchicalURI()</code>.
- *
- * <p>Compared to the RFC description, this implementation is quite relaxed
- * about validity.  Static methods whose names begin with "valid" test
- * whether a given string is a valid value for the various URI components.
- * Presently, these tests place no restrictions beyond what would have been
- * required in order for {@link #createURI} to
- * have parsed them correctly from a single URI string.  Note that all of
- * the static factory methods invoke the appropriate validation methods and
- * throw exceptions in response to a negative result, ensuring that
- * invalid URIs are never created.
- *
- * <p>Finally, note the difference between a <code>null</code> parameter to
- * the static factory methods and an empty string.  The former signifies the
- * absense of a given URI component, while the latter simply makes the
- * component blank.  This can have a significant effect when resolving.  For
- * example, consider the following two URIs: <code>/bar</code> (with no
- * authority) and <code>///bar</code> (with a blank authority).  Imagine
- * resolving them against a base with an authority, such as
- * <code>http://www.eclipse.org/</code>.  The former case will yield
- * <code>http://www.eclipse.org/bar</code>, as the base authority will be
- * preserved.  In the latter case, the empty authority will override the
- * base authority, resulting in <code>http:///bar</code>!
- */
-public final class URI
-{
-  // Common to all URI types.
-  private final int hashCode;
-  private final boolean hierarchical;
-  private final String scheme;  // null -> relative URI reference
-  private final String authority;
-  private final String fragment;
-  private URI cachedTrimFragment;
-  private String cachedToString;
-
-  // Applicable only to a hierarchical URI.
-  private final String device;
-  private final boolean absolutePath;
-  private final String[] segments; // empty last segment -> trailing separator
-  private final String query;
-
-  // Identifies a file-type absolute URI.
-  private static final String SCHEME_FILE = "file";
-  private static final String SCHEME_JAR = "jar";
-
-  // Special segment values interpreted at resolve and resolve time.
-  private static final String SEGMENT_EMPTY = "";
-  private static final String SEGMENT_SELF = ".";
-  private static final String SEGMENT_PARENT = "..";
-  private static final String[] NO_SEGMENTS = new String[0];
-
-  // Separators for parsing a URI string
-  private static final char SCHEME_SEPARATOR = ':';
-  private static final String AUTHORITY_SEPARATOR = "//";
-  private static final char DEVICE_IDENTIFIER = ':';
-  private static final char SEGMENT_SEPARATOR = '/';
-  private static final char QUERY_SEPARATOR = '?';
-  private static final char FRAGMENT_SEPARATOR = '#';
-  private static final char USER_INFO_SEPARATOR = '@';
-  private static final char PORT_SEPARATOR = ':';
-  private static final char FILE_EXTENSION_SEPARATOR = '.';
-  private static final char[] MAJOR_SEPARATORS = {
-    SCHEME_SEPARATOR, SEGMENT_SEPARATOR, QUERY_SEPARATOR, FRAGMENT_SEPARATOR };
-  private static final char[] SEGMENT_END = {
-    SEGMENT_SEPARATOR, QUERY_SEPARATOR, FRAGMENT_SEPARATOR };
-
-  /**
-   * Static factory method for a generic, non-hierarchical URI.  There is no
-   * concept of a relative non-hierarchical URI; such an object cannot be
-   * created.
-   *
-   * @exception java.lang.IllegalArgumentException if <code>scheme</code> is
-   * null, or if <code>scheme</code>, <code>opaquePart</code>, or
-   * <code>fragment</code> is not valid according to {@link #validScheme},
-   * {@link #validOpaquePart}, or {@link #validFragment}, respectively.
-   */
-  public static URI createGenericURI(String scheme, String opaquePart,
-                                     String fragment)
-  {
-    if (scheme == null)
-    {
-      throw new IllegalArgumentException("relative non-hierarchical URI");
-    }
-
-    return new URI(false, scheme, opaquePart, null, false, NO_SEGMENTS,
-                   null, fragment);
-  }
-
-  /**
-   * Static factory method for a hierarchical URI with no path.  The
-   * URI will be relative if <code>scheme</code> is non-null, and absolute
-   * otherwise.  An absolute URI with no path requires a non-null
-   * <code>authority</code> and/or <code>device</code>.
-   *
-   * @exception java.lang.IllegalArgumentException if <code>scheme</code> is
-   * non-null while <code>authority</code> and <code>device</code> are null,
-   * or if <code>scheme</code>, <code>authority</code>, <code>device</code>,
-   * <code>query</code>, or <code>fragment</code> is not valid according to
-   * {@link #validScheme}, {@link #validAuthority}, {@link #validDevice},
-   * {@link #validQuery}, or {@link #validFragment}, respectively.
-   */
-  public static URI createHierarchicalURI(String scheme, String authority,
-                                          String device, String query,
-                                          String fragment)
-  {
-    if (scheme != null && authority == null && device == null)
-    {
-      throw new IllegalArgumentException(
-        "absolute hierarchical URI without authority, device, path");
-    }
-
-    return new URI(true, scheme, authority, device, false, NO_SEGMENTS,
-                   query, fragment);
-  }
-
-  /**
-   * Static factory method for a hierarchical URI with absolute path.
-   * The URI will be relative if <code>scheme</code> is non-null, and
-   * absolute otherwise. 
-   *
-   * @param segments an array of non-null strings, each representing one
-   * segment of the path.  As an absolute path, it is automatically
-   * preceeded by a <code>/</code> separator.  If desired, a trailing
-   * separator should be represented by an empty-string segment as the last
-   * element of the array. 
-   *
-   * @exception java.lang.IllegalArgumentException if <code>scheme</code>,
-   * <code>authority</code>, <code>device</code>, <code>segments</code>,
-   * <code>query</code>, or <code>fragment</code> is not valid according to
-   * {@link #validScheme}, {@link #validAuthority}, {@link #validDevice},
-   * {@link #validSegments}, {@link #validQuery}, or {@link #validFragment},
-   * respectively.
-   */
-  public static URI createHierarchicalURI(String scheme, String authority,
-                                          String device, String[] segments,
-                                          String query, String fragment)
-  {
-    return new URI(true, scheme, authority, device, true, fix(segments),
-                   query, fragment);
-  }
-
-  /**
-   * Static factory method for a relative hierarchical URI with relative
-   * path.
-   *
-   * @param segments an array of non-null strings, each representing one
-   * segment of the path.  A trailing separator is represented by an
-   * empty-string segment at the end of the array.
-   *
-   * @exception java.lang.IllegalArgumentException if <code>segments</code>,
-   * <code>query</code>, or <code>fragment</code> is not valid according to 
-   * {@link #validSegments}, {@link #validQuery}, or {@link #validFragment},
-   * respectively.
-   */
-  public static URI createHierarchicalURI(String[] segments, String query,
-                                          String fragment)
-  {
-    return new URI(true, null, null, null, false, fix(segments), query,
-                   fragment);
-  }
-
-  // Converts null to length-zero array, and clones array to ensure
-  // immutability.
-  private static String[] fix(String[] segments)
-  {
-    return segments == null ? NO_SEGMENTS : (String[])segments.clone();
-  }
-  
-  /**
-   * Static factory method based on parsing a URI string, with 
-   * <a href="#device_explaination">explicit device support</a> enabled.  
-   * The specified string is parsed as described in <a
-   * href="http://www.ietf.org/rfc/rfc2396.txt">RFC 2396</a>, and an
-   * appropriate <code>URI</code> is created and returned.  Note that
-   * validity testing is not as strict as in the RFC; essentially, only
-   * separator characters are considered.  So, for example, non-Latin
-   * alphabet characters appearing in the scheme would not be considered an
-   * error.
-   *
-   * @exception java.lang.IllegalArgumentException if any component parsed
-   * from <code>uri</code> is not valid according to {@link #validScheme},
-   * {@link #validOpaquePart}, {@link #validAuthority}, {@link
-   * #validDevice}, {@link #validSegments}, {@link #validQuery}, or {@link
-   * #validFragment}, as appropriate.
-   */
-  public static URI createURI(String uri)
-  {
-    return parseIntoURI(uri);
-  }
-
-  /**
-   * Static factory method based on parsing a URI string, with 
-   * <a href="#device_explaination">explicit device support</a> enabled.  
-   * Note that validity testing is not a strict as in the RFC; essentially,
-   * only separator characters are considered.  So, for example, non-Latin
-   * alphabet characters appearing in the scheme would not be considered an
-   * error.
-   * @exception java.lang.IllegalArgumentException if any component parsed
-   * from <code>uri</code> is not valid according to {@link #validScheme},
-   * {@link #validOpaquePart}, {@link #validAuthority}, {@link
-   * #validDevice}, {@link #validSegments}, {@link #validQuery}, or {@link
-   * #validFragment}, as appropriate.
-   * @deprecated
-   */
-  public static URI createDeviceURI(String uri)
-  {
-    return parseIntoURI(uri);
-  }
-
-  // String-parsing implementation.
-  private static URI parseIntoURI(String uri)
-  {
-    boolean hierarchical = true;
-    String scheme = null;
-    String authority = null;
-    String device = null;
-    boolean absolutePath = false;
-    String[] segments = NO_SEGMENTS;
-    String query = null;
-    String fragment = null;
-
-    int i = 0;
-    int j = findSeparator(uri, i, MAJOR_SEPARATORS);
-
-    if (j < uri.length() && uri.charAt(j) == SCHEME_SEPARATOR)
-    {
-      scheme = uri.substring(i, j);
-      i = j + 1;
-    }
-
-    if (uri.startsWith(AUTHORITY_SEPARATOR, i))
-    {
-      i += AUTHORITY_SEPARATOR.length();
-      j = findSeparator(uri, i, SEGMENT_END);
-      authority = uri.substring(i, j);
-      i = j;
-    }
-    else if (scheme != null &&
-             (i == uri.length() || 
-               uri.charAt(i) != SEGMENT_SEPARATOR && 
-                 !(scheme.equalsIgnoreCase(SCHEME_FILE) || scheme.equalsIgnoreCase(SCHEME_JAR))))
-    {
-      hierarchical = false;
-      j = findSeparator(uri, i, new char[] { FRAGMENT_SEPARATOR });
-      authority = uri.substring(i, j);
-      i = j;
-    }
-
-    if (i < uri.length() &&
-        uri.charAt(i) == SEGMENT_SEPARATOR)
-    {
-      j = findSeparator(uri, i + 1, SEGMENT_END);
-      String s = uri.substring(i + 1, j);
-      
-      if (s.length() > 0 && s.charAt(s.length() - 1) == DEVICE_IDENTIFIER)
-      {
-        device = s;
-        i = j;
-      }
-    }
-
-    if (i < uri.length() && uri.charAt(i) == SEGMENT_SEPARATOR)
-    {
-      i++;
-      absolutePath = true;
-    }
-
-    if (segmentsRemain(uri, i))
-    {
-      List segmentList = new ArrayList();
-
-      while (segmentsRemain(uri, i))
-      {
-        j = findSeparator(uri, i, SEGMENT_END);
-        segmentList.add(uri.substring(i, j));
-        i = j;
-
-        if (i < uri.length() && uri.charAt(i) == SEGMENT_SEPARATOR)
-        {
-          if (!segmentsRemain(uri, ++i)) segmentList.add(SEGMENT_EMPTY);
-        }
-      }
-      segments = new String[segmentList.size()];
-      segmentList.toArray(segments);
-    }
-
-    if (i < uri.length() && uri.charAt(i) == QUERY_SEPARATOR)
-    {
-      j = findSeparator(uri, ++i, new char[] { FRAGMENT_SEPARATOR });
-      query = uri.substring(i, j);
-      i = j;
-    }
-
-    if (i < uri.length()) // && uri.charAt(i) == FRAGMENT_SEPARATOR (implied)
-    {
-      fragment = uri.substring(++i);
-    }
-
-    return new URI(hierarchical, scheme, authority, device, absolutePath,
-                   segments, query, fragment);
-  }
-
-  /**
-   * Static factory method based on parsing File path string, with 
-   * <a href="#device_explaination">explicit device support</a> enabled.  
-   * Note that validity testing is not a strict as in the RFC; essentially,
-   * only separator characters are considered.  So, for example, non-Latin
-   * alphabet characters appearing in a path segment would not be considered an
-   * error.
-   * @exception java.lang.IllegalArgumentException if any component parsed
-   * from <code>uri</code> is not valid according to {@link #validScheme},
-   * {@link #validOpaquePart}, {@link #validAuthority}, {@link
-   * #validDevice}, {@link #validSegments}, {@link #validQuery}, or {@link
-   * #validFragment}, as appropriate.
-   */
-  public static URI createFileURI(String pathName)
-  {
-    File file = new File(pathName);
-    String uri = File.separatorChar != '/' ? pathName.replace(File.separatorChar, SEGMENT_SEPARATOR) : pathName;
-    if (file.isAbsolute())
-    {
-      URI result = parseIntoURI((uri.charAt(0) == SEGMENT_SEPARATOR ? "file:" : "file:/") + uri);
-      return result;
-    }
-    else
-    {
-      URI result = parseIntoURI(uri);
-      if (result.scheme() != null)
-      {
-        throw new IllegalArgumentException("invalid relative pathName: " + pathName);
-      }
-      return result;
-    }
-  }
-
-  /**
-   * Static factory method based on parsing a platform-relative path string.
-   * The <code>pathName</code> must be of the form 
-   *<pre>
-   *  /project-name/path
-   *</pre>
-   * and the result will be of the form 
-   *<pre>
-   *  platform:/resource/project-name/path
-   *</pre>
-   * The leading separator of the path will be provided if not present.
-   * This scheme supports relocatable projects in Eclipse and in stand-alone EMF.
-   * @exception java.lang.IllegalArgumentException if any component parsed
-   * from <code>uri</code> is not valid according to {@link #validScheme},
-   * {@link #validOpaquePart}, {@link #validAuthority}, {@link
-   * #validDevice}, {@link #validSegments}, {@link #validQuery}, or {@link
-   * #validFragment}, as appropriate.
-   * @see org.eclipse.core.runtime.Platform#resolve
-   */
-  public static URI createPlatformResourceURI(String pathName)
-  {
-    URI result = parseIntoURI((pathName.charAt(0) == SEGMENT_SEPARATOR ? "platform:/resource" : "platform:/resource/") + pathName);
-    return result;
-  }
-
-  // Checks whether the string contains any more segments after the one that
-  // starts at position i.
-  private static boolean segmentsRemain(String uri, int i)
-  {
-    return i < uri.length() && uri.charAt(i) != QUERY_SEPARATOR &&
-      uri.charAt(i) != FRAGMENT_SEPARATOR;
-  }
-
-  // Finds the next occurance of one of the characters specified in
-  // separators in the given URI, beginning at index i.  The index of the
-  // first separator, or uri.length() if there is no such character, is
-  // returned.  Before searching, i is limited to be in the range 
-  // [0, uri.length()].
-  private static int findSeparator(String uri, int i, char[] separators)
-  {
-    int len = uri.length();
-    if (i >= len) return len;
-
-    outerLoop: for (i = i > 0 ? i : 0; i < len; i++)
-    {
-      for (int j = 0, slen = separators.length; j < slen; j++)
-      {
-        if (uri.charAt(i) == separators[j]) break outerLoop;
-      }
-    }
-    return i;
-  }
-
-  // Private constructor for use of static factory methods.  Does validation
-  // of each component, but assumes that the inter-component requirements
-  // described in the factory doc-comments are all satisfied.
-  private URI(boolean hierarchical, String scheme, String authority,
-              String device, boolean absolutePath, String[] segments,
-              String query, String fragment)
-  {
-    String name = null;
-    String value = null;
-
-    if (!validScheme(scheme))
-    {
-      throw new IllegalArgumentException("invalid scheme: " + scheme);
-    }
-    if (!hierarchical && !validOpaquePart(authority))
-    {
-      throw new IllegalArgumentException("invalid opaquePart: " + authority);
-    }
-    if (hierarchical && !validAuthority(authority))
-    {
-      throw new IllegalArgumentException("invalid authority: " + authority);
-    }
-    if (!validDevice(device))
-    {
-      throw new IllegalArgumentException("invalid device: " + device);
-    }
-    if (!validSegments(segments))
-    {
-      String s = segments == null ? "invalid segments: " + segments :
-        "invalid segment: " + firstInvalidSegment(segments);
-      throw new IllegalArgumentException(s);
-    }
-    if (!validQuery(query))
-    {
-      throw new IllegalArgumentException("invalid query: " + query);
-    }
-    if (!validFragment(fragment))
-    {
-      throw new IllegalArgumentException("invalid fragment: " + fragment);
-    }
-
-    int hashCode = 0;
-    if (hierarchical)
-    {
-      ++hashCode;
-    }
-    if (absolutePath)
-    {
-      hashCode += 2;
-    }
-    if (scheme != null)
-    {
-      hashCode ^= scheme.hashCode();
-    }
-    if (authority != null)
-    {
-      hashCode ^= authority.hashCode();
-    }
-    if (device != null)
-    {
-      hashCode ^= device.hashCode();
-    }
-    if (query != null)
-    {
-      hashCode ^= query.hashCode();
-    }
-    if (fragment != null)
-    {
-      hashCode ^= fragment.hashCode();
-    }
-
-    for (int i = 0, len = segments.length; i < len; i++)
-    {
-      hashCode ^= segments[i].hashCode();
-    }
-
-    this.hashCode = hashCode;
-    this.hierarchical = hierarchical;
-    this.scheme = scheme;
-    this.authority = authority;
-    this.device = device;
-    this.absolutePath = absolutePath;
-    this.segments = segments;
-    this.query = query;
-    this.fragment = fragment;
-  }
-
-  // Searches the specified string for any of the specified target
-  // characters, and if any occur, returns true; false otherwise.
-  private static boolean contains(String s, char[] targets)
-  {
-    for (int i = 0, len = s.length(); i < len; i++)
-    {
-      for (int j = 0, tlen = targets.length; j < tlen; j++)
-      {
-        if (s.charAt(i) == targets[j]) return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * Returns <code>true</code> if the specified <code>value</code> would be
-   * valid as the scheme component of a URI; <code>false</code> otherwise.
-   *
-   * <p>A valid scheme may be null or contain any characters except for the
-   * following: <code>: / ? #</code>
-   */
-  public static boolean validScheme(String value)
-  {
-    return value == null || !contains(value, MAJOR_SEPARATORS);
-  }
-
-  /**
-   * Returns <code>true</code> if the specified <code>value</code> would be
-   * valid as the opaque part component of a URI; <code>false</code>
-   * otherwise.
-   *
-   * <p>A valid opaque part must be non-null, non-empty, and not contain the
-   * <code>#</code> character.  In addition, its first character must not be
-   * <code>/</code>
-   */
-  public static boolean validOpaquePart(String value)
-  {
-    return value != null && value.indexOf(FRAGMENT_SEPARATOR) == -1 &&
-      value.length() > 0 && value.charAt(0) != SEGMENT_SEPARATOR;
-  }
-
-  /**
-   * Returns <code>true</code> if the specified <code>value</code> would be
-   * valid as the authority component of a URI; <code>false</code> otherwise.
-   *
-   * <p>A valid authority may be null or contain any characters except for
-   * the following: <code>/ ? #</code>
-   */
-  public static boolean validAuthority(String value)
-  {
-    return value == null || !contains(value, SEGMENT_END);
-  }
-
-  /**
-   * Returns <code>true</code> if the specified <code>value</code> would be
-   * valid as the device component of a URI; <code>false</code> otherwise.
-   *
-   * <p>A valid device may be null or non-empty, containing any characters
-   * except for the following: <code>/ ? #</code>  In addition, its last
-   * character must be <code>:</code>
-   */
-  public static boolean validDevice(String value)
-  {
-    if (value == null) return true;
-    int len = value.length();
-    return len > 0 && value.charAt(len - 1) == DEVICE_IDENTIFIER &&
-      !contains(value, SEGMENT_END);
-  }
-
-  /**
-   * Returns <code>true</code> if the specified <code>value</code> would be
-   * a valid path segment of a URI; <code>false</code> otherwise.
-   *
-   * <p>A valid path segment must be non-null and not contain any of the
-   * following characters: <code>/ ? #</code>
-   */
-  public static boolean validSegment(String value)
-  {
-    return value != null && !contains(value, SEGMENT_END);
-  }
-
-  /**
-   * Returns <code>true</code> if the specified <code>value</code> would be
-   * a valid path segment array of a URI; <code>false</code> otherwise.
-   *
-   * <p>A valid path segment array must be non-null and contain only path
-   * segements that are valid, according to {@link #validSegment}.
-   */
-  public static boolean validSegments(String[] value)
-  {
-    if (value == null) return false;
-    for (int i = 0, len = value.length; i < len; i++)
-    {
-      if (!validSegment(value[i])) return false;
-    }
-    return true;
-  }
-
-  // Returns null if the specicied value is null or would be a valid path
-  // segment array of a URI; otherwise, the value of the first invalid
-  // segment. 
-  private static String firstInvalidSegment(String[] value)
-  {
-    if (value == null) return null;
-    for (int i = 0, len = value.length; i < len; i++)
-    {
-      if (!validSegment(value[i])) return value[i];
-    }
-    return null;
-  }
-
-  /**
-   * Returns <code>true</code> if the specified <code>value</code> would be
-   * valid as the query component of a URI; <code>false</code> otherwise.
-   *
-   * <p>A valid query may be null or contain any characters except for
-   * <code>#</code>
-   */
-  public static boolean validQuery(String value)
-  {
-    return value == null || value.indexOf(FRAGMENT_SEPARATOR) == -1;
-  }
-
-  /**
-   * Returns <code>true</code> if the specified <code>value</code> would be
-   * valid as the fragment component of a URI; <code>false</code> otherwise.
-   *
-   * <p>A fragment is taken to be unconditionally valid.
-   */
-  public static boolean validFragment(String value)
-  {
-    return true;
-  }
-
-  /**
-   * Returns <code>true</code> if this is a relative URI, or
-   * <code>false</code> if it is an absolute URI.
-   */
-  public boolean isRelative()
-  {
-    return scheme == null;
-  }
-
-  /**
-   * Returns <code>true</code> if this a a hierarchical URI, or
-   * <code>false</code> if it is of the generic form.
-   */
-  public boolean isHierarchical()
-  {
-    return hierarchical;
-  }
-
-  /**
-   * Returns <code>true</code> if this is a hierarcical URI with an authority
-   * component; <code>false</code> otherwise. 
-   */
-  public boolean hasAuthority()
-  {
-    return hierarchical && authority != null;
-  }
-
-  /**
-   * Returns <code>true</code> if this is a non-hierarchical URI with an
-   * opaque part component; <code>false</code> otherwise.
-   */
-  public boolean hasOpaquePart()
-  {
-    // note: hierarchical -> authority != null
-    return !hierarchical;
-  }
-
-  /**
-   * Returns <code>true</code> if this is a hierarchical URI with a device
-   * component; <code>false</code> otherwise.
-   */
-  public boolean hasDevice()
-  {
-    // note: device != null -> hierarchical
-    return device != null;
-  }
-
-  /**
-   * Returns <code>true</code> if this is a hierarchical URI with an
-   * absolute or relative path; <code>false</code> otherwise.
-   */
-  public boolean hasPath()
-  {
-    // note: (absolutePath || authority == null) -> hierarchical
-    // (authority == null && device == null && !absolutePath) -> scheme == null
-    return absolutePath || (authority == null && device == null);
-  }
-
-  /**
-   * Returns <code>true</code> if this is a hierarchical URI with an
-   * absolute path, or <code>false</code> if it is non-hierarchical, has no
-   * path, or has a relative path.
-   */
-  public boolean hasAbsolutePath()
-  {
-    // note: absolutePath -> hierarchical
-    return absolutePath;
-  }
-
-  /**
-   * Returns <code>true</code> if this is a hierarchical URI with a relative
-   * path, or <code>false</code> if it is non-hierarchical, has no path, or
-   * has an absolute path.
-   */
-  public boolean hasRelativePath()
-  {
-    // note: authority == null -> hierarchical
-    // (authority == null && device == null && !absolutePath) -> scheme == null
-    return authority == null && device == null && !absolutePath;
-  }
-
-  /**
-   * Returns <code>true</code> if this is a hierarchical URI with an empty
-   * relative path; <code>false</code> otherwise.  
-   *
-   * <p>Note that <code>!hasEmpty()</code> does <em>not</em> imply that this
-   * URI has any path segments; however, <code>hasRelativePath &&
-   * !hasEmptyPath()</code> does.
-   */
-  public boolean hasEmptyPath()
-  {
-    // note: authority == null -> hierarchical
-    // (authority == null && device == null && !absolutePath) -> scheme == null
-    return authority == null && device == null && !absolutePath &&
-      segments.length == 0;
-  }
-
-  /**
-   * Returns <code>true</code> if this is a hierarchical URI with a query
-   * component; <code>false</code> otherwise.
-   */
-  public boolean hasQuery()
-  {
-    // note: query != null -> hierarchical
-    return query != null;
-  }
-
-  /**
-   * Returns <code>true</code> if this URI has a fragment component;
-   * <code>false</code> otherwise.
-   */
-  public boolean hasFragment()
-  {
-    return fragment != null;
-  }
-
-  /**
-   * Returns <code>true</code> if this is a current document reference; that
-   * is, if it is a relative hierarchical URI with no authority, device or
-   * query components, and no path segments; <code>false</code> is returned
-   * otherwise.
-   */
-  public boolean isCurrentDocumentReference()
-  {
-    // note: authority == null -> hierarchical
-    // (authority == null && device == null && !absolutePath) -> scheme == null
-    return authority == null && device == null && !absolutePath &&
-      segments.length == 0 && query == null;
-  }
-
-  /**
-   * Returns <code>true</code> if this is a {@link
-   * #isCurrentDocumentReference() current document reference} with no
-   * fragment component; <code>false</code> otherwise.
-   *
-   * @see #isCurrentDocumentReference()
-   */
-  public boolean isEmpty()
-  {
-    // note: authority == null -> hierarchical
-    // (authority == null && device == null && !absolutePath) -> scheme == null
-    return authority == null && device == null && !absolutePath &&
-      segments.length == 0 && query == null && fragment == null;
-  }
-
-  /**
-   * Returns <code>true</code> if this is a hierarchical URI that may refer
-   * directly to a locally accessible file.  This is considered to be the
-   * case for a file-scheme absolute URI, or for a relative URI with no query;
-   * <code>false</code> is returned otherwise.
-   */
-  public boolean isFile()
-  {
-    return isHierarchical() &&
-      ((isRelative() && !hasQuery()) || SCHEME_FILE.equalsIgnoreCase(scheme));
-  }
-
-  /**
-   * Returns the hash code.
-   */
-  public int hashCode()
-  {
-    return hashCode;
-  }
-
-  /**
-   * Returns <code>true</code> if <code>obj</code> is an instance of
-   * <code>URI</code> equal to this one; <code>false</code> otherwise.
-   *
-   * <p>Equality is determined strictly by comparing components, not by
-   * attempting to interpret what resource is being identified.
-   */
-  public boolean equals(Object obj)
-  {
-    if (this == obj) return true;
-    if (!(obj instanceof URI)) return false;
-    URI uri = (URI) obj;
-
-    return hashCode == uri.hashCode() &&
-      hierarchical == uri.isHierarchical() &&
-      absolutePath == uri.hasAbsolutePath() &&
-      equals(scheme, uri.scheme()) &&
-      equals(authority, hierarchical ? uri.authority() : uri.opaquePart()) &&
-      equals(device, uri.device()) &&
-      equals(query, uri.query()) && 
-      equals(fragment, uri.fragment()) &&
-      segmentsEqual(uri);
-  }
-
-  // Tests whether this URI's path segment array is equal to that of the
-  // given uri.
-  private boolean segmentsEqual(URI uri)
-  {
-    if (segments.length != uri.segmentCount()) return false;
-    for (int i = 0, len = segments.length; i < len; i++)
-    {
-      if (!segments[i].equals(uri.segment(i))) return false;
-    }
-    return true;
-  }
-
-  // Tests two objects for equality, tolerating nulls; null is considered
-  // to be a valid value that is only equal to itself.
-  private static boolean equals(Object o1, Object o2)
-  {
-    return o1 == null ? o2 == null : o1.equals(o2);
-  }
-
-  /**
-   * If this is an absolute URI, returns the scheme component;
-   * <code>null</code> otherwise.
-   */
-  public String scheme()
-  {
-    return scheme;
-  }
-
-  /**
-   * If this is a non-hierarchical URI, returns the opaque part component;
-   * <code>null</code> otherwise.
-   */
-  public String opaquePart()
-  {
-    return isHierarchical() ? null : authority;
-  }
-
-  /**
-   * If this is a hierarchical URI with an authority component, returns it;
-   * <code>null</code> otherwise.
-   */
-  public String authority()
-  {
-    return isHierarchical() ? authority : null;
-  }
-
-  /**
-   * If this is a hierarchical URI with an authority component that has a
-   * user info portion, returns it; <code>null</code> otherwise.
-   */
-  public String userInfo()
-  { 
-    if (!hasAuthority()) return null;
-   
-    int i = authority.indexOf(USER_INFO_SEPARATOR);
-    return i < 0 ? null : authority.substring(0, i);
-  }
-
-  /**
-   * If this is a hierarchical URI with an authority component that has a
-   * host portion, returns it; <code>null</code> otherwise.
-   */
-  public String host()
-  {
-    if (!hasAuthority()) return null;
-    
-    int i = authority.indexOf(USER_INFO_SEPARATOR);
-    int j = authority.indexOf(PORT_SEPARATOR);
-    return j < 0 ? authority.substring(i + 1) : authority.substring(i + 1, j);
-  }
-
-  /**
-   * If this is a hierarchical URI with an authority component that has a
-   * port portion, returns it; <code>null</code> otherwise.
-   */
-  public String port()
-  {
-    if (!hasAuthority()) return null;
-
-    int i = authority.indexOf(PORT_SEPARATOR);
-    return i < 0 ? null : authority.substring(i + 1);
-  }
-
-  /**
-   * If this is a hierarchical URI with a device component, returns it;
-   * <code>null</code> otherwise.
-   */
-  public String device()
-  {
-    return device;
-  }
-
-  /**
-   * If this is a hierarchical URI with a path, returns an array containing
-   * the segments of the path; an empty array otherwise.  The leading
-   * separator in an absolute path is not represented in this array, but a
-   * trailing separator is represented by an empty-string segment as the
-   * final element.
-   */
-  public String[] segments()
-  {
-    return (String[])segments.clone();
-  }
-
-  /**
-   * Returns an unmodifiable list containing the same segments as the array
-   * returned by {@link #segments()}.
-   */
-  public List segmentsList()
-  {
-    return Collections.unmodifiableList(Arrays.asList(segments));
-  }
-
-  /**
-   * Returns the number of elements in the segment array that would be
-   * returned by {@link #segments()}.
-   */
-  public int segmentCount()
-  {
-    return segments.length;
-  }
-
-  /**
-   * Provides fast, indexed access to individual segments in the path
-   * segment array.
-   *
-   * @exception java.lang.IndexOutOfBoundsException if <code>i < 0</code> or
-   * <code>i >= segmentCount()</code>.
-   */
-  public String segment(int i)
-  {
-    return segments[i];
-  }
-
-  /**
-   * Returns the last segment in the segment array, or <code>null</code>.
-   */
-  public String lastSegment()
-  {
-    int len = segments.length;
-    if (len == 0) return null;
-    return segments[len - 1];
-  }
-
-  /**
-   * If this is a hierarchical URI with a path, returns a string
-   * representation of the path; <code>null</code> otherwise.  The path
-   * consists of a leading segment separator character (a slash), if the
-   * path is absolute, followed by the slash-separated path segments.  If
-   * this URI has a separate <a href="#device_explaination">device
-   * component</a>, it is <em>not</em> included in the path.  If it has a
-   * device stored as a path segment, it is included.
-   */
-  public String path()
-  {
-    if (!hasPath()) return null;
-
-    StringBuffer result = new StringBuffer();
-    if (hasAbsolutePath()) result.append(SEGMENT_SEPARATOR);
-
-    for (int i = 0, len = segments.length; i < len; i++)
-    {
-      if (i != 0) result.append(SEGMENT_SEPARATOR);
-      result.append(segments[i]);
-    }
-    return result.toString();
-  }
-
-  /**
-   * If this is a hierarchical URI with a path, returns a string
-   * representation of the path, including the authority and the 
-   * <a href="#device_explaination">device component</a>; 
-   * <code>null</code> otherwise.  
-   * <p>The format of this string is
-   * <pre>
-   *   //authority/device/pathSegment1/pathSegment2...
-   *</pre>
-   */
-  public String devicePath()
-  {
-    if (!hasPath()) return null;
-
-    StringBuffer result = new StringBuffer();
-    if (hasAuthority())
-    {
-      result.append(SEGMENT_SEPARATOR);
-      result.append(SEGMENT_SEPARATOR);
-      result.append(authority);
-
-      if (hasDevice()) result.append(SEGMENT_SEPARATOR);
-    }
-
-    if (hasDevice()) result.append(device);
-    if (hasAbsolutePath()) result.append(SEGMENT_SEPARATOR);
-
-    for (int i = 0, len = segments.length; i < len; i++)
-    {
-      if (i != 0) result.append(SEGMENT_SEPARATOR);
-      result.append(segments[i]);
-    }
-    return result.toString();
-  }
-
-  /**
-   * If this is a hierarchical URI with a query component, returns it;
-   * <code>null</code> otherwise.
-   */
-  public String query()
-  {
-    return query;
-  }
-
-
-  /**
-   * Returns the URI formed from this URI and the given query.
-   *
-   * @exception java.lang.IllegalArgumentException if
-   * <code>query</code> is not a valid query (portion) according
-   * to {@link #validQuery}.
-   */
-  public URI appendQuery(String query)
-  {
-    if (!validQuery(query))
-    {
-      throw new IllegalArgumentException(
-        "invalid query portion: " + query);
-    }
-    return new URI(hierarchical, scheme, authority, device, absolutePath, segments, query, fragment); 
-  }
-
-  /**
-   * If this URI has a non-null {@link #query}, returns the URI
-   * formed by removing it; this URI unchanged, otherwise.
-   */
-  public URI trimQuery()
-  {
-    if (query == null)
-    {
-      return this;
-    }
-    else
-    {
-      return new URI(hierarchical, scheme, authority, device, absolutePath, segments, null, fragment); 
-    }
-  }
-
-  /**
-   * If this URI has a fragment component, returns it; <code>null</code>
-   * otherwise.
-   */
-  public String fragment()
-  {
-    return fragment;
-  }
-
-  /**
-   * Returns the URI formed from this URI and the given fragment.
-   *
-   * @exception java.lang.IllegalArgumentException if
-   * <code>fragment</code> is not a valid fragment (portion) according
-   * to {@link #validFragment}.
-   */
-  public URI appendFragment(String fragment)
-  {
-    if (!validFragment(fragment))
-    {
-      throw new IllegalArgumentException(
-        "invalid fragment portion: " + fragment);
-    }
-    URI result = new URI(hierarchical, scheme, authority, device, absolutePath, segments, query, fragment); 
-    result.cachedTrimFragment = this;
-    return result;
-  }
-
-  /**
-   * If this URI has a non-null {@link #fragment}, returns the URI
-   * formed by removing it; this URI unchanged, otherwise.
-   */
-  public URI trimFragment()
-  {
-    if (fragment == null)
-    {
-      return this;
-    }
-    else if (cachedTrimFragment == null)
-    {
-      cachedTrimFragment = new URI(hierarchical, scheme, authority, device, absolutePath, segments, query, null); 
-    }
-
-    return cachedTrimFragment;
-  }
-
-  /**
-   * Resolves this URI reference against a <code>base</code> absolute
-   * hierarchical URI, returning the resulting absolute URI.  If already
-   * absolute, the URI itself is returned.  URI resolution is described in
-   * detail in section 5.2 of <a href="http://www.ietf.org/rfc/rfc2396.txt">RFC
-   * 2396</a>, "Resolving Relative References to Absolute Form."
-   *
-   * <p>During resolution, empty segments, self references ("."), and parent
-   * references ("..") are interpreted, so that they can be removed from the
-   * path.  Step 6(g) gives a choice of how to handle the case where parent
-   * references point to a path above the root: the offending segments can
-   * be preserved or discarded.  This method preserves them.  To have them
-   * discarded, please use the {@link #resolve(URI, boolean)} method.
-   *
-   * @exception java.lang.IllegalArgumentException if <code>base</code> is
-   * non-hierarchical or is relative.
-   */
-  public URI resolve(URI base)
-  {
-    return resolve(base, true);
-  }
-
-  /**
-   * Resolves this URI reference against a <code>base</code> absolute
-   * hierarchical URI, returning the resulting absolute URI.  If already
-   * absolute, the URI itself is returned.  URI resolution is described in
-   * detail in section 5.2 of <a href="http://www.ietf.org/rfc/rfc2396.txt">RFC
-   * 2396</a>, "Resolving Relative References to Absolute Form."
-   *
-   * <p>During resultion, empty segments, self references ("."), and parent
-   * references ("..") are interpreted, so that they can be removed from the
-   * path.  Step 6(g) gives a choice of how to handle the case where parent
-   * references point to a path above the root: the offending segments can
-   * be preserved or discarded.  This method can do either.
-   *
-   * @param preserveRootParent <code>true</code> if segments refering to the
-   * parent of the root path are to be preserved; <code>false</code> if they
-   * are to be discarded.
-   *
-   * @exception java.lang.IllegalArgumentException if <code>base</code> is
-   * non-hierarchical or is relative.
-   */
-  public URI resolve(URI base, boolean preserveRootParents)
-  {
-    if (!base.isHierarchical() || base.isRelative())
-    {
-      throw new IllegalArgumentException(
-        "resolve against non-hierarchical or relative base");
-    }
-
-    // an absolute URI needs no resolving
-    if (!isRelative()) return this;
-
-    // note: isRelative() -> hierarchical
-
-    String newAuthority = authority;
-    String newDevice = device;
-    boolean newAbsolutePath = absolutePath;
-    String[] newSegments = segments;
-    String newQuery = query;
-    // note: it's okay for two URIs to share a segments array, since
-    // neither will ever modify it
-    
-    if (authority == null)
-    {
-      // no authority: use base's
-      newAuthority = base.authority();
-
-      if (device == null)
-      {
-        // no device: use base's
-        newDevice = base.device();
-
-        if (hasEmptyPath() && query == null)
-        {
-          // current document reference: use base path and query
-          newAbsolutePath = base.hasAbsolutePath();
-          newSegments = base.segments();
-          newQuery = base.query();
-        }
-        else if (hasRelativePath())
-        {
-          // relative path: merge with base and keep query (note: if the
-          // base has no path and this a non-empty relative path, there is
-          // an implied root in the resulting path) 
-          newAbsolutePath = base.hasAbsolutePath() || !hasEmptyPath();
-          newSegments = newAbsolutePath ? mergePath(base, preserveRootParents)
-            : NO_SEGMENTS;
-        }
-        // else absolute path: keep it and query
-      }
-      // else keep device, path, and query
-    }
-    // else keep authority, device, path, and query
-    
-    // always keep fragment, even if null, and use scheme from base
-    return new URI(true, base.scheme(), newAuthority, newDevice,
-                   newAbsolutePath, newSegments, newQuery, fragment);
-  }
-
-  // Merges this URI's relative path with the base non-relative path.  If
-  // base has no path, treat it as the root absolute path, unless this has
-  // no path either.
-  private String[] mergePath(URI base, boolean preserveRootParents)
-  {
-    if (base.hasRelativePath())
-    {
-      throw new IllegalArgumentException("merge against relative path");
-    }
-    if (!hasRelativePath())
-    {
-      throw new IllegalStateException("merge non-relative path");
-    }
-
-    int baseSegmentCount = base.segmentCount();
-    int segmentCount = segments.length;
-    String[] stack = new String[baseSegmentCount + segmentCount];
-    int sp = 0;
-
-    // use a stack to accumulate segments of base, except for the last
-    // (i.e. skip trailing separator and anything following it), and of
-    // relative path
-    for (int i = 0; i < baseSegmentCount - 1; i++)
-    {
-      sp = accumulate(stack, sp, base.segment(i), preserveRootParents);
-    }
-
-    for (int i = 0; i < segmentCount; i++)
-    {
-      sp = accumulate(stack, sp, segments[i], preserveRootParents);
-    }
-
-    // if the relative path is empty or ends in an empty segment, a parent 
-    // reference, or a self referenfce, add a trailing separator to a
-    // non-empty path
-    if (sp > 0 &&  (segmentCount == 0 ||
-                    SEGMENT_EMPTY.equals(segments[segmentCount - 1]) ||
-                    SEGMENT_PARENT.equals(segments[segmentCount - 1]) ||
-                    SEGMENT_SELF.equals(segments[segmentCount - 1])))
-    {
-      stack[sp++] = SEGMENT_EMPTY;
-    }
-
-    // return a correctly sized result
-    String[] result = new String[sp];
-    System.arraycopy(stack, 0, result, 0, sp);
-    return result;
-  }
-
-  // Adds a segment to a stack, skipping empty segments and self references,
-  // and interpreting parent references.
-  private static int accumulate(String[] stack, int sp, String segment,
-                                boolean preserveRootParents)
-  {
-    if (SEGMENT_PARENT.equals(segment))
-    {
-      if (sp == 0)
-      {
-        // special care must be taken for a root's parent reference: it is
-        // either ignored or the symbolic reference itself is pushed
-        if (preserveRootParents) stack[sp++] = segment;
-      }
-      else
-      {
-        // unless we're already accumulating root parent references,
-        // parent references simply pop the last segment descended
-        if (SEGMENT_PARENT.equals(stack[sp - 1])) stack[sp++] = segment;
-        else sp--;
-      }
-    }
-    else if (!SEGMENT_EMPTY.equals(segment) && !SEGMENT_SELF.equals(segment))
-    {
-      // skip empty segments and self references; push everything else
-      stack[sp++] = segment;
-    }
-    return sp;
-  }
-
-  /**
-   * Finds the shortest relative or, if necessary, the absolute URI that,
-   * when resolved against the given <code>base</code> absolute hierarchical
-   * URI using {@link #resolve(URI)}, will yield this absolute URI.  
-   *
-   * @exception java.lang.IllegalArgumentException if <code>base</code> is
-   * non-hierarchical or is relative.
-   * @exception java.lang.IllegalStateException if <code>this</code> is
-   * relative.
-   */
-  public URI deresolve(URI base)
-  {
-    return deresolve(base, true, false, true);
-  }
-
-  /**
-   * Finds an absolute URI that, when resolved against the given
-   * <code>base</code> absolute hierarchical URI using {@link #resolve(URI,
-   * boolean)}, will yield this absolute URI.
-   *
-   * @param preserveRootParents the boolean argument to <code>resolve(URI,
-   * boolean)</code> for which the returned URI should resolve to this URI.
-   * @param anyRelPath if <code>true</code>, the returned URI's path (if
-   * any) will be relative, if possible.  If <code>false</code>, the form of
-   * the result's path will depend upon the next parameter.
-   * @param shorterRelPath if <code>anyRelPath</code> is <code>false</code>
-   * and this parameter is <code>true</code>, the returned URI's path (if
-   * any) will be relative, if one can be found that is no longer (by number
-   * of segments) than the absolute path.  If both <code>anyRelPath</code>
-   * and this parameter are <code>false</code>, it will be absolute.
-   *
-   * @exception java.lang.IllegalArgumentException if <code>base</code> is
-   * non-hierarchical or is relative.
-   * @exception java.lang.IllegalStateException if <code>this</code> is
-   * relative.
-   */
-  public URI deresolve(URI base, boolean preserveRootParents,
-                       boolean anyRelPath, boolean shorterRelPath)
-  {
-    if (!base.isHierarchical() || base.isRelative())
-    {
-      throw new IllegalArgumentException(
-        "deresolve against non-hierarchical or relative base");
-    }
-    if (isRelative())
-    {
-      throw new IllegalStateException("deresolve relative URI");
-    }
-
-    // note: these assertions imply that neither this nor the base URI has a
-    // relative path; thus, both have either an absolute path or no path
-    
-    // different scheme: need complete, absolute URI
-    if (!scheme.equals(base.scheme())) return this;
-
-    // since base must be hierarchical, and since a non-hierarchical URI
-    // must have both scheme and opaque part, the complete absolute URI is
-    // needed to resolve to a non-hierarchical URI
-    if (!isHierarchical()) return this;
-
-    String newAuthority = authority;
-    String newDevice = device;
-    boolean newAbsolutePath = absolutePath;
-    String[] newSegments = segments;
-    String newQuery = query;
-
-    if (equals(authority, base.authority()) &&
-        (hasDevice() || hasPath() || (!base.hasDevice() && !base.hasPath())))
-    {
-      // matching authorities and no device or path removal
-      newAuthority = null;
-
-      if (equals(device, base.device()) && (hasPath() || !base.hasPath()))
-      {
-        // matching devices and no path removal
-        newDevice = null;
-
-        // exception if (!hasPath() && base.hasPath())
-
-        if (!anyRelPath && !shorterRelPath)
-        {
-          // user rejects a relative path: keep absolute or no path
-        }
-        else if (hasPath() == base.hasPath() && segmentsEqual(base) &&
-                 equals(query, base.query()))
-        {
-          // current document reference: keep no path or query
-          newAbsolutePath = false;
-          newSegments = NO_SEGMENTS;
-          newQuery = null;
-        }
-        else if (!hasPath() && !base.hasPath())
-        {
-          // no paths: keep query only
-          newAbsolutePath = false;
-          newSegments = NO_SEGMENTS;
-        }
-        // exception if (!hasAbsolutePath())
-        else if (hasCollapsableSegments(preserveRootParents))
-        {
-          // path form demands an absolute path: keep it and query
-        }
-        else
-        {
-          // keep query and select relative or absolute path based on length
-          String[] rel = findRelativePath(base, preserveRootParents);
-          if (anyRelPath || segments.length > rel.length)
-          {
-            // user demands a relative path or the absolute path is longer
-            newAbsolutePath = false;
-            newSegments = rel;
-          }
-          // else keep shorter absolute path
-        }
-      }
-      // else keep device, path, and query
-    }
-    // else keep authority, device, path, and query
-
-    // always include fragment, even if null
-    return new URI(true, null, newAuthority, newDevice, newAbsolutePath,
-                   newSegments, newQuery, fragment);
-  }
-
-  // Returns true if the non-relative path includes segments that would be
-  // collapsed when resolving; false otherwise.  If preserveRootParents is
-  // true, collapsable segments include any empty segments, except for the
-  // last segment, as well as and parent and self references.  If
-  // preserveRootsParents is false, parent references are not collapsable if
-  // they are the first segment or preceeded only by other parent
-  // references.
-  private boolean hasCollapsableSegments(boolean preserveRootParents)
-  {
-    if (hasRelativePath())
-    {
-      throw new IllegalStateException("test collapsability of relative path");
-    }
-
-    for (int i = 0, len = segments.length; i < len; i++)
-    {
-      String segment = segments[i];
-      if ((i < len - 1 && SEGMENT_EMPTY.equals(segment)) ||
-          SEGMENT_SELF.equals(segment) ||
-          SEGMENT_PARENT.equals(segment) && (
-            !preserveRootParents || (
-              i != 0 && !SEGMENT_PARENT.equals(segments[i - 1]))))
-      {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  // Returns the shortest relative path between the the non-relative path of
-  // the given base and this absolute path.  If the base has no path, it is
-  // treated as the root absolute path.
-  private String[] findRelativePath(URI base, boolean preserveRootParents)
-  {
-    if (base.hasRelativePath())
-    {
-      throw new IllegalArgumentException(
-        "find relative path against base with relative path");
-    }
-    if (!hasAbsolutePath())
-    {
-      throw new IllegalArgumentException(
-        "find relative path of non-absolute path");
-    }
-
-    // treat an empty base path as the root absolute path
-    String[] startPath = base.collapseSegments(preserveRootParents);
-    String[] endPath = segments;
-
-    // drop last segment from base, as in resolving
-    int startCount = startPath.length > 0 ? startPath.length - 1 : 0;
-    int endCount = endPath.length;
-
-    // index of first segment that is different between endPath and startPath
-    int diff = 0;
-
-    // if endPath is shorter than startPath, the last segment of endPath may
-    // not be compared: because startPath has been collapsed and had its
-    // last segment removed, all preceeding segments can be considered non-
-    // empty and followed by a separator, while the last segment of endPath
-    // will either be non-empty and not followed by a separator, or just empty
-    for (int count = startCount < endCount ? startCount : endCount - 1;
-         diff < count && startPath[diff].equals(endPath[diff]); diff++);
-
-    int upCount = startCount - diff;
-    int downCount = endCount - diff;
-
-    // a single separator, possibly preceeded by some parent reference
-    // segments, is redundant
-    if (downCount == 1 && SEGMENT_EMPTY.equals(endPath[endCount - 1]))
-    {
-      downCount = 0;
-    }
-
-    // an empty path needs to be replaced by a single "." if there is no
-    // query, to distinguish it from a current document reference
-    if (upCount + downCount == 0)
-    {
-      if (query == null) return new String[] { SEGMENT_SELF };
-      return NO_SEGMENTS;
-    }
-
-    // return a correctly sized result
-    String[] result = new String[upCount + downCount];
-    Arrays.fill(result, 0, upCount, SEGMENT_PARENT);
-    System.arraycopy(endPath, diff, result, upCount, downCount);
-    return result;
-  }
-
-  // Collapses non-ending empty segments, parent references, and self
-  // references in a non-relative path, returning the same path that would
-  // be produced from the base hierarchical URI as part of a resolve.
-  String[] collapseSegments(boolean preserveRootParents)
-  {
-    if (hasRelativePath())
-    {
-      throw new IllegalStateException("collapse relative path");
-    }
-
-    if (!hasCollapsableSegments(preserveRootParents)) return segments();
-
-    // use a stack to accumulate segments
-    int segmentCount = segments.length;
-    String[] stack = new String[segmentCount];
-    int sp = 0;
-
-    for (int i = 0; i < segmentCount; i++)
-    {
-      sp = accumulate(stack, sp, segments[i], preserveRootParents);
-    }
-
-    // if the path is non-empty and originally ended in an empty segment, a
-    // parent reference, or a self reference, add a trailing separator
-    if (sp > 0 && (SEGMENT_EMPTY.equals(segments[segmentCount - 1]) ||
-                   SEGMENT_PARENT.equals(segments[segmentCount - 1]) ||
-                   SEGMENT_SELF.equals(segments[segmentCount - 1])))
-    {                   
-      stack[sp++] = SEGMENT_EMPTY;
-    }
-
-    // return a correctly sized result
-    String[] result = new String[sp];
-    System.arraycopy(stack, 0, result, 0, sp);
-    return result;
-  }
-
-  /**
-   * Returns the string representation of this URI.  For a generic,
-   * non-hierarchical URI, this looks like:
-   *
-   * <pre>
-   *   scheme:opaquePart#fragment</pre>
-   * 
-   * <p>For a hierarchical URI, it looks like:
-   * <pre>
-   *   scheme://authority/device/pathSegment1/pathSegment2...?query#fragment</pre>
-   * 
-   * <p>Of course, absent components and their separators will be omitted.
-   */
-  public String toString()
-  {
-    if (cachedToString == null)
-    {
-      StringBuffer result = new StringBuffer();
-      if (!isRelative())
-      {
-        result.append(scheme);
-        result.append(SCHEME_SEPARATOR);
-      }
-
-      if (isHierarchical())
-      {
-        if (hasAuthority())
-        {
-          result.append(AUTHORITY_SEPARATOR);
-          result.append(authority);
-        }
-
-        if (hasDevice())
-        {
-          result.append(SEGMENT_SEPARATOR);
-          result.append(device);
-        }
-
-        if (hasAbsolutePath()) result.append(SEGMENT_SEPARATOR);
-
-        for (int i = 0, len = segments.length; i < len; i++)
-        {
-          if (i != 0) result.append(SEGMENT_SEPARATOR);
-          result.append(segments[i]);
-        }
-
-        if (hasQuery())
-        {
-          result.append(QUERY_SEPARATOR);
-          result.append(query);
-        }
-      }
-      else
-      {
-        result.append(authority);
-      }
-
-      if (hasFragment())
-      {
-        result.append(FRAGMENT_SEPARATOR);
-        result.append(fragment);
-      }
-      cachedToString = result.toString();
-    }
-    return cachedToString;
-  }
-
-  // Returns a string representation of this URI for debugging, explicitly
-  // showing each of the components.
-  String toString(boolean includeSimpleForm)
-  {
-    StringBuffer result = new StringBuffer();
-    if (includeSimpleForm) result.append(toString());
-    result.append("\n hierarchical: ");
-    result.append(hierarchical);
-    result.append("\n       scheme: ");
-    result.append(scheme);
-    result.append("\n    authority: ");
-    result.append(authority);
-    result.append("\n       device: ");
-    result.append(device);
-    result.append("\n absolutePath: ");
-    result.append(absolutePath);
-    result.append("\n     segments: ");
-    if (segments.length == 0) result.append("<empty>");
-    for (int i = 0, len = segments.length; i < len; i++)
-    {
-      if (i > 0) result.append("\n               ");
-      result.append(segments[i]);
-    }
-    result.append("\n        query: ");
-    result.append(query);
-    result.append("\n     fragment: ");
-    result.append(fragment);
-    return result.toString();
-  }
-
-  /**
-   * If this URI may refer directly to a locally accessible file, as
-   * determined by {@link #isFile()}, returns the URI formatted as a
-   * pathname to that file; null otherwise.
-   *
-   * <p>The format of this string is 
-   * <pre>
-   *   //authority/device/pathSegment1/pathSegment2...</pre>
-   * 
-   * <p>However, the character used as a separator is system-dependant and
-   * obtained from {@link java.io.File#separatorChar}.
-   */
-  public String toFileString()
-  {
-    if (!isFile()) return null;
-
-    StringBuffer result = new StringBuffer();
-    char separator = File.separatorChar;
-
-    if (hasAuthority())
-    {
-      result.append(separator);
-      result.append(separator);
-      result.append(authority);
-
-      if (hasDevice()) result.append(separator);
-    }
-
-    if (hasDevice()) result.append(device);
-    if (hasAbsolutePath()) result.append(separator);
-
-    for (int i = 0, len = segments.length; i < len; i++)
-    {
-      if (i != 0) result.append(separator);
-      result.append(segments[i]);
-    }
-    return result.toString();
-  }
-
-  /**
-   * Returns the URI formed by appending the specified segment on to the end
-   * of the path of this URI, if hierarchical; this URI unchanged,
-   * otherwise.  If this URI has an authority and/or device, but no path,
-   * the segment becomes the first under the root in an absolute path.
-   *
-   * @exception java.lang.IllegalArgumentException if <code>segment</code>
-   * is not a valid segment according to {@link #validSegment}.
-   */
-  public URI appendSegment(String segment)
-  {
-    if (!validSegment(segment))
-    {
-      throw new IllegalArgumentException("invalid segment: " + segment);
-    }
-
-    if (!isHierarchical()) return this;
-
-    // absolute path or no path -> absolute path
-    boolean newAbsolutePath = !hasRelativePath();
-
-    int len = segments.length;
-    String[] newSegments = new String[len + 1];
-    System.arraycopy(segments, 0, newSegments, 0, len);
-    newSegments[len] = segment;
-
-    return new URI(true, scheme, authority, device, newAbsolutePath,
-                   newSegments, query, fragment);
-  }
-
-  /**
-   * Returns the URI formed by appending the specified segments on to the
-   * end of the path of this URI, if hierarchical; this URI unchanged,
-   * otherwise.  If this URI has an authority and/or device, but no path,
-   * the segments are made to form an absolute path.
-   *
-   * @param segments an array of non-null strings, each representing one
-   * segment of the path.  If desired, a trailing separator should be
-   * represented by an empty-string segment as the last element of the
-   * array.
-   *
-   * @exception java.lang.IllegalArgumentException if <code>segments</code>
-   * is not a valid segment array according to {@link #validSegments}.
-   */
-  public URI appendSegments(String[] segments)
-  {
-    if (!validSegments(segments))
-    {
-      String s = segments == null ? "invalid segments: " + segments :
-        "invalid segment: " + firstInvalidSegment(segments);
-      throw new IllegalArgumentException(s);
-    }
-
-    if (!isHierarchical()) return this;
-
-    // absolute path or no path -> absolute path
-    boolean newAbsolutePath = !hasRelativePath(); 
-
-    int len = this.segments.length;
-    int segmentsCount = segments.length;
-    String[] newSegments = new String[len + segmentsCount];
-    System.arraycopy(this.segments, 0, newSegments, 0, len);
-    System.arraycopy(segments, 0, newSegments, len, segmentsCount);
-    
-    return new URI(true, scheme, authority, device, newAbsolutePath,
-                   newSegments, query, fragment);
-  }
-
-  /**
-   * Returns the URI formed by trimming the specified number of segments
-   * (including empty segments, such as one representing a trailing
-   * separator) from the end of the path of this URI, if hierarchical;
-   * otherwise, this URI is returned unchanged.
-   *
-   * <p>Note that if all segments are trimmed from an absolute path, the
-   * root absolute path remains.
-   * 
-   * @param i the number of segments to be trimmed in the returned URI.  If
-   * less than 1, this URI is returned unchanged; if equal to or greater
-   * than the number of segments in this URI's path, all segments are
-   * trimmed.  
-   */
-  public URI trimSegments(int i)
-  {
-    if (!isHierarchical() || i < 1) return this;
-
-    String[] newSegments = NO_SEGMENTS;
-    int len = segments.length - i;
-    if (len > 0)
-    {
-      newSegments = new String[len];
-      System.arraycopy(segments, 0, newSegments, 0, len);
-    }
-    return new URI(true, scheme, authority, device, absolutePath,
-                   newSegments, query, fragment);
-  }
-
-  /**
-   * Returns <code>true</code> if this is a hierarchical URI that has a path
-   * that ends with a trailing separator; <code>false</code> otherwise.
-   *
-   * <p>A trailing separator is represented as an empty segment as the
-   * last segment in the path; note that this definition does <em>not</em>
-   * include the lone separator in the root absolute path.
-   */
-  public boolean hasTrailingPathSeparator()
-  {
-    return segments.length > 0 && 
-      SEGMENT_EMPTY.equals(segments[segments.length - 1]);
-  }
-
-  /**
-   * If this is a hierarchical URI whose path includes a file extension,
-   * that file extension is returned; null otherwise.  We define a file
-   * extension as any string following the last period (".") in the final
-   * path segment.  If there is no path, the path ends in a trailing
-   * separator, or the final segment contains no period, then we consider
-   * there to be no file extension.  If the final segment ends in a period,
-   * then the file extension is an empty string.
-   */
-  public String fileExtension()
-  {
-    int len = segments.length;
-    if (len == 0) return null;
-
-    String lastSegment = segments[len - 1];
-    int i = lastSegment.lastIndexOf(FILE_EXTENSION_SEPARATOR);
-    return i < 0 ? null : lastSegment.substring(i + 1);
-  }
-
-  /**
-   * Returns the URI formed by appending a period (".") followed by the
-   * specified file extension to the last path segment of this URI, if it is
-   * hierarchical with a non-empty path ending in a non-empty segment;
-   * otherwise, this URI is returned unchanged.
-
-   * <p>The extension is appended regardless of whether the segment already
-   * contains an extension.
-   *
-   * @exception java.lang.IllegalArgumentException if
-   * <code>fileExtension</code> is not a valid segment (portion) according
-   * to {@link #validSegment}.
-   */
-  public URI appendFileExtension(String fileExtension)
-  {
-    if (!validSegment(fileExtension))
-    {
-      throw new IllegalArgumentException(
-        "invalid segment portion: " + fileExtension);
-    }
-
-    int len = segments.length;
-    if (len == 0) return this;
-
-    String lastSegment = segments[len - 1];
-    if (SEGMENT_EMPTY.equals(lastSegment)) return this;
-    StringBuffer newLastSegment = new StringBuffer(lastSegment);
-    newLastSegment.append(FILE_EXTENSION_SEPARATOR);
-    newLastSegment.append(fileExtension);
-
-    String[] newSegments = new String[len];
-    System.arraycopy(segments, 0, newSegments, 0, len - 1);
-    newSegments[len - 1] = newLastSegment.toString();
-    
-    // note: segments.length > 0 -> hierarchical
-    return new URI(true, scheme, authority, device, absolutePath,
-                   newSegments, query, fragment); 
-  }
-
-  /**
-   * If this URI has a non-null {@link #fileExtension}, returns the URI
-   * formed by removing it; this URI unchanged, otherwise.
-   */
-  public URI trimFileExtension()
-  {
-    int len = segments.length;
-    if (len == 0) return this;
-
-    String lastSegment = segments[len - 1];
-    int i = lastSegment.lastIndexOf(FILE_EXTENSION_SEPARATOR);
-    if (i < 0) return this;
-
-    String newLastSegment = lastSegment.substring(0, i);
-    String[] newSegments = new String[len];
-    System.arraycopy(segments, 0, newSegments, 0, len - 1);
-    newSegments[len - 1] = newLastSegment;
-
-    // note: segments.length > 0 -> hierarchical
-    return new URI(true, scheme, authority, device, absolutePath,
-                   newSegments, query, fragment); 
-  }
-
-  /**
-   * Returns <code>true</code> if this is a hierarchical URI that ends in a
-   * slash; that is, it has a trailing path separator or is the root
-   * absolute path, and has no query and no fragment; <code>false</code>
-   * is returned otherwise.
-   */
-  public boolean isPrefix()
-  {
-    return hierarchical && query == null && fragment == null &&
-      (hasTrailingPathSeparator() || (absolutePath && segments.length == 0));
-  }
-
-  /**
-   * If this is a hierarchical URI reference and <code>oldPrefix</code> is a
-   * prefix of it, this returns the URI formed by replacing it by
-   * <code>newPrefix</code>; <code>null</code> otherwise.
-   *
-   * <p>In order to be a prefix, the <code>oldPrefix</code>'s
-   * {@link #isPrefix} must return <code>true</code>, and it must match this
-   * URI's scheme, authority, and device.  Also, the paths must match, up to
-   * prefix's end.
-   *
-   * @exception java.lang.IllegalArgumentException if either
-   * <code>oldPrefix</code> or <code>newPrefix</code> is not a prefix URI
-   * according to {@link #isPrefix}.
-   */
-  public URI replacePrefix(URI oldPrefix, URI newPrefix)
-  {
-    if (!oldPrefix.isPrefix() || !newPrefix.isPrefix())
-    {
-      String which = oldPrefix.isPrefix() ? "new" : "old";
-      throw new IllegalArgumentException("non-prefix " + which + " value");
-    }
-
-    // Get what's left of the segments after trimming the prefix.
-    String[] tailSegments = getTailSegments(oldPrefix);
-    if (tailSegments == null) return null;
-
-    // If the new prefix has segments, it is not the root absolute path,
-    // and we need to drop the trailing empty segment and append the tail
-    // segments.
-    String[] mergedSegments = tailSegments;
-    if (newPrefix.segmentCount() != 0)
-    {
-      int segmentsToKeep = newPrefix.segmentCount() - 1;
-      mergedSegments = new String[segmentsToKeep + tailSegments.length];
-      System.arraycopy(newPrefix.segments(), 0, mergedSegments, 0,
-                       segmentsToKeep);
-
-      if (tailSegments.length != 0)
-      {
-        System.arraycopy(tailSegments, 0, mergedSegments, segmentsToKeep,
-                         tailSegments.length);
-      }
-    }
-
-    return new URI(true, newPrefix.scheme(), newPrefix.authority(),
-                   newPrefix.device(), newPrefix.hasAbsolutePath(),
-                   mergedSegments, query, fragment);
-  }
-
-  // If this is a hierarchical URI reference and prefix is a prefix of it,
-  // returns the portion of the path remaining after that prefix has been
-  // trimmed; null otherwise.
-  private String[] getTailSegments(URI prefix)
-  {
-    if (!prefix.isPrefix())
-    {
-      throw new IllegalArgumentException("non-prefix trim");
-    }
-
-    // Don't even consider it unless this is hierarchical and has scheme,
-    // authority, device and path absoluteness equal to those of the prefix.
-    if (!hierarchical ||
-        !equals(scheme, prefix.scheme()) ||
-        !equals(authority, prefix.authority()) ||
-        !equals(device, prefix.device()) ||
-        absolutePath != prefix.hasAbsolutePath())
-    {
-      return null;
-    }
-
-    // If the prefix has no segments, then it is the root absolute path, and
-    // we know this is an absolute path, too.
-    if (prefix.segmentCount() == 0) return segments;
-
-    // This must have no fewer segments than the prefix.  Since the prefix
-    // is not the root absolute path, its last segment is empty; all others
-    // must match.
-    int i = 0;
-    int segmentsToCompare = prefix.segmentCount() - 1;
-    if (segments.length <= segmentsToCompare) return null;
-
-    for (; i < segmentsToCompare; i++)
-    {
-      if (!segments[i].equals(prefix.segment(i))) return null;
-    }
-
-    // The prefix really is a prefix of this.  If this has just one more,
-    // empty segment, the paths are the same.
-    if (i == segments.length - 1 && SEGMENT_EMPTY.equals(segments[i]))
-    {
-      return NO_SEGMENTS;
-    }
-    
-    // Otherwise, the path needs only the remaining segments.
-    String[] newSegments = new String[segments.length - i];
-    System.arraycopy(segments, i, newSegments, 0, newSegments.length);
-    return newSegments;
-  }
-}
diff --git a/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/URIResolverExtensionDescriptor.java b/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/URIResolverExtensionDescriptor.java
deleted file mode 100644
index 2394f5e..0000000
--- a/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/URIResolverExtensionDescriptor.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - Initial API and implementation
-*   Jens Lukowski/Innoopract - initial renaming/restructuring
-* 
-*/
-package org.eclipse.wst.common.uriresolver.internal;
-
-import java.util.List;
-
-import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolverExtension;
-
-
-/**
- * @author csalter
- * 
- * To change the template for this generated type comment go to Window -
- * Preferences - Java - Code Generation - Code and Comments
- */
-public class URIResolverExtensionDescriptor
-{
-	protected URIResolverExtension resolver;
-	//protected String projectNature;
-	protected String fileType;
-	protected String className;
-	public List projectNatureIds;
-	protected String resourceType;
-	protected int stage = URIResolverExtensionRegistry.STAGE_POSTNORMALIZATION;
-  protected String priority = URIResolverExtensionRegistry.PRIORITY_MEDIUM;
-	protected ClassLoader classLoader;
-	protected boolean error;
-
-	public URIResolverExtensionDescriptor(String className, ClassLoader classLoader, List projectNatureIds, String resourceType, int stage, String priority)
-	{
-		this.className = className;
-		this.classLoader = classLoader;
-		this.projectNatureIds = projectNatureIds;
-		this.resourceType = resourceType;
-		this.stage = stage;
-    this.priority = priority;
-	}
-
-	public URIResolverExtension getResolver()
-	{
-
-		if (resolver == null && className != null && !error)
-		{
-			try
-			{
-				Class theClass = classLoader != null ? classLoader.loadClass(className) : Class.forName(className);
-				resolver = (URIResolverExtension) theClass.newInstance();
-			}
-			catch (Exception e)
-			{
-				error = true;
-				e.printStackTrace();
-			}
-		}
-		return resolver;
-	}
-
-	public boolean matches(String projectNatureId, String resourceType, int stage)
-	{
-	  if(projectNatureIds.contains(projectNatureId))
-	  {
-		return matches(this.resourceType, resourceType) && this.stage == stage;
-	  }
-	  return false;
-	}
-
-	public boolean matches(String a, String b)
-	{
-		return (a != null) ? a.equals(b) : a == b;
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/URIResolverExtensionRegistry.java b/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/URIResolverExtensionRegistry.java
deleted file mode 100644
index 2587c7b..0000000
--- a/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/URIResolverExtensionRegistry.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - Initial API and implementation
-*   Jens Lukowski/Innoopract - initial renaming/restructuring
-* 
-*/
-package org.eclipse.wst.common.uriresolver.internal;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-
-
-
-public class URIResolverExtensionRegistry {
-	protected HashMap map = new HashMap();
-	public static final int STAGE_PRENORMALIZATION = 1;
-	public static final int STAGE_POSTNORMALIZATION = 2;	
-  public static final String PRIORITY_LOW = "low";
-  public static final String PRIORITY_MEDIUM = "medium";
-  public static final String PRIORITY_HIGH = "high";
-	protected final static String NULL_PROJECT_NATURE_ID = "";
-	
-	public URIResolverExtensionRegistry() {
-	}
-
-	public void put(String className, ClassLoader classLoader, List projectNatureIds, String resourceType, int stage, String priority) {
-		if(projectNatureIds == null)
-		  projectNatureIds = new ArrayList();
-		if(projectNatureIds.isEmpty())
-		{
-		  projectNatureIds.add(NULL_PROJECT_NATURE_ID);
-		}
-		URIResolverExtensionDescriptor info = new URIResolverExtensionDescriptor(className, classLoader, projectNatureIds, resourceType, stage, priority);
-		
-		Iterator idsIter = projectNatureIds.iterator();
-		while(idsIter.hasNext())
-		{
-		  String key = (String)idsIter.next();
-		  
-      HashMap priorityMap = (HashMap)map.get(key);
-      if(priorityMap == null)
-      {
-        priorityMap = new HashMap();
-        map.put(key, priorityMap);
-        priorityMap.put(PRIORITY_HIGH, new ArrayList());
-        priorityMap.put(PRIORITY_MEDIUM, new ArrayList());
-        priorityMap.put(PRIORITY_LOW, new ArrayList());
-      }
-      List list = (List)priorityMap.get(priority);
-		  //List list = (List)map.get(key);   
-//		  if (list == null)
-//		  {			
-//			list = new ArrayList();
-//			priorityMap.put(priority, list);
-//		  }
-		
-		  list.add(info);	
-		}
-	}
-	
-	
-	/**
-	 * Return a list of URIResolverExtensionDescriptor objects that apply to this project. The list
-   * is in the priority order high, medium, low.
-	 * 
-	 */
-	public List getExtensionDescriptors(IProject project)
-	{
-		List result = new ArrayList();
-		for (Iterator i = map.keySet().iterator(); i.hasNext(); )
-		{
-			String key = (String)i.next();
-			try{		
-				if (key == NULL_PROJECT_NATURE_ID ||
-				    project == null ||
-					project.hasNature(key))
-				{				
-					result.addAll((List)((HashMap)map.get(key)).get(PRIORITY_HIGH)); 
-          result.addAll((List)((HashMap)map.get(key)).get(PRIORITY_MEDIUM)); 
-          result.addAll((List)((HashMap)map.get(key)).get(PRIORITY_LOW)); 
-				}	
-			}
-			catch (CoreException e)
-			{}
-		}
-		return result;
-	}
-	
-	/**
-	 * Return a list of URIResolver objects that match the stage.
-	 * 
-	 */	
-	public List getMatchingURIResolvers(List resolverInfoList, int stage)
-	{
-		List result = new ArrayList();			
-		for (Iterator i = resolverInfoList.iterator(); i.hasNext(); ){
-			URIResolverExtensionDescriptor info = (URIResolverExtensionDescriptor)i.next();		
-			if (info.stage == stage)
-			{    
-				Object resolver = info.getResolver();
-				if (resolver != null)
-				{ 									
-					result.add(resolver);
-				}					
-			}
-		}
-		return result;
-	}	
-
-//	public URIResolverExtension get(String key) {
-//		URIResolverExtensionDescriptor info = (URIResolverExtensionDescriptor) map.get(key);
-//		return info != null ? info.getResolver() : null;
-//	}
-
-
-	
-	/*
-	protected URIResolverExtensionDescriptor getMatchingURIResolverExtensionDescriptor(List list, String projectNatureId, String resourceType, int stage)
-	{
-		URIResolverExtensionDescriptor result = null;
-		for (Iterator i = list.iterator(); i.hasNext(); )
-		{
-			URIResolverExtensionDescriptor info = (URIResolverExtensionDescriptor)i.next();
-			if (info.matches(projectNatureId, resourceType, stage))
-			{
-				result = info;
-				break;
-			}
-		}
-		return result;
-	}*/	
-}
-
diff --git a/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/URIResolverExtensionRegistryReader.java b/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/URIResolverExtensionRegistryReader.java
deleted file mode 100644
index c1ec4cb..0000000
--- a/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/URIResolverExtensionRegistryReader.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - Initial API and implementation
-*   Jens Lukowski/Innoopract - initial renaming/restructuring
-* 
-*/
-package org.eclipse.wst.common.uriresolver.internal;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IPluginRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolverPlugin;
-
-/**
- * @author csalter
- *
- * 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 URIResolverExtensionRegistryReader {
-
-		protected static final String EXTENSION_POINT_ID = "resolverExtensions";
-		protected static final String TAG_NAME = "resolverExtension";
-		protected static final String ATT_ID = "id";
-	    protected static final String ELEM_PROJECT_NATURE_ID = "projectNature";
-	    protected static final String ATT_RESOURCE_TYPE = "resourceType";		    		
-		protected static final String ATT_CLASS = "class";
-	    protected static final String ATT_STAGE = "stage";		
-	    protected static final String VAL_STAGE_PRE = "prenormalization";
-	    protected static final String VAL_STAGE_POST = "postnormalization";
-	    protected static final String ATT_VALUE = "value";
-      protected static final String ATT_PRIORITY = "priority";
-	   
-
-		protected URIResolverExtensionRegistry registry;
-
-		public URIResolverExtensionRegistryReader(URIResolverExtensionRegistry registry) {
-			this.registry = registry;
-		}
-
-		/**
-		 * read from plugin registry and parse it.
-		 */
-		public void readRegistry() {
-			IPluginRegistry pluginRegistry = Platform.getPluginRegistry();
-			IExtensionPoint point = pluginRegistry.getExtensionPoint(URIResolverPlugin.getInstance().getDescriptor().getUniqueIdentifier(), EXTENSION_POINT_ID);
-			if (point != null) {
-				IConfigurationElement[] elements = point.getConfigurationElements();
-				for (int i = 0; i < elements.length; i++) {
-					readElement(elements[i]);
-				}
-			}
-		}
-
-		/**
-		 * readElement() - parse and deal with an extension like:
-		 *
-		 * <extension point="org.eclipse.wst.contentmodel.util_implementation">
-		 *    <util_implementation class = org.eclipse.wst.baseutil.CMUtilImplementationImpl  />
-		 * </extension>
-		 */
-		protected void readElement(IConfigurationElement element) {
-			if (element.getName().equals(TAG_NAME)) {
-				//String id = element.getAttribute(ATT_ID);
-				String className = element.getAttribute(ATT_CLASS);
-				//String projectNatureId = element.getAttribute(ATT_PROJECT_NATURE_ID);
-				String resourceType = element.getAttribute(ATT_RESOURCE_TYPE);
-				String stage = element.getAttribute(ATT_STAGE);	
-        String priority = element.getAttribute(ATT_PRIORITY); 
-        if(priority == null || priority.equals(""))
-        {
-          priority = URIResolverExtensionRegistry.PRIORITY_MEDIUM;
-        }
-				List projectNatureIds = new ArrayList();
-				IConfigurationElement[] ids = element.getChildren(ELEM_PROJECT_NATURE_ID);
-				int numids = ids.length;
-				for(int i = 0; i < numids; i++)
-				{
-				  String tempid = ids[i].getAttribute(ATT_VALUE);
-				  
-				  if(tempid != null)
-				  {
-				    projectNatureIds.add(tempid);
-				  }
-				}
-				if (className != null) {
-					try {
-						ClassLoader classLoader = element.getDeclaringExtension().getDeclaringPluginDescriptor().getPlugin().getClass().getClassLoader();
-						int stageint = URIResolverExtensionRegistry.STAGE_POSTNORMALIZATION;
-						if(stage.equalsIgnoreCase(VAL_STAGE_PRE))
-						{
-						  stageint = URIResolverExtensionRegistry.STAGE_PRENORMALIZATION;
-						}
-						registry.put(className, classLoader, projectNatureIds, resourceType, stageint, priority);
-					} catch (Exception e) {
-					}
-				}
-			}
-		}
-	}
diff --git a/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/provisional/URIResolver.java b/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/provisional/URIResolver.java
deleted file mode 100644
index ed7dab9..0000000
--- a/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/provisional/URIResolver.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - Initial API and implementation
-*   Jens Lukowski/Innoopract - initial renaming/restructuring
-* 
-*/
-package org.eclipse.wst.common.uriresolver.internal.provisional;
-
-/**
- * A URIResolver is used to resolve URI references to resources.
- *  
- */
-public interface URIResolver {
-	
-	/**
-	 * @param baseLocation - the location of the resource that contains the uri 
-	 * @param publicId - an optional public identifier (i.e. namespace name), or null if none
-	 * @param systemId - an absolute or relative URI, or null if none 
-	 * @return an absolute URI
-	 */
-	public String resolve(String baseLocation, String publicId, String systemId);
-}
diff --git a/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/provisional/URIResolverExtension.java b/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/provisional/URIResolverExtension.java
deleted file mode 100644
index 117e9d0..0000000
--- a/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/provisional/URIResolverExtension.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - Initial API and implementation
-*   Jens Lukowski/Innoopract - initial renaming/restructuring
-* 
-*/
-package org.eclipse.wst.common.uriresolver.internal.provisional;
-
-import org.eclipse.core.resources.IProject;
-
-/**
- * An extension to augment the behaviour of a URIResolver.  Extensions are project aware
- * so that they can apply specialized project specific resolving rules. 
- */
-public interface URIResolverExtension {
-	public String resolve(IProject project, String baseLocation, String publicId, String systemId);
-}
diff --git a/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/provisional/URIResolverPlugin.java b/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/provisional/URIResolverPlugin.java
deleted file mode 100644
index 42603a8..0000000
--- a/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/provisional/URIResolverPlugin.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved.   This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-* 
-* Contributors:
-*   IBM - Initial API and implementation
-*   Jens Lukowski/Innoopract - initial renaming/restructuring
-* 
-*/
-package org.eclipse.wst.common.uriresolver.internal.provisional;
-
-import java.util.Map;
-
-import org.eclipse.core.runtime.IPluginDescriptor;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.wst.common.uriresolver.internal.ExtensibleURIResolver;
-import org.eclipse.wst.common.uriresolver.internal.URIResolverExtensionRegistry;
-import org.eclipse.wst.common.uriresolver.internal.URIResolverExtensionRegistryReader;
-
-
-public class URIResolverPlugin extends Plugin {
-	protected static URIResolverPlugin instance;	
-	protected URIResolverExtensionRegistry xmlResolverExtensionRegistry;
-
-	public static URIResolverPlugin getInstance()
-	{
-		return instance;
-	}
-	
-	public URIResolverPlugin(IPluginDescriptor descriptor) {
-		super(descriptor);
-		instance = this;
-	}	
-	
-					
-	public static URIResolver createResolver()
-	{
-		return createResolver(null);
-	}
-	
-	public static URIResolver createResolver(Map properties)
-	{
-		// TODO... utilize properties
-		return new ExtensibleURIResolver();
-	}	
-	
-	//public static URIResolver createResolver(IProject project)
-	//{
-	//	return new ExtensibleURIResolver(project);
-	//}	
-	
-	public URIResolverExtensionRegistry getXMLResolverExtensionRegistry()
-	{
-		if (xmlResolverExtensionRegistry == null)
-		{
-			xmlResolverExtensionRegistry = new URIResolverExtensionRegistry();
-			new URIResolverExtensionRegistryReader(xmlResolverExtensionRegistry).readRegistry();	
-		}	
-		return xmlResolverExtensionRegistry; 
-	}
-}
diff --git a/plugins/org.eclipse.wst.internet.cache/.classpath b/plugins/org.eclipse.wst.internet.cache/.classpath
deleted file mode 100644
index 065ac06..0000000
--- a/plugins/org.eclipse.wst.internet.cache/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/plugins/org.eclipse.wst.internet.cache/.cvsignore b/plugins/org.eclipse.wst.internet.cache/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/plugins/org.eclipse.wst.internet.cache/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/plugins/org.eclipse.wst.internet.cache/.project b/plugins/org.eclipse.wst.internet.cache/.project
deleted file mode 100644
index d7188f0..0000000
--- a/plugins/org.eclipse.wst.internet.cache/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.internet.cache</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.internet.cache/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.internet.cache/META-INF/MANIFEST.MF
deleted file mode 100644
index 2ddb3c4..0000000
--- a/plugins/org.eclipse.wst.internet.cache/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,16 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %_PLUGIN_NAME
-Bundle-SymbolicName: org.eclipse.wst.internet.cache; singleton:=true
-Bundle-Version: 1.0.0
-Bundle-ClassPath: cache.jar
-Bundle-Activator: org.eclipse.wst.internet.cache.internal.CachePlugin
-Bundle-Vendor: %_PLUGIN_PROVIDER
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.wst.common.uriresolver,
- org.eclipse.core.resources,
- org.eclipse.wst.xml.uriresolver
-Eclipse-AutoStart: true
-Export-Package: org.eclipse.wst.internet.cache.internal;x-friends:="org.eclipse.wst.internet.cache.tests"
diff --git a/plugins/org.eclipse.wst.internet.cache/build.properties b/plugins/org.eclipse.wst.internet.cache/build.properties
deleted file mode 100644
index f768600..0000000
--- a/plugins/org.eclipse.wst.internet.cache/build.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-source.cache.jar = src/
-output.cache.jar = bin/
-bin.includes = plugin.xml,\
-               META-INF/,\
-               cache.jar,\
-               plugin.properties
-src.includes = plugin.xml,\
-               plugin.properties,\
-               exsd/,\
-               build.properties,\
-               src/,\
-               META-INF/
diff --git a/plugins/org.eclipse.wst.internet.cache/exsd/cacheresource.exsd b/plugins/org.eclipse.wst.internet.cache/exsd/cacheresource.exsd
deleted file mode 100644
index d42a334..0000000
--- a/plugins/org.eclipse.wst.internet.cache/exsd/cacheresource.exsd
+++ /dev/null
@@ -1,101 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.internet.cache">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.wst.internet.cache" id="cacheresource" name="Cache a resource"/>
-      </appInfo>
-      <documentation>
-         [Enter description of this extension point.]
-      </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="cacheresource">
-      <complexType>
-         <attribute name="uri" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/plugins/org.eclipse.wst.internet.cache/plugin.properties b/plugins/org.eclipse.wst.internet.cache/plugin.properties
deleted file mode 100644
index 88ebd84..0000000
--- a/plugins/org.eclipse.wst.internet.cache/plugin.properties
+++ /dev/null
@@ -1,15 +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
-###############################################################################
-
-_PLUGIN_PROVIDER                       = Eclipse
-_PLUGIN_NAME                           = Cache URI Resolver Plug-in
-
-_UI_CACHE_PREFERENCE_PAGE_TITLE        = Cache
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.internet.cache/plugin.xml b/plugins/org.eclipse.wst.internet.cache/plugin.xml
deleted file mode 100644
index c6c649b..0000000
--- a/plugins/org.eclipse.wst.internet.cache/plugin.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-   <extension-point name="Cache a resource" id="cacheresource" schema="exsd/cacheresource.exsd"/>
-
-   <extension
-         point="org.eclipse.ui.preferencePages">
-      <page
-            name="%_UI_CACHE_PREFERENCE_PAGE_TITLE"
-            class="org.eclipse.wst.internet.cache.internal.preferences.CachePreferencePage"
-            id="org.eclipse.wst.internet.cache.internal.preferences.CachePreferencePage"
-            category = "org.eclipse.internet">
-      </page>
-   </extension>
-   <extension
-         point="org.eclipse.core.runtime.preferences">
-      <initializer
-            class="org.eclipse.wst.internet.cache.internal.preferences.PreferenceInitializer">
-      </initializer>
-   </extension>
-   
-   <extension point="org.eclipse.wst.common.uriresolver.resolverExtensions">
-      <resolverExtension
-            stage="postnormalization"
-            priority="low"
-            class="org.eclipse.wst.internet.cache.internal.CacheURIResolverExtension">
-      </resolverExtension>
-   </extension>
-</plugin>
diff --git a/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/Cache.java b/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/Cache.java
deleted file mode 100644
index e2a8df7..0000000
--- a/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/Cache.java
+++ /dev/null
@@ -1,522 +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.internet.cache.internal;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.Enumeration;
-import java.util.HashSet;
-import java.util.Hashtable;
-import java.util.Random;
-import java.util.Set;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.transform.Result;
-import javax.xml.transform.Source;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Platform;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * The cache holds references to remote resources. The cache can store resources,
- * retrieve resources, and delete resources.
- *
- */
-public class Cache 
-{
-  /**
-   * String instances.
-   */
-  private static final String URI = "uri";
-  private static final String LOCATION ="location";
-  private static final String ENTRY = "entry";
-  private static final String CACHE = "cache";
-  private static final String LAST_MODIFIED = "lastModified";
-  private static final String EXPIRATION_TIME = "expirationTime";
-  private static final String FILE_PROTOCOL = "file:///";
-  private static final String CACHE_FILE = "cache.xml";
-  private static final String CACHE_EXTENSION = ".cache";
-  private static final String TEMP = "temp";
-  private static final String CACHE_PREFIX = "wtpcache";
-  private static final String CACHE_SUFFIX = null;
-  /**
-   * The default timeout for a cache entry is 1 day.
-   */
-  private static final long TIMEOUT = 86400000;
-	
-  /**
-   * The one and only instance of the cache.
-   */
-  private static Cache cacheInstance = null;
-  
-  /**
-   * The cache is stored in a hashtable.
-   */
-  private Hashtable cache;
-  
-  /**
-   * A set of uncached resources. The cache was not able to cache resources
-   * in this list. This list allows quickly skipping over these resources in
-   * future requests. 
-   */
-  private Set uncached;
-  
-  /**
-   * The location of the cache
-   */
-  private File cacheLocation = null;
-  
-  /**
-   * Private constructor.
-   */
-  protected Cache(IPath cacheLocation)
-  {
-	  this.cacheLocation = cacheLocation.toFile();//Platform.getPluginStateLocation(CachePlugin.getDefault()).toFile();
-    cache = new Hashtable();
-    uncached = new HashSet();
-  }
-  
-  /**
-   * Get the one and only instance of the cache.
-   * 
-   * @return The one and only instance of the cache.
-   */
-  public static Cache getInstance()
-  {
-//	  if(cacheInstance == null)
-//	  {
-//		  cacheInstance = new Cache(cacheLocation);
-//		  cacheInstance.open(cacheLocation);
-//	  }
-	  return cacheInstance;
-  }
-  
-  /**
-   * Return the local resource for the specified uri. If there is no resource
-   * the cache will attempt to download and cache the resource before returning.
-   * If a remote resource cannot be cached this method will return null.
-   * 
-   * @param uri The URI for which a resource is requested.
-   * @return The local resource for the specified URI or null if a remote resource cannot be cached.
-   */
-  public String getResource(String uri)
-  {
-	  if(uri == null) return null;
-	  CacheEntry result = (CacheEntry)cache.get(uri);
-	  
-	  // If no result is in the cache and the URI is of an allowed type
-	  // retrieve it and store it in the cache.
-	  if(result == null)
-	  {
-      
-      if(!uncached.contains(result))
-		  {
-        result = cacheResource(uri); 
-      }
-	  }
-	  // Retreive a fresh copy of the result if it has timed out.
-	  else if(result.hasExpired())
-	  {
-		result = refreshCacheEntry(result);
-	  }
-	  if(result == null || result.getLocalFile() == null)
-	  {
-		return null;
-	  }
-	  return FILE_PROTOCOL + cacheLocation.toString() + "/" + result.getLocalFile();
-  }
-  
-  /**
-   * Get the list of uncached resources.
-   * 
-   * @return The list of uncached resources.
-   */
-  protected String[] getUncachedURIs()
-  {
-    return (String[])uncached.toArray(new String[uncached.size()]);
-  }
-  
-  /**
-   * Clear the list of uncached resources.
-   */
-  protected void clearUncachedURIs()
-  {
-    uncached.clear();
-  }
-  
-  /**
-   * Add an uncached resource to the list.
-   */
-  protected void addUncachedURI(String uri)
-  {
-    uncached.add(uri);
-  }
-  
-  /**
-   * Cache the specified resource. This method creates a local version of the
-   * remote resource and adds the resource reference to the cache. If the resource
-   * cannot be accessed it is not added and null is returned.
-   * 
-   * @param uri The remote URI to cache.
-   * @return A new CacheEntry representing the cached resource or null if the remote
-   *         resource could not be retrieved.
-   */
-  protected CacheEntry cacheResource(String uri)
-  {
-	  CacheEntry cacheEntry = null;
-	  URLConnection conn = null;
-	  InputStream is = null;
-	  OutputStream os = null;
-	  try
-	  {
-		  URL url = new URL(uri);
-		  conn = url.openConnection();
-		  conn.connect();
-		  // Determine if this resource can be cached.
-		  if(conn.getUseCaches())
-		  {
-		    is = conn.getInputStream();//url.openStream();
-		  
-		    Random rand = new Random();
-			String fileName = rand.nextInt() + CACHE_EXTENSION;
-		    File file = new File(cacheLocation, fileName);
-		    // If the file already exists we need to change the file name.
-		    while(!file.createNewFile())
-		    {
-			  fileName = rand.nextInt() + CACHE_EXTENSION;
-			  file = new File(cacheLocation,fileName);
-		    }
-		    os = new FileOutputStream(file);
-		    byte[] bytes = new byte[1024];
-		    int bytelength;
-		    while((bytelength = is.read(bytes)) != -1)
-		    {
-			  os.write(bytes, 0, bytelength);
-		    }
-			long lastModified = conn.getLastModified();
-		    long expiration = conn.getExpiration();
-			if(expiration == 0)
-			{
-			  expiration = System.currentTimeMillis() + TIMEOUT;
-			}
-		    cacheEntry = new CacheEntry(uri, fileName, lastModified, expiration);
-		    cache.put(uri,cacheEntry);
-		  }
-
-	  }
-	  catch(Throwable t)
-	  {
-		  // Put the entry in the uncached list so the resolution work will not be performed again.
-      // TODO: Add in a timeout for the non-located uris.
-      uncached.add(uri);
-	  }
-	  finally
-	  {
-		  if(is != null)
-		  {
-			  try
-			  {
-			    is.close();
-			  }
-			  catch(IOException e)
-			  {
-			    // Do nothing if the stream cannot be closed.
-			  }
-		  }
-		  if(os != null)
-		  {
-			  try
-			  {
-			    os.close();
-			  }
-			  catch(IOException e)
-			  {
-				// Do nothing if the stream cannot be closed. 
-			  }
-		  }
-	  }
-	  return cacheEntry;
-  }
-  
-  /**
-   * Refresh the cache entry if necessary. The cache entry will be refreshed
-   * if the remote resource is accessible and the last modified time of the
-   * remote resource is greater than the last modified time of the cached
-   * resource.
-   * 
-   * @param cacheEntry The cache entry to refresh.
-   * @return The refreshed cache entry.
-   */
-  protected CacheEntry refreshCacheEntry(CacheEntry cacheEntry)
-  {
-	  URLConnection conn = null;
-	  InputStream is = null;
-	  OutputStream os = null;
-	  try
-	  {
-		  URL url = new URL(cacheEntry.getURI());
-		  conn = url.openConnection();
-		  conn.connect();
-		  
-		  long lastModified = conn.getLastModified();
-	      if(lastModified > cacheEntry.getLastModified())
-		  {
-			long expiration = conn.getExpiration();
-		    if(expiration == 0)
-			{
-			  expiration = System.currentTimeMillis() + TIMEOUT;
-			}
-			
-		    is = conn.getInputStream();
-			
-			String localFile = cacheEntry.getLocalFile();
-  
-		    File tempFile = File.createTempFile(CACHE_PREFIX, CACHE_SUFFIX);
-			tempFile.deleteOnExit();
-
-		    os = new FileOutputStream(tempFile);
-		    byte[] bytes = new byte[1024];
-		    int bytelength;
-		    while((bytelength = is.read(bytes)) != -1)
-		    {
-			  os.write(bytes, 0, bytelength);
-		    }
-			is.close();
-			os.close();
-			deleteFile(cacheEntry.getURI());
-			File f = new File(cacheLocation, localFile);
-			tempFile.renameTo(f);
-			cacheEntry.setExpiration(expiration);
-			cacheEntry.setLastModified(lastModified);
-		  }
-		  // The cache entry hasn't changed. Just update the expiration time.
-	      else
-		  {
-			long expiration = conn.getExpiration();
-			if(expiration == 0)
-			{
-			  expiration = System.currentTimeMillis() + TIMEOUT;
-			}
-			cacheEntry.setExpiration(expiration);
-		  }
-
-	  }
-	  catch(Exception e)
-	  {
-      // Do nothing.
-	  }
-	  finally
-	  {
-		  if(is != null)
-		  {
-			  try
-			  {
-			    is.close();
-			  }
-			  catch(IOException e)
-			  {
-			    // Do nothing if the stream cannot be closed.
-			  }
-		  }
-		  if(os != null)
-		  {
-			  try
-			  {
-			    os.close();
-			  }
-			  catch(IOException e)
-			  {
-				// Do nothing if the stream cannot be closed. 
-			  }
-		  }
-	  }
-	  return cacheEntry;
-  }
-  
-  /**
-   * Get an array of the cached URIs.
-   * 
-   * @return An array of the cached URIs.
-   */
-  public String[] getCachedURIs()
-  {
-	Set keyset = cache.keySet();
-	return (String[])keyset.toArray(new String[keyset.size()]);
-  }
-  
-  /**
-   * Close the cache. Closing the cache involves serializing the data to an XML file
-   * in the plugin state location.
-   */
-  protected void close()
-  {
-	  DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-      try {
-        DocumentBuilder builder = factory.newDocumentBuilder();
-        Document cachedoc = builder.newDocument();
-		Element rootelem = cachedoc.createElement(CACHE);
-		cachedoc.appendChild(rootelem);
-		
-	  Enumeration uris = cache.keys();
-	  while(uris.hasMoreElements())
-	  {
-		  String key = (String)uris.nextElement();
-		  CacheEntry cacheEntry = (CacheEntry)cache.get(key);
-		  if(cacheEntry != null)
-		  {
-			  Element entry = cachedoc.createElement(ENTRY);
-			  entry.setAttribute(URI, key);
-			  entry.setAttribute(LOCATION, cacheEntry.getLocalFile());
-			  entry.setAttribute(EXPIRATION_TIME, String.valueOf(cacheEntry.getExpirationTime()));
-			  entry.setAttribute(LAST_MODIFIED, String.valueOf(cacheEntry.getLastModified()));
-			  rootelem.appendChild(entry);
-		  }
-	  }
-	  
-	  // Write the cache entry.
-	  TransformerFactory tFactory  = TransformerFactory.newInstance();
-      Transformer transformer = tFactory.newTransformer();
-      Source input = new DOMSource(cachedoc);
-	  IPath stateLocation = Platform.getPluginStateLocation(CachePlugin.getDefault());
-      Result output = new StreamResult(stateLocation.toString() + "/" + CACHE_FILE);
-      transformer.transform(input, output);
-
-      }catch(Exception e)
-	  {
-		  System.out.println("Unable to store internet cache.");
-	  }
-	  cacheInstance = null;
-  }
-  
-  /**
-   * Open the cache. Opening the cache involves parsing the cache XML file in
-   * the plugin state location if it can be read.
-   */
-  protected static void open(IPath cacheLocation)
-  {
-    cacheInstance = new Cache(cacheLocation);
-	  DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-      try {
-		  
-		IPath stateLocation = cacheLocation;
-        DocumentBuilder builder = factory.newDocumentBuilder();
-        Document cachedoc = builder.parse(stateLocation.toString() + "/" + CACHE_FILE);
-		Element rootelem = cachedoc.getDocumentElement();
-		NodeList entries = rootelem.getChildNodes();
-		int numEntries = entries.getLength();
-		for(int i = 0; i < numEntries; i++)
-		{
-			Node entry = entries.item(i);
-			if(entry instanceof Element)
-			{
-				Element e = (Element)entry;
-				if(e.getNodeName().equals(ENTRY))
-				{
-					String uri = e.getAttribute(URI);
-					String location = e.getAttribute(LOCATION);
-					String lm = e.getAttribute(LAST_MODIFIED);
-					String et = e.getAttribute(EXPIRATION_TIME);
-					long lastModified = -1;
-					long expirationTime = -1;
-					try
-					{
-						lastModified = Long.parseLong(lm);
-					}
-					catch(NumberFormatException nfe)
-					{
-					}
-					try
-					{
-						expirationTime = Long.parseLong(et);
-					}
-					catch(NumberFormatException nfe)
-					{
-					}
-					if(uri != null && location != null)
-					{
-					  cacheInstance.cache.put(uri, new CacheEntry(uri, location, lastModified, expirationTime));
-					}
-				}
-			}
-		}
-      }
-	  catch(FileNotFoundException e)
-	  {
-		// If the file doesn't exist in the correct location there is nothing to load. Do nothing.
-	  }
-	  catch(Exception e)
-	  {
-		  System.out.println("Unable to load cache.");
-	  }
-  }
-  
-  /**
-   * Clear all of the entries from the cache. This method also deletes the cache files.
-   */
-  public void clear()
-  {
-	Enumeration keys = cache.keys();
-	while(keys.hasMoreElements())
-	{
-	  String key = (String)keys.nextElement();
-	  
-	  deleteFile(key);
-	}
-	cache.clear();
-  }
-  
-  /**
-   * Delete the cache entry specified by the given URI.
-   * @param uri The URI entry to remove from the catalog.
-   */
-  public void deleteEntry(String uri)
-  {
-	  if(uri == null) return;
-	  
-	  deleteFile(uri);
-	  cache.remove(uri);
-  }
-  
-  /**
-   * Delete the file specified by the URI.
-   * 
-   * @param uri The URI of the file to delete.
-   */
-  protected void deleteFile(String uri)
-  {
-	  CacheEntry cacheEntry = (CacheEntry)cache.get(uri);
-	  if(cacheEntry != null)
-	  {
-		String location = cacheLocation.toString() + "/" + cacheEntry.getLocalFile();
-	    File file = new File(location);
-	    if(!file.delete())
-	    {
-	      System.out.println("Unable to delete file " + location + " from cache.");
-	    } 
-	  }
-  }
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/CacheEntry.java b/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/CacheEntry.java
deleted file mode 100644
index 817ec06..0000000
--- a/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/CacheEntry.java
+++ /dev/null
@@ -1,114 +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.internet.cache.internal;
-
-/**
- * A cache entry contains a URI, a local file, and a timeout.
- */
-public class CacheEntry 
-{
-  private String uri;
-  private String localFile;
-  private long lastModified;
-  private long expirationTime;
-  
-  /**
-   * Create a new cache entry.
-   * 
-   * @param uri The remote URI of the cache entry.
-   * @param localFile The local file that contains the cached entry.
-   * @param lastModifie The time this resource was last modified.
-   * @param expirationTime The time in miliseconds that this cache entry will
-   *                       expire.
-   */
-  public CacheEntry(String uri, String localFile, long lastModified, long expirationTime)
-  {
-	this.uri = uri;
-	this.localFile = localFile;
-	this.lastModified = lastModified;
-	this.expirationTime = expirationTime;
-  }
-  
-  /**
-   * The cache entry is expired if its expiration time is less then the
-   * current system time and not equal to -1.
-   * 
-   * @return True if this cached entry has expired, false otherwise.
-   */
-  public boolean hasExpired()
-  {
-	 if(expirationTime != -1 && System.currentTimeMillis() > expirationTime)
-	 {
-	   return true;
-	 }
-	 return false;
-  }
-  
-  /**
-   * Set the time in miliseconds that this cache entry will expire.
-   * 
-   * @param timeout The time in miliseconds that this cache entry will expire.
-   *                -1 indicates that this entry will not expire.
-   */
-  public void setExpiration(long expirationTime)
-  {
-	this.expirationTime = expirationTime;
-  }
-  
-  /**
-   * Get the time at which this cache entry will expire.
-   * 
-   * @return The time at which this cache entry will expire.
-   */
-  public long getExpirationTime()
-  {
-	return expirationTime;
-  }
-  
-  /**
-   * Get the remote URI for this cache entry.
-   * 
-   * @return The remote URI for this cache entry.
-   */
-  public String getURI()
-  {
-	return uri;
-  }
-  
-  /**
-   * Get the local file for this cache entry.
-   * 
-   * @return The local file for this cache entry.
-   */
-  public String getLocalFile()
-  {
-	return localFile;
-  }
-  
-  /**
-   * Get the last time this cache entry was modified.
-   * 
-   * @return The last time this cache entry was modified.
-   */
-  public long getLastModified()
-  {
-	return lastModified;
-  }
-  
-  /**
-   * Set the last time this cache entry was modified.
-   */
-  public void setLastModified(long lastModified)
-  {
-	this.lastModified = lastModified;
-  }
-}
diff --git a/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/CacheJob.java b/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/CacheJob.java
deleted file mode 100644
index 6b60f55..0000000
--- a/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/CacheJob.java
+++ /dev/null
@@ -1,92 +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.internet.cache.internal;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-
-/**
- * A cache job runs once an hour to cache any prespecified resources which
- * should be cached and any resources for which an attempt was previously 
- * made to cache them but they were unable to be cached.
- */
-public class CacheJob extends Job
-{
-  private static final String _UI_CACHE_MONITOR_NAME = "_UI_CACHE_MONITOR_NAME";
-  private static final String _UI_CACHE_MONITOR_CACHING = "_UI_CACHE_MONITOR_CACHING";
-  private String[] specifiedURIsToCache = null;
-  private static final long SCHEDULE_TIME = 3600000;
-
-  /**
-   * Constructor.
-   */
-  public CacheJob()
-  {
-    super(CachePlugin.getResourceString(_UI_CACHE_MONITOR_NAME));
-    //specifiedURIsToCache = ToCacheRegistryReader.getInstance().getURIsToCache();
-  }
-
-  /**
-   * @see org.eclipse.core.internal.jobs.InternalJob#run(org.eclipse.core.runtime.IProgressMonitor)
-   */
-  protected IStatus run(IProgressMonitor monitor)
-  {
-    Cache cache = Cache.getInstance();
-    String[] uncachedURIs = cache.getUncachedURIs();
-    int numUncachedURIs = uncachedURIs.length;
-    // Special case for the first time the job is run which will attemp to 
-    // cache specified resources.
-    if(specifiedURIsToCache != null)
-    {
-      int numSpecifiedURIs = specifiedURIsToCache.length;
-      String[] temp = new String[numUncachedURIs + numSpecifiedURIs];
-      System.arraycopy(specifiedURIsToCache, 0, temp, 0, numSpecifiedURIs);
-      System.arraycopy(uncachedURIs, 0, temp, numSpecifiedURIs, numUncachedURIs);
-      uncachedURIs = temp;
-      numUncachedURIs = uncachedURIs.length;
-      specifiedURIsToCache = null;
-    }
-
-    cache.clearUncachedURIs();
-    monitor.beginTask(CachePlugin.getResourceString(_UI_CACHE_MONITOR_NAME), numUncachedURIs);
-    try
-    {
-      for(int i = 0; i < numUncachedURIs; i++)
-      {
-        if (monitor.isCanceled())
-        {
-          for(int j = i; j < numUncachedURIs; j++)
-          {
-            cache.addUncachedURI(uncachedURIs[j]);
-          }
-          return Status.CANCEL_STATUS;
-        }
-        String uri = uncachedURIs[i];
-        monitor.subTask(CachePlugin.getResourceString(_UI_CACHE_MONITOR_CACHING, uri));
-        cache.getResource(uri);
-        monitor.worked(1);
-        monitor.subTask("");
-      }
-      monitor.done();
-      return Status.OK_STATUS;
-    } 
-    finally
-    {
-      schedule(SCHEDULE_TIME); // schedule the next time the job should run
-    }
-  }
-
-}
-
-
diff --git a/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/CachePlugin.java b/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/CachePlugin.java
deleted file mode 100644
index 5d2b505..0000000
--- a/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/CachePlugin.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.internet.cache.internal;
-
-import java.text.MessageFormat;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.eclipse.wst.internet.cache.internal.preferences.PreferenceConstants;
-import org.osgi.framework.BundleContext;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class CachePlugin extends AbstractUIPlugin {
-	public static final String PLUGIN_ID = "org.eclipse.wst.internet.cache";
-	//The shared instance.
-	private static CachePlugin plugin;
-	//Resource bundle.
-	private ResourceBundle resourceBundle;
-  
-  private CacheJob job = null;
-	
-	/**
-	 * The constructor.
-	 */
-	public CachePlugin() {
-		super();
-		plugin = this;
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-    ToCacheRegistryReader.getInstance().readRegistry();
-    Cache.open(Platform.getPluginStateLocation(this));
-    if(getPluginPreferences().contains(PreferenceConstants.CACHE_ENABLED))
-    {
-      setCacheEnabled(getPluginPreferences().getBoolean(PreferenceConstants.CACHE_ENABLED));
-    }
-    else
-    {
-      setCacheEnabled(true);
-    }
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	public void stop(BundleContext context) throws Exception {
-		Cache.getInstance().close();
-    stopJob();
-		super.stop(context);
-		plugin = null;
-		resourceBundle = null;
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static CachePlugin 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 = ResourceBundle.getBundle("org.eclipse.wst.internet.cache.internal.CachePluginResources");
-		try {
-			return (bundle != null) ? bundle.getString(key) : key;
-		} catch (MissingResourceException e) {
-			return key;
-		}
-	}
-  
-  /**
-   * Returns the string from the plugin's resource bundle using the specified object,
-   * or 'key' if not found.
-   */
-  public static String getResourceString(String key, Object s1)
-  {
-    return MessageFormat.format(getResourceString(key), new Object[] { s1 });
-  }
-
-	/**
-	 * Returns the plugin's resource bundle,
-	 */
-	public ResourceBundle getResourceBundle() {
-		try {
-			if (resourceBundle == null)
-				resourceBundle = ResourceBundle.getBundle("plugin");
-		} catch (MissingResourceException x) {
-			resourceBundle = null;
-		}
-		return resourceBundle;
-	}
-
-	/**
-	 * Returns an image descriptor for the image file at the given
-	 * plug-in relative path.
-	 *
-	 * @param path the path
-	 * @return the image descriptor
-	 */
-	public static ImageDescriptor getImageDescriptor(String path) {
-		return AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.wst.internet.cache", path);
-	}
-  
-  public void setCacheEnabled(boolean enabled)
-  {
-    getPluginPreferences().setValue(PreferenceConstants.CACHE_ENABLED, enabled);
-    if(enabled)
-    {
-      startJob();
-    }
-    else
-    {
-      stopJob();
-    }
-  }
-  
-  public boolean isCacheEnabled()
-  {
-    if(getPluginPreferences().contains(PreferenceConstants.CACHE_ENABLED))
-      return getPluginPreferences().getBoolean(PreferenceConstants.CACHE_ENABLED);
-    return true;
-  }
-  
-  private void startJob()
-  {
-    if(job == null)
-    {
-      job = new CacheJob();
-      job.setPriority(CacheJob.DECORATE);
-      job.schedule(); // start as soon as possible
-    }
-  }
-  
-  private void stopJob()
-  {
-    if(job != null)
-    {
-      job.cancel();
-    }
-    job = null;
-  }
-}
diff --git a/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/CachePluginResources.properties b/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/CachePluginResources.properties
deleted file mode 100644
index 9fd0a38..0000000
--- a/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/CachePluginResources.properties
+++ /dev/null
@@ -1,24 +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
-###############################################################################
-
-# Cache preference page strings.
-_UI_CONFIRM_CLEAR_CACHE_DIALOG_TITLE          = Clear Cache?
-_UI_CONFIRM_CLEAR_CACHE_DIALOG_MESSAGE        = Delete all cache entries?
-_UI_CONFIRM_DELETE_CACHE_ENTRY_DIALOG_TITLE   = Delete Entry?
-_UI_CONFIRM_DELETE_CACHE_ENTRY_DIALOG_MESSAGE = Delete all selected cache entries?
-_UI_BUTTON_CLEAR_CACHE                        = Clear Cache
-_UI_BUTTON_DELETE_ENTRY                       = Delete Entry
-_UI_PREF_CACHE_ENTRIES_TITLE                  = Cache Entries
-_UI_PREF_CACHE_CACHE_OPTION                   = Disable Caching
-
-# Cache monitor strings.
-_UI_CACHE_MONITOR_NAME                        = Caching Remote Resources
-_UI_CACHE_MONITOR_CACHING                     = Caching {0}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/CacheURIResolverExtension.java b/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/CacheURIResolverExtension.java
deleted file mode 100644
index 189be60..0000000
--- a/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/CacheURIResolverExtension.java
+++ /dev/null
@@ -1,45 +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.internet.cache.internal;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolverExtension;
-import org.eclipse.wst.xml.uriresolver.internal.util.URIHelper;
-
-/**
- * A cache URI resolver. This resolver will cache remote resources and return
- * the local copy if they can be cached. If a resource cannot be cached the
- * resource returns null.
- */
-public class CacheURIResolverExtension implements URIResolverExtension 
-{
-	/**
-	 * @see org.eclipse.wst.common.uriresolver.internal.provisional.URIResolverExtension#resolve(org.eclipse.core.resources.IProject, java.lang.String, java.lang.String, java.lang.String)
-	 */
-	public String resolve(IProject project, String baseLocation, String publicId, String systemId)
-	{ 
-    if(CachePlugin.getDefault().isCacheEnabled())
-    {
-		  String resource = null;
-		  if(systemId != null)
-		  {
-		    resource = URIHelper.normalize(systemId, baseLocation, null);
-		  } 
-		
-		  if(resource != null && (resource.startsWith("http:") || resource.startsWith("ftp:")))
-		  {
-		    return Cache.getInstance().getResource(resource);
-		  }
-    }
-		return null;
-	  }
-}
diff --git a/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/ToCacheRegistryReader.java b/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/ToCacheRegistryReader.java
deleted file mode 100644
index 9d93a5b..0000000
--- a/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/ToCacheRegistryReader.java
+++ /dev/null
@@ -1,99 +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.internet.cache.internal;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-
-/**
- * The ToCacheRegistryReaders reads Eclipse extensions which specify
- * resources to cache. An extension point looks like the following.
- * 
- *  <extension point="org.eclipse.wst.internet.cache.cacheresource">
- *    <cacheresource uri="URI_TO_CACHE"/>
- *  </extension> 
- *
- */
-public class ToCacheRegistryReader
-{
-  protected static final String PLUGIN_ID = "org.eclipse.wst.internet.cache";
-  protected static final String EXTENSION_POINT_ID = "cacheresource";
-  protected static final String ATT_URI = "uri";
- 
-  private static ToCacheRegistryReader registryReader = null;
-  
-  private Set resourcesToCache = new HashSet();
-
-  /**
-   * Get the one and only instance of this registry reader.
-   * 
-   * @return The one and only instance of this registry reader.
-   */
-  public static ToCacheRegistryReader getInstance()
-  {
-    if(registryReader == null)
-    {
-      registryReader = new ToCacheRegistryReader();
-    }
-    return registryReader;
-  }
-  /**
-   * Read from plugin registry and handle the configuration elements that match
-   * the spedified elements.
-   */
-  public void readRegistry()
-  {
-    IExtensionRegistry pluginRegistry = Platform.getExtensionRegistry();
-    IExtensionPoint point = pluginRegistry.getExtensionPoint(PLUGIN_ID, EXTENSION_POINT_ID);
-    if (point != null)
-    {
-      IConfigurationElement[] elements = point.getConfigurationElements();
-      for (int i = 0; i < elements.length; i++)
-      {
-        String uri = readElement(elements[i]);
-        if(uri != null)
-        {
-          resourcesToCache.add(uri);
-        }
-      }
-    }
-  }
-
-  /**
-   * Parse and deal with the extension points.
-   * 
-   * @param element The extension point element.
-   */
-  protected String readElement(IConfigurationElement element)
-  {
-    if(element.getName().equals(EXTENSION_POINT_ID))
-    {
-      return element.getAttribute(ATT_URI);
-    }
-    return null;
-  }
-  
-  /**
-   * Get the list of URIs that have been specified for caching.
-   * 
-   * @return The list of URIs that have been specified for caching.
-   */
-  public String[] getURIsToCache()
-  {
-    return (String[])resourcesToCache.toArray(new String[resourcesToCache.size()]);
-  }
-}
diff --git a/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/preferences/CachePreferencePage.java b/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/preferences/CachePreferencePage.java
deleted file mode 100644
index 1b20f7a..0000000
--- a/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/preferences/CachePreferencePage.java
+++ /dev/null
@@ -1,263 +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.internet.cache.internal.preferences;
-
-import java.util.Arrays;
-
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.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.Group;
-import org.eclipse.swt.widgets.List;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.internet.cache.internal.Cache;
-import org.eclipse.wst.internet.cache.internal.CachePlugin;
-
-/**
- * This class represents a preference page that is contributed to the 
- * Preferences dialog. This page contains options for the cache. The cache
- * can be disabled, the list of entries in the cache can be viewed, and 
- * individual entries or the entire cache can be deleted.
- */
-
-public class CachePreferencePage extends PreferencePage implements IWorkbenchPreferencePage 
-{
-	private static final String _UI_CONFIRM_CLEAR_CACHE_DIALOG_TITLE = "_UI_CONFIRM_CLEAR_CACHE_DIALOG_TITLE";
-	private static final String _UI_CONFIRM_CLEAR_CACHE_DIALOG_MESSAGE = "_UI_CONFIRM_CLEAR_CACHE_DIALOG_MESSAGE";
-	private static final String _UI_BUTTON_CLEAR_CACHE = "_UI_BUTTON_CLEAR_CACHE";
-	private static final String _UI_BUTTON_DELETE_ENTRY = "_UI_BUTTON_DELETE_ENTRY";
-	private static final String _UI_PREF_CACHE_ENTRIES_TITLE = "_UI_PREF_CACHE_ENTRIES_TITLE";
-  private static final String _UI_PREF_CACHE_OPTIONS_TITLE = "_UI_PREF_CACHE_OPTIONS_TITLE";
-  private static final String _UI_PREF_CACHE_CACHE_OPTION = "_UI_PREF_CACHE_CACHE_OPTION";
-  private static final String _UI_CONFIRM_DELETE_CACHE_ENTRY_DIALOG_TITLE = "_UI_CONFIRM_DELETE_CACHE_ENTRY_DIALOG_TITLE";
-  private static final String _UI_CONFIRM_DELETE_CACHE_ENTRY_DIALOG_MESSAGE = "_UI_CONFIRM_DELETE_CACHE_ENTRY_DIALOG_MESSAGE";
-	
-	protected Button clearButton;
-	protected Button deleteButton;
-  protected Button enabledButton;
-	protected List entries;
-  protected Composite composite = null;
-  protected Group entriesGroup;
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#dispose()
-	 */
-	public void dispose()
-  {
-    if(composite != null)
-    {
-      composite.dispose();
-    }
-    super.dispose();
-  }
-
-  /**
-   * Constructor.
-   */
-  public CachePreferencePage() 
-  {
-	setPreferenceStore(CachePlugin.getDefault().getPreferenceStore());
-  }
-	
-	/**
-	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
-	 */
-	public void init(IWorkbench workbench) 
-	{
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite parent) 
-	{
-		noDefaultAndApplyButton();
-		
-		composite = new Composite(parent, SWT.NULL);
-		composite.setLayout(new GridLayout());
-		GridData gd = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
-		gd.grabExcessHorizontalSpace = true;
-		gd.grabExcessVerticalSpace = true;
-	    composite.setLayoutData(gd);
-      try
-      {
-		GridLayout gridLayout = new GridLayout();
-    
-    // Created the disable cache option.
-    enabledButton = new Button(composite, SWT.CHECK | SWT.LEFT);
-    enabledButton.setText(CachePlugin.getResourceString(_UI_PREF_CACHE_CACHE_OPTION));
-    enabledButton.setSelection(!CachePlugin.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.CACHE_ENABLED));
-    enabledButton.addSelectionListener(new SelectionListener(){
-
-      public void widgetDefaultSelected(SelectionEvent e)
-      {
-        widgetSelected(e);
-        
-      }
-
-      public void widgetSelected(SelectionEvent e)
-      {
-        boolean disabled = enabledButton.getSelection();
-        CachePlugin.getDefault().setCacheEnabled(!disabled);
-        setPreferenceWidgets();
-      }
-      
-      
-      
-    });
-		
-		// Create the entities group.
-		entriesGroup = new Group(composite, SWT.NONE);
-	  entriesGroup.setText(CachePlugin.getResourceString(_UI_PREF_CACHE_ENTRIES_TITLE));
-	  gridLayout = new GridLayout();
-	  entriesGroup.setLayout(gridLayout);
-	  GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL);
-		gridData.grabExcessHorizontalSpace = true;
-		gridData.grabExcessVerticalSpace = true;
-	  entriesGroup.setLayoutData(gridData);
-    
-		entries = new List(entriesGroup, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(entries, ContextIds.PREF_ENTRIES);
-		String[] cacheEntries = Cache.getInstance().getCachedURIs();
-		Arrays.sort(cacheEntries);
-		entries.setItems(cacheEntries);
-		gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL);
-		gridData.grabExcessHorizontalSpace = true;
-		gridData.grabExcessVerticalSpace = true;
-	    entries.setLayoutData(gridData);
-		entries.addSelectionListener(new SelectionAdapter() {
-	          public void widgetSelected(SelectionEvent event) {
-              setPreferenceWidgets();
-	          }
-	       });
-		
-		Composite buttonComposite = new Composite(composite, SWT.NULL);
-		gridLayout = new GridLayout();
-		gridLayout.numColumns = 2;
-		buttonComposite.setLayout(gridLayout);
-		gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL |GridData.HORIZONTAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_END);
-	    composite.setLayoutData(gridData);
-		// Create the Delete button
-		deleteButton = new Button(buttonComposite, SWT.PUSH);
-	    deleteButton.setText(CachePlugin.getResourceString(_UI_BUTTON_DELETE_ENTRY));
-	    gridData = new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.VERTICAL_ALIGN_END);
-	    deleteButton.setLayoutData(gridData);
-	    deleteButton.addSelectionListener(new SelectionAdapter() {
-	          public void widgetSelected(SelectionEvent event) {
-              if(MessageDialog.openConfirm(Display.getDefault().getActiveShell(), CachePlugin.getResourceString(_UI_CONFIRM_DELETE_CACHE_ENTRY_DIALOG_TITLE), CachePlugin.getResourceString(_UI_CONFIRM_DELETE_CACHE_ENTRY_DIALOG_MESSAGE)))
-              {
-	              String[] selectedEntries = entries.getSelection();
-				  int numSelectedEntries = selectedEntries.length;
-				  
-				  Cache cache = Cache.getInstance();
-				  for(int i = 0; i < numSelectedEntries; i++)
-				  {
-				    cache.deleteEntry(selectedEntries[i]);
-				  }
-				  String[] cacheEntries = cache.getCachedURIs();
-				  Arrays.sort(cacheEntries);
-				  entries.setItems(cacheEntries);
-          setPreferenceWidgets();
-	          }
-            }
-	       });
-		
-		// Create the Clear Cache button
-		clearButton = new Button(buttonComposite, SWT.PUSH);
-	    clearButton.setText(CachePlugin.getResourceString(_UI_BUTTON_CLEAR_CACHE));
-	    gridData = new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.VERTICAL_ALIGN_END);
-	    clearButton.setLayoutData(gridData);
-	    clearButton.addSelectionListener(new SelectionAdapter() {
-	          public void widgetSelected(SelectionEvent event) {
-				  if(MessageDialog.openConfirm(Display.getDefault().getActiveShell(), CachePlugin.getResourceString(_UI_CONFIRM_CLEAR_CACHE_DIALOG_TITLE), CachePlugin.getResourceString(_UI_CONFIRM_CLEAR_CACHE_DIALOG_MESSAGE)))
-				  {
-					  Cache cache = Cache.getInstance();
-					  cache.clear();
-					  String[] cacheEntries = cache.getCachedURIs();
-					  Arrays.sort(cacheEntries);
-					  entries.setItems(cacheEntries);
-            setPreferenceWidgets();
-				  }
-	          }
-	       });
-      
-      }
-      catch(Throwable e)
-      {
-        System.out.println(e);
-      }
-      setPreferenceWidgets();
-      
-		return composite;
-	}
-  
-  /**
-   * Set the preference page widgets. There are a few rules.
-   * 1. If disabled, all of the widgets are diabled except for the disabled check box.
-   * 2. If enabled, all widgets are enabled except
-   *  a. The delete button is enabled only if there is a selection in the list.
-   *  b. The clear button is enabled only if there are items in the list.
-   */
-  public void setPreferenceWidgets()
-  {
-    if(composite != null && composite.getEnabled())
-    {
-      // Cache is disabled.
-      if(enabledButton.getSelection())
-      {
-        deleteButton.setEnabled(false);
-        clearButton.setEnabled(false);
-        entriesGroup.setEnabled(false);
-        entries.setEnabled(false);
-      }
-      else
-      {
-        entriesGroup.setEnabled(true);
-        entries.setEnabled(true);
-        if(entries.getSelectionCount() > 0)
-        {
-          deleteButton.setEnabled(true);
-        }
-        else
-        {
-          deleteButton.setEnabled(false);
-        }
-        if(entries.getItemCount() > 0)
-        {
-          clearButton.setEnabled(true);
-        }
-        else
-        {
-          clearButton.setEnabled(false);
-        }
-      }
-    }
-  }
-  /*
-	 * @see PreferencePage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		super.createControl(parent);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), ContextIds.PREF); //$NON-NLS-1$
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/preferences/ContextIds.java b/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/preferences/ContextIds.java
deleted file mode 100644
index 259cafb..0000000
--- a/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/preferences/ContextIds.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.internet.cache.internal.preferences;
-
-import org.eclipse.wst.internet.cache.internal.CachePlugin;
-
-/**
- * Constant ids for context help.
- */
-public interface ContextIds {
-	public static final String PREF = CachePlugin.PLUGIN_ID + ".cpr0000";
-	public static final String PREF_ENTRIES = CachePlugin.PLUGIN_ID + ".cpr0002";
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/preferences/PreferenceConstants.java b/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/preferences/PreferenceConstants.java
deleted file mode 100644
index 03d4610..0000000
--- a/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/preferences/PreferenceConstants.java
+++ /dev/null
@@ -1,21 +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.internet.cache.internal.preferences;
-
-/**
- * Constant definitions for plug-in preferences
- */
-public class PreferenceConstants 
-{
-  public static final String CACHE_ENABLED = "cacheEnabled";
-	
-}
diff --git a/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/preferences/PreferenceInitializer.java b/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/preferences/PreferenceInitializer.java
deleted file mode 100644
index a693a08..0000000
--- a/plugins/org.eclipse.wst.internet.cache/src/org/eclipse/wst/internet/cache/internal/preferences/PreferenceInitializer.java
+++ /dev/null
@@ -1,32 +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.internet.cache.internal.preferences;
-
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-import org.eclipse.wst.internet.cache.internal.CachePlugin;
-
-/**
- * Class used to initialize default preference values.
- */
-public class PreferenceInitializer extends AbstractPreferenceInitializer 
-{
-	/**
-	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
-	 */
-	public void initializeDefaultPreferences() 
-  {
-		IPreferenceStore store = CachePlugin.getDefault().getPreferenceStore();
-    store.setDefault(PreferenceConstants.CACHE_ENABLED, true);
-	}
-}
diff --git a/plugins/org.eclipse.wst.validation.ui/.classpath b/plugins/org.eclipse.wst.validation.ui/.classpath
deleted file mode 100644
index a52d567..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.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<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 963bc29..0000000
--- a/plugins/org.eclipse.wst.validation.ui/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-bin
-temp.folder
-build.xml
-runtime
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/build.properties b/plugins/org.eclipse.wst.validation.ui/build.properties
deleted file mode 100644
index 02c26c0..0000000
--- a/plugins/org.eclipse.wst.validation.ui/build.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
-###############################################################################
-bin.includes = runtime/validateui.jar,\
-               plugin.xml,\
-               plugin.properties
-source.runtime/validateui.jar = validateui/,\
-                                property_files/
-output.runtime/validateui.jar = 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 d1741ab..0000000
--- a/plugins/org.eclipse.wst.validation.ui/plugin.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="org.eclipse.wst.validation.ui"
-   name="Validation Framework UI"
-   version="1.0.0"
-   provider-name="Eclipse.org"
-   description="This is only UI plugin for the validation framework. Some of the main UI functions this plugin provides are global validation references page, project validation properties page and manual run validation menu action."
-   class="org.eclipse.wst.validation.internal.ui.plugin.ValidationUIPlugin">
-
-   <runtime>
-      <library name="runtime/validateui.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.ui.ide"/>
-      <import plugin="org.eclipse.core.resources"/>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.swt"/>
-      <import plugin="org.eclipse.wst.common.frameworks.ui"/>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.eclipse.wst.common.frameworks"/>
-      <import plugin="org.eclipse.wst.validation"/>
-   </requires>
-
-
-<!-- ============================================== -->
-<!-- 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 507d56d..0000000
--- a/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ValidationMenuAction.java
+++ /dev/null
@@ -1,570 +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.ValidationSelectionHandlerRegistryReader;
-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.operations.EnabledIncrementalValidatorsOperation;
-import org.eclipse.wst.validation.internal.operations.EnabledValidatorsOperation;
-import org.eclipse.wst.validation.internal.operations.IWorkbenchContext;
-import org.eclipse.wst.validation.internal.operations.ValidatorManager;
-import org.eclipse.wst.validation.internal.operations.WorkbenchContext;
-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 5d56f75..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.help.WorkbenchHelp;
-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);
-			WorkbenchHelp.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
-			WorkbenchHelp.setHelp(composite, ContextIds.VALIDATION_PREFERENCE_PAGE);
-
-			Composite validatorGroup = new Composite(composite, SWT.NONE);
-			GridLayout validatorGroupLayout = new GridLayout();
-			validatorGroupLayout.numColumns = 2;
-			validatorGroup.setLayout(validatorGroupLayout);
-			WorkbenchHelp.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);
-					}
-				}
-			});
-			WorkbenchHelp.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);
-					}
-				}
-			});
-			WorkbenchHelp.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);
-					}
-				}
-			});
-			WorkbenchHelp.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);
-					}
-				}
-			});
-			WorkbenchHelp.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
-			WorkbenchHelp.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
-			WorkbenchHelp.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 5fd46df..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.dialogs.PropertyPage;
-import org.eclipse.ui.help.WorkbenchHelp;
-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);
-			WorkbenchHelp.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);
-			WorkbenchHelp.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);
-					}
-				}
-			});
-			WorkbenchHelp.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);
-					}
-				}
-			});
-			WorkbenchHelp.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);
-					}
-				}
-			});
-			WorkbenchHelp.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
-				WorkbenchHelp.setHelp(validatorList.getTable(), ContextIds.VALIDATION_PROPERTIES_PAGE);
-				WorkbenchHelp.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) {
-					WorkbenchHelp.setHelp(validatorList.getTable(), ContextIds.VALIDATION_PROPERTIES_PAGE_DISABLED_AUTO_NOINCVALCONFIG);
-				} else if (!ValidatorManager.getManager().isGlobalAutoBuildEnabled()) {
-					WorkbenchHelp.setHelp(validatorList.getTable(), ContextIds.VALIDATION_PROPERTIES_PAGE_DISABLED_AUTO_AUTOBUILD);
-				} else {
-					// Incremental validators configured but not selected
-					WorkbenchHelp.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.
-				WorkbenchHelp.setHelp(valWhenBuildButton, ContextIds.VALIDATION_PROPERTIES_PAGE_REBUILD_ENABLED);
-			} else {
-				//				page.getParent().setFocus();
-				validatorList.getTable().setFocus();
-				WorkbenchHelp.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
-					WorkbenchHelp.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
-					WorkbenchHelp.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
-					WorkbenchHelp.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
-					WorkbenchHelp.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.
-					WorkbenchHelp.setHelp(overrideGlobalButton, ContextIds.VALIDATION_PROPERTIES_PAGE_OVERRIDE_ENABLED);
-				}
-			} else {
-				validatorList.getTable().setFocus();
-				// Preference page doesn't allow projects to override
-				WorkbenchHelp.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 7b33138..0000000
--- a/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/plugin/ValidationUIPlugin.java
+++ /dev/null
@@ -1,100 +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.jface.operation.IRunnableWithProgress;
-import org.eclipse.wst.common.frameworks.internal.operations.IHeadlessRunnableWithProgress;
-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;
-
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-
-
-
-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 be5dc64..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="property_files/"/>
-	<classpathentry kind="src" path="validate_core/"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<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 5bd27c6..0000000
--- a/plugins/org.eclipse.wst.validation/.cvsignore
+++ /dev/null
@@ -1,5 +0,0 @@
-bin
-temp.folder
-validate.jar
-build.xml
-common.jar
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/build.properties b/plugins/org.eclipse.wst.validation/build.properties
deleted file mode 100644
index a1250e2..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
-###############################################################################
-source.validate.jar = validate/,\
-                      property_files/
-bin.includes = validate.jar,\
-               plugin.xml,\
-               plugin.properties,\
-               common.jar
-output.validate.jar = bin/
-output.common.jar = bin/
-source.common.jar = validate_core/,\
-                    property_files/
-jars.compile.order = common.jar,\
-                     validate.jar
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 8c891ef..0000000
--- a/plugins/org.eclipse.wst.validation/plugin.properties
+++ /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
-###############################################################################
-#
-# Version 1.3
-#
-VALIDATION_BUILDER_NAME=Validation
-VALIDATION_PROBLEMMARKER_NAME=Validation Message
-VALIDATION_PROJECTMARKER_NAME=Enabled Validators
-VALIDATION_PREFERENCEMARKER_NAME=Validation Preferences
diff --git a/plugins/org.eclipse.wst.validation/plugin.xml b/plugins/org.eclipse.wst.validation/plugin.xml
deleted file mode 100644
index 287739c..0000000
--- a/plugins/org.eclipse.wst.validation/plugin.xml
+++ /dev/null
@@ -1,131 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="org.eclipse.wst.validation"
-   name="Validation Framework"
-   description="This plugin is one of the core validation framework plugins. It has 2 extension points for a user to extend it to implement their own validators. Most of the funtion and api available in this plugin are for use internally by the validation framework."
-   version="1.0.0"
-   provider-name="Eclipse.org"
-   class="org.eclipse.wst.validation.internal.plugin.ValidationPlugin">
-
-   <runtime>
-      <library name="validate.jar">
-         <export name="*"/>
-      </library>
-      <library name="common.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.core.resources"/>
-      <import plugin="org.eclipse.wst.common.frameworks"/>
-      <import plugin="org.eclipse.core.runtime"/>
-   </requires>
-
-
-<!-- Validation extension points -->
-   <extension-point id="validator" name="Validator" schema="xsds/validatorExtSchema.exsd"/>
-   <extension-point id="referencialFileValidator" name="ReferencialFileValidator" schema="xsds/referencialFileExtSchema.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/property_files/validate_base_de.properties b/plugins/org.eclipse.wst.validation/property_files/validate_base_de.properties
deleted file mode 100644
index a8613f4..0000000
--- a/plugins/org.eclipse.wst.validation/property_files/validate_base_de.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 Die Markierung kann der Ressource {0} in der Taskliste nicht hinzugef\u00fcgt werden.
-VBF_EXC_CANNOT_REMOVE_MARKER=IWAE0002E Die Markierung kann aus der Ressource {0} in der Taskliste nicht entfernt werden.
-
-VBF_EXC_HELPER_MISSING=IWAE0003E {0} kann nicht geladen werden, da kein <helper> angegeben wurde. Jedes Pr\u00fcfprogramm muss die Helper-Klasse, die das entsprechende MOF-Modell l\u00e4dt identifizieren.
-VBF_EXC_HELPER_CANNOTLOAD=IWAE0004E {0} kann nicht geladen werden da der entsprechende <helper>, {1}, nicht geladen werden konnte. Stellen Sie sicher, dass die Schreibweise (einschl. Gro\u00df-/Kleinschreibung) korrekt ist.
-
-VBF_EXC_INTERNAL=IWAE0005E W\u00e4hrend der \u00dcberpr\u00fcfung ist ein interner Fehler aufgetreten. Die \u00dcberpr\u00fcfung wurde auf Projekt {0} mit Pr\u00fcfprogramm {1} ausgef\u00fchrt. Die ausgel\u00f6ste Nachricht war {2}.
-
-# 2TC: In the following string, "type" is a noun
-VBF_EXC_INVALID_TYPE_FILTER=IWAE0006E Ung\u00fcltiger Typfilter; {0} muss ein Exemplar von {1} sein.
-VBF_EXC_INVALID_RESOURCE=IWAE0007E Nachricht "{0}" mit Zielobjekt "{1}" kann nicht hinzugef\u00fcgt werden, da keine Datei, kein Ordner oder kein Projekt gefunden werden kann, die/der/das der Nachricht zugeordnet werden kann.
-
-VBF_EXC_MISSING_VALIDATOR_EP=IWAE0008E Das Pr\u00fcfprogrammger\u00fcst konnte nicht gestartet werden. Der Erweiterungspunkt mit dem Namen \"{0}\" konnte nicht gefunden werden. Bitte speichern Sie alle Protokolldateien, und setzen Sie sich mit Ihrem IBM Ansprechpartner in Verbindung.
-VBF_EXC_MISSING_PROJECTNATURE_ID=IWAE0009E Eine projectNature muss eine zugeordnete ID haben. Die \u00dcberpr\u00fcfung ignoriert diesen Befehl und f\u00e4hrt fort.
-
-VBF_EXC_RUNTIME=IWAE0010E W\u00e4hrend der \u00dcberpr\u00fcfung ist eine Laufzeitausnahmebedingung {0} aufgetreten. Das ausgef\u00fchrte Pr\u00fcfprogramm lautete {1} und die ausgel\u00f6ste Nachricht war {2}.
-
-VBF_EXC_SYNTAX_NULL_NAME=IWAE0011E Ressource {0} kann der Dateiliste nicht hinzugef\u00fcgt werden, da IHelper.getPortableName() Null zur\u00fcckgibt. Die Ressource wird nicht von dem Pr\u00fcfprogramm mit dem Namen {1} \u00fcberpr\u00fcft.
-VBF_EXC_SYNTAX_NO_HELPER=IWAE0012E Es ist kein <helper>-Element in der Datei plugin.xml f\u00fcr Pr\u00fcfprogramm {0} angegeben. Da der Helper nicht erstellt werden kann, wird das Pr\u00fcfprogramm nicht geladen.
-VBF_EXC_SYNTAX_NO_HELPER_CLASS=IWAE0013E Es ist kein "class"-Attribut im <helper>-Element in der Datei plugin.xml f\u00fcr Pr\u00fcfprogramm {0} angegeben. Der Helper kann nicht ohne den Namen einer Klasse, die ihn implementiert, erstellt werden. Da der Helper nicht erstellt werden kann, wird das Pr\u00fcfprogramm nicht geladen.
-VBF_EXC_SYNTAX_NO_HELPER_THROWABLE=IWAE0014E Der Helper {0} kann nicht erstellt werden, da ein throwable abgefangen wurde.
-VBF_EXC_SYNTAX_NO_VAL_RUN=IWAE0015E Das Pr\u00fcfprogramm kann nicht erstellt werden, da kein <run>-Element in der Datei plugin.xml f\u00fcr das Pr\u00fcfprogramm mit dem Namen {0} angegeben ist. Es kann kein Pr\u00fcfprogramm erstellt werden - es sei denn, ein <run>-Element ist vorhanden, das das "class"-Attribut angibt. Der Wert des "class"-Attributs muss der Name der Klasse sein, die die Schnittstelle IWorkbenchHelper implementiert.
-VBF_EXC_SYNTAX_NO_VAL_CLASS=IWAE0016E Das Pr\u00fcfprogramm kann nicht erstellt werden, da kein "class"-Attribut im <run>-Element in der Datei plugin.xml f\u00fcr das Pr\u00fcfprogramm mit dem Namen {0} angegeben ist. Es kann kein Pr\u00fcfprogramm erstellt werden - es sei denn, ein <run>-Element ist vorhanden, das das "class"-Attribut angibt. Der Wert des "class"-Attributs muss der Name der Klasse sein, die die Schnittstelle IWorkbenchHelper implementiert.
-VBF_EXC_SYNTAX_NO_VAL_THROWABLE=IWAE0017E Das Pr\u00fcfprogramm {0} kann nicht erstellt werden, weil ein throwable abgefangen wurde.
-VBF_EXC_SYNTAX_NO_VAL_NULL=IWAE0018E Pr\u00fcfprogrammklasse {0} konnte nicht erstellt werden. IConfigurationElement.createExecutableExtension(String) gab Null zur\u00fcck.
-
-VBF_EXC_DISABLEV=IWAE0019E Pr\u00fcfprogramm {0} kann nicht instanziert werden. Pr\u00fcfprogramm wird inaktiviert; im Protokoll sind Einzelheiten hierzu enthalten.
-VBF_EXC_DISABLEH=IWAE0020E Helper {0} kann nicht instanziert werden. Pr\u00fcfprogramm {1} wird inaktiviert; im Protokoll sind Einzelheiten hierzu enthalten.
-VBF_EXC_ORPHAN_IVALIDATOR=IWAE0021E F\u00fcr das Pr\u00fcfprogramm {0} k\u00f6nnen keine Metadaten gefunden werden.
-
-VBF_EXC_VALIDATORNAME_IS_NULL=IWAE0022E Das Plug-in mit ID {0} wurde inaktiviert, da seine getName()-Methode Null zur\u00fcckgibt. Die Methode muss einen Wert zur\u00fcckgeben.
-
-VBF_EXC_NULLCREATE=IWAE0023E Eine \u00dcberpr\u00fcfungskonfiguration kann nicht in einer Nullressource erstellt werden.
-VBF_EXC_NULLSAVE=IWAE0024E Eine \u00dcberpr\u00fcfungskonfiguration kann nicht in einer Nullressource gespeichert werden.
-VBF_EXC_SAVE=IWAE0025E Speichern der \u00dcberpr\u00fcfungskonfiguration in Ressource {0} nicht m\u00f6glich.
-VBF_EXC_NULLRETRIEVE=IWAE0026E Die \u00dcberpr\u00fcfungskonfiguration kann nicht abgerufen werden, da die Ressource den Wert Null hat.
-VBF_EXC_RETRIEVE=IWAE0027E Abrufen der \u00dcberpr\u00fcfungskonfiguration f\u00fcr Ressource {0} nicht m\u00f6glich.
-
-VBF_EXC_BADVMD=IWAE0028E ValidatorMetaData[] darf nicht den Wert Null haben oder leer sein.
-VBF_EXC_OPENPRJ=IWAE0029E Projekt {0} muss ge\u00f6ffnet sein.
-VBF_EXC_EXISTPRJ=IWAE0030E Projekt {0} muss vorhanden sein.
-VBF_EXC_BADPRJ=IWAE0031E Das Projekt {0} muss die Ressourcen in IResource[] enthalten.
-VBF_EXC_MULTIPRJ=IWAE0032E Alle IResource-Exemplare in IResource[] m\u00fcssen Teil des gleichen IProject-Exemplars sein. Die Ressourcen stammen von den folgenden Projekten: {0}.
-VBF_EXC_BADVAL=IWAE0033E Pr\u00fcfprogramm {0} muss auf {1} konfiguriert sein;
-
-VBF_STATUS_INITIALIZING={0} wird initialisiert.
-
-VBF_STATUS_VALIDATOR_CLEANUP=Bereinigung auf {0} wird vor der Beendigung ausgef\u00fchrt.
-
-VBF_STATUS_PROGRESSMONITOR_TITLE=\u00dcberpr\u00fcfung
-VBF_STATUS_NULL_DELTA=Letzter Erstellungsstatus von {0} konnte nicht abgerufen werden. Es wird eine vollst\u00e4ndige Auswertung ausgef\u00fchrt.
-
-VBF_STATUS_VALIDATOR_TERMINATED=\u00dcberpr\u00fcfung von {0} unter Verwendung von {1} wurde abgebrochen.
-
-VBF_STATUS_START_REMOVING_OLD_MESSAGES=Das Entfernen von {0} Nachrichten auf {1} wurde gestartet...
-VBF_STATUS_FINISH_REMOVING_OLD_MESSAGES=Nachrichten entfernt.
-
-VBF_STATUS_STARTING_VALIDATION=\u00dcberpr\u00fcfung von {0} nach {1} wurde gestartet...
-VBF_STATUS_ENDING_VALIDATION=\u00dcberpr\u00fcfung von {0} nach {1} ist vollst\u00e4ndig. Alle bekannten Probleme wurden gemeldet.
-VBF_STATUS_ENDING_VALIDATION_ABNORMALLY=\u00dcberpr\u00fcfung von {0} nach {1} wurde abnormal beendet. Die Liste der Probleme kann unvollst\u00e4ndig sein. In den Informationsnachrichten ist der Grund f\u00fcr die abnormale Beendigung aufgef\u00fchrt.
-
-VBF_STATUS_LOOKING=\u00dcberpr\u00fcfungsnachrichten von deinstallierten Pr\u00fcfprogrammen werden gesucht...
-VBF_STATUS_LOOKINGDONE=Suche nach \u00dcberpr\u00fcfungsnachrichten von deinstallierten Pr\u00fcfprogrammen...beendet.
-VBF_STATUS_REMOVING=\u00dcberpr\u00fcfungsnachrichten von deinstallierten Pr\u00fcfprogrammen werden entfernt...
-VBF_STATUS_REMOVINGDONE=Entfernen von \u00dcberpr\u00fcfungsnachrichten von deinstallierten Pr\u00fcfprogrammen...beendet.
-
-# The following message will be deleted soon.
-VBF_TASK_WARN_MESSAGE_LIMIT_ABORT=IWAE0034W IWAD3000I: {1} hat die Auswertung von {0} beendet, weil die maximal zul\u00e4ssige Anzahl von Nachrichten gemeldet wurde. M\u00f6glicherweise fehlen einige Nachrichten.
-
-VBF_TASK_WARN_MESSAGE_LIMIT_VAL=IWAE0035W IWAD3000I: Es k\u00f6nnen einige Nachrichten fehlen, da die maximale Anzahl an Nachrichten erreicht wurde. Erh\u00f6hen Sie die maximale Anzahl der Nachrichten, und versuchen Sie den Vorgang erneut.
-
-#
-# End Validation Builder Framework Strings
-#
-
diff --git a/plugins/org.eclipse.wst.validation/property_files/validate_base_es.properties b/plugins/org.eclipse.wst.validation/property_files/validate_base_es.properties
deleted file mode 100644
index a2c7363..0000000
--- a/plugins/org.eclipse.wst.validation/property_files/validate_base_es.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 No puede a\u00f1adirse el marcador al recurso {0} de la lista de tareas.
-VBF_EXC_CANNOT_REMOVE_MARKER=IWAE0002E No puede eliminarse el marcador del recurso {0} de la lista de tareas.
-
-VBF_EXC_HELPER_MISSING=IWAE0003E No se ha podido cargar {0} porque no especificaba un <helper>. Cada validador debe identificar la clase de ayudante (helper) que carga su modelo MOF.
-VBF_EXC_HELPER_CANNOTLOAD=IWAE0004E No se ha podido cargar {0} porque fue imposible cargar su <helper>, {1}. Aseg\u00farese de que el nombre del archivo se ha escrito correctamente respetando las may\u00fasculas y min\u00fasculas.
-
-VBF_EXC_INTERNAL=IWAE0005E Se ha producido un error interno durante la validaci\u00f3n. La validaci\u00f3n se estaba ejecutando en el proyecto {0} con el validador {1}. El mensaje lanzado ha sido {2}.
-
-# 2TC: In the following string, "type" is a noun
-VBF_EXC_INVALID_TYPE_FILTER=IWAE0006E Filtro no v\u00e1lido para el tipo; {0} debe ser una instancia de {1}.
-VBF_EXC_INVALID_RESOURCE=IWAE0007E No puede a\u00f1adirse el mensaje "{0}" con el objeto destino "{1}" porque no puede encontrarse ning\u00fan archivo, carpeta o proyecto con el que asociar el mensaje.
-
-VBF_EXC_MISSING_VALIDATOR_EP=IWAE0008E No se ha podido iniciar la infraestructura del validador. Ha sido imposible encontrar el punto de extensi\u00f3n llamado \"{0}\". Guarde todos los archivos de anotaciones y p\u00f3ngase en contacto con el representante de IBM.
-VBF_EXC_MISSING_PROJECTNATURE_ID=IWAE0009E Un projectNature debe tener un ID asociado. La validaci\u00f3n pasa por alto este c\u00f3digo y contin\u00faa.
-
-VBF_EXC_RUNTIME=IWAE0010E Se ha producido una excepci\u00f3n de tiempo de ejecuci\u00f3n {0} durante la validaci\u00f3n. El validador que se estaba ejecutando era {1} y el mensaje lanzado ha sido {2}.
-
-VBF_EXC_SYNTAX_NULL_NAME=IWAE0011E No se puede a\u00f1adir el recurso {0} a la lista de archivos porque IHelper.getPortableName() devuelve nulo. Este recurso no ser\u00e1 validado por el validador llamado {1}.
-VBF_EXC_SYNTAX_NO_HELPER=IWAE0012E No se ha especificado ning\u00fan elemento <helper> en el archivo plugin.xml del validador {0}. Como no se puede crear el ayudante (helper), no se cargar\u00e1 el validador.
-VBF_EXC_SYNTAX_NO_HELPER_CLASS=IWAE0013E No hay ning\u00fan atributo "class" del elemento <helper> en el archivo plugin.xml del archivo {0}. No puede crearse el ayudante sin el nombre de la clase que lo implementa. Como no se puede crear el ayudante (helper), no se cargar\u00e1 el validador.
-VBF_EXC_SYNTAX_NO_HELPER_THROWABLE=IWAE0014E No se puede crear el ayudante {0} porque se ha capturado una excepci\u00f3n Throwable.
-VBF_EXC_SYNTAX_NO_VAL_RUN=IWAE0015E No se puede crear el validador porque no se ha especificado ning\u00fan elemento <run> en el archivo plugin.xml del validador denominado {0}. No se puede crear un validador a menos que exista un elemento <run> que especifique el atributo "class". El valor del atributo "class" debe ser el nombre de la clase que implementa la interfaz IWorkbenchHelper.
-VBF_EXC_SYNTAX_NO_VAL_CLASS=IWAE0016E No se puede crear el validador porque no se ha especificado ning\u00fan atributo "class" del elemento <run> en el archivo plugin.xml del validador denominado {0}. No se puede crear un validador a menos que exista un elemento <run> que especifique el atributo "class". El valor del atributo "class" debe ser el nombre de la clase que implementa la interfaz IWorkbenchHelper.
-VBF_EXC_SYNTAX_NO_VAL_THROWABLE=IWAE0017E No se puede crear el validador {0} porque se ha capturado un Throwable.
-VBF_EXC_SYNTAX_NO_VAL_NULL=IWAE0018E No se ha podido crear la clase de validador {0}. IConfigurationElement.createExecutableExtension(String) ha devuelto nulo.
-
-VBF_EXC_DISABLEV=IWAE0019E No se puede crear una instancia del validador {0}. Se est\u00e1 inhabilitando el validador; encontrar\u00e1 los detalles en el archivo de anotaciones.
-VBF_EXC_DISABLEH=IWAE0020E No se puede crear una instancia del m\u00e9todo de ayuda {0}. Se est\u00e1 inhabilitando el validador {1}; encontrar\u00e1 los detalles en el archivo de anotaciones.
-VBF_EXC_ORPHAN_IVALIDATOR=IWAE0021E No se pueden localizar los metadatos del validador {0}.
-
-VBF_EXC_VALIDATORNAME_IS_NULL=IWAE0022E El conector (plugin) con el ID {0} se ha inhabilitado porque su m\u00e9todo getName() devuelve nulo. El m\u00e9todo debe devolver un valor.
-
-VBF_EXC_NULLCREATE=IWAE0023E No se puede crear una configuraci\u00f3n de validaci\u00f3n en un recurso nulo.
-VBF_EXC_NULLSAVE=IWAE0024E No se puede guardar una configuraci\u00f3n de validaci\u00f3n en un recurso nulo.
-VBF_EXC_SAVE=IWAE0025E No se ha podido guardar la configuraci\u00f3n de validaci\u00f3n en el recurso {0}.
-VBF_EXC_NULLRETRIEVE=IWAE0026E No se puede recuperar la configuraci\u00f3n de validaci\u00f3n porque el recurso es nulo.
-VBF_EXC_RETRIEVE=IWAE0027E No se ha podido recuperar la configuraci\u00f3n de validaci\u00f3n para el recurso {0}.
-
-VBF_EXC_BADVMD=IWAE0028E ValidatorMetaData[] no debe ser nulo ni estar vac\u00edo.
-VBF_EXC_OPENPRJ=IWAE0029E El proyecto {0} tiene que estar abierto.
-VBF_EXC_EXISTPRJ=IWAE0030E El proyecto {0} tiene que existir.
-VBF_EXC_BADPRJ=IWAE0031E El proyecto {0} tiene que ser el proyecto que contenga los recursos en IResource[].
-VBF_EXC_MULTIPRJ=IWAE0032E Todas las instancias de IResource en IResource[] tienen que ser parte de la misma instancia de IProject. Los recursos proceden de los proyectos siguientes: {0}.
-VBF_EXC_BADVAL=IWAE0033E El validador {0} tiene que estar configurado en {1};
-
-VBF_STATUS_INITIALIZING=Se est\u00e1 inicializando {0}.
-
-VBF_STATUS_VALIDATOR_CLEANUP=Se est\u00e1 efectuando el borrado en {0} antes de la terminaci\u00f3n.
-
-VBF_STATUS_PROGRESSMONITOR_TITLE=Validando
-VBF_STATUS_NULL_DELTA=No se ha podido recuperar el \u00faltimo estado de construcci\u00f3n de {0}. Realizando una validaci\u00f3n completa.
-
-VBF_STATUS_VALIDATOR_TERMINATED=Se ha cancelado la validaci\u00f3n de {0} utilizando {1}.
-
-VBF_STATUS_START_REMOVING_OLD_MESSAGES=La eliminaci\u00f3n de mensajes {0} en {1} se ha iniciado...
-VBF_STATUS_FINISH_REMOVING_OLD_MESSAGES=Mensajes eliminados.
-
-VBF_STATUS_STARTING_VALIDATION=La validaci\u00f3n de {0} mediante {1} se ha iniciado...
-VBF_STATUS_ENDING_VALIDATION=La validaci\u00f3n de {0} mediante {1} se ha completado. Se ha informado de todos los problemas conocidos.
-VBF_STATUS_ENDING_VALIDATION_ABNORMALLY=La validaci\u00f3n de {0} mediante {1} ha finalizado de forma an\u00f3mala. La lista de problemas puede estar incompleta. Vea si en los mensajes informativos se indica la causa de la terminaci\u00f3n an\u00f3mala.
-
-VBF_STATUS_LOOKING=Buscando mensajes de validaci\u00f3n propiedad de validadores no instalados...
-VBF_STATUS_LOOKINGDONE=Buscando mensajes de validaci\u00f3n propiedad de validadores no instalados... Hecho.
-VBF_STATUS_REMOVING=Eliminando mensajes de validaci\u00f3n propiedad de validadores no instalados...
-VBF_STATUS_REMOVINGDONE=Eliminando mensajes de validaci\u00f3n propiedad de validadores no instalados... Hecho.
-
-# The following message will be deleted soon.
-VBF_TASK_WARN_MESSAGE_LIMIT_ABORT=IWAE0034W IWAD3000I: {1} ha interrumpido la validaci\u00f3n de {0} porque el n\u00famero de mensajes de los que se ha informado ha llegado al m\u00e1ximo. Pueden faltar algunos mensajes.
-
-VBF_TASK_WARN_MESSAGE_LIMIT_VAL=IWAE0035W IWAD3000I: Puede que falten algunos mensajes, pues se ha alcanzado el n\u00famero m\u00e1ximo de mensajes. Aumente el n\u00famero m\u00e1ximo de mensajes y vuelva a intentarlo.
-
-#
-# End Validation Builder Framework Strings
-#
-
diff --git a/plugins/org.eclipse.wst.validation/property_files/validate_base_fr.properties b/plugins/org.eclipse.wst.validation/property_files/validate_base_fr.properties
deleted file mode 100644
index d43148b..0000000
--- a/plugins/org.eclipse.wst.validation/property_files/validate_base_fr.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 Le marqueur ne peut pas \u00eatre ajout\u00e9 \u00e0 la ressource {0} dans la liste des t\u00e2ches.
-VBF_EXC_CANNOT_REMOVE_MARKER=IWAE0002E Le marqueur ne peut pas \u00eatre supprim\u00e9 de la ressource {0} dans la liste des t\u00e2ches.
-
-VBF_EXC_HELPER_MISSING=IWAE0003E Impossible de charger {0} car il n''a pas sp\u00e9cifi\u00e9 d''\u00e9l\u00e9ment <helper>. Chaque valideur doit identifier la classe helper qui charge son mod\u00e8le MOF.
-VBF_EXC_HELPER_CANNOTLOAD=IWAE0004E Impossible de charger {0} car son \u00e9l\u00e9ment <helper>, {1}, n''a pas pu \u00eatre charg\u00e9. V\u00e9rifiez que le nom du fichier est correctement orthographi\u00e9 et que la casse est respect\u00e9e.
-
-VBF_EXC_INTERNAL=IWAE0005E Une erreur interne est survenue lors de la validation. La validation \u00e9tait en cours d''ex\u00e9cution sur le projet {0} avec le valideur {1}. Message g\u00e9n\u00e9r\u00e9 : {2}.
-
-# 2TC: In the following string, "type" is a noun
-VBF_EXC_INVALID_TYPE_FILTER=IWAE0006E Type de filtre non valide ; {0} doit \u00eatre une instance de {1}.
-VBF_EXC_INVALID_RESOURCE=IWAE0007E Impossible d''ajouter le message "{0}" avec l''objet cible "{1}" car aucun fichier, dossier ou projet auquel le message doit \u00eatre associ\u00e9 n''a \u00e9t\u00e9 trouv\u00e9.
-
-VBF_EXC_MISSING_VALIDATOR_EP=IWAE0008E La structure du valideur n''a pas pu \u00eatre d\u00e9marr\u00e9e. Le point d''extension \"{0}\" est introuvable. Sauvegardez tous les fichiers journaux, puis adressez-vous \u00e0 votre repr\u00e9sentant IBM.
-VBF_EXC_MISSING_PROJECTNATURE_ID=IWAE0009E Une nature de projet doit \u00eatre associ\u00e9e \u00e0 un ID. La validation ignore cette balise et se poursuit.
-
-VBF_EXC_RUNTIME=IWAE0010E Exception d''ex\u00e9cution {0} lors de la validation. Valideur ex\u00e9cut\u00e9 : {1} ; message g\u00e9n\u00e9r\u00e9 : {2}.
-
-VBF_EXC_SYNTAX_NULL_NAME=IWAE0011E La ressource {0} ne peut pas \u00eatre ajout\u00e9e \u00e0 la liste des fichiers car IHelper.getPortableName() renvoie NULL. Cette ressource ne sera pas valid\u00e9e par le valideur {1}.
-VBF_EXC_SYNTAX_NO_HELPER=IWAE0012E Aucun \u00e9l\u00e9ment <helper> n''est sp\u00e9cifi\u00e9 dans le fichier plugin.xml du valideur {0}. L''auxiliaire ne pouvant pas \u00eatre cr\u00e9\u00e9, le valideur ne sera pas charg\u00e9.
-VBF_EXC_SYNTAX_NO_HELPER_CLASS=IWAE0013E Aucun attribut "class" de l''\u00e9l\u00e9ment <helper> n''est sp\u00e9cifi\u00e9 dans le fichier plugin.xml du valideur {0}. L''auxiliaire ne peut pas \u00eatre cr\u00e9\u00e9 sans le nom de la classe qui l'impl\u00e9mente. L''auxiliaire ne pouvant pas \u00eatre cr\u00e9\u00e9, le valideur ne sera pas charg\u00e9.
-VBF_EXC_SYNTAX_NO_HELPER_THROWABLE=IWAE0014E L''auxiliaire {0} ne peut pas \u00eatre cr\u00e9\u00e9 car une exception Throwable a \u00e9t\u00e9 d\u00e9tect\u00e9e.
-VBF_EXC_SYNTAX_NO_VAL_RUN=IWAE0015E Le valideur ne peut pas \u00eatre cr\u00e9\u00e9 car aucun \u00e9l\u00e9ment <run> n''est sp\u00e9cifi\u00e9 dans le fichier plugin.xml du valideur {0}. Impossible de cr\u00e9er un valideur s'il n'existe pas d''\u00e9l\u00e9ment <run> qui sp\u00e9cifie l''attribut "class". La valeur de l''attribut "class" doit correspondre au nom de la classe qui impl\u00e9mente l''interface IWorkbenchHelper.
-VBF_EXC_SYNTAX_NO_VAL_CLASS=IWAE0016E Le valideur ne peut pas \u00eatre cr\u00e9\u00e9 car aucun attribut "class" n''est sp\u00e9cifi\u00e9 dans l''\u00e9l\u00e9ment <run> du fichier plugin.xml du valideur {0}. Impossible de cr\u00e9er un valideur s'il n'existe pas d''\u00e9l\u00e9ment <run> qui sp\u00e9cifie l''attribut "class". La valeur de l''attribut "class" doit correspondre au nom de la classe qui impl\u00e9mente l''interface IWorkbenchHelper.
-VBF_EXC_SYNTAX_NO_VAL_THROWABLE=IWAE0017E Impossible de cr\u00e9er le valideur {0} car une exception Throwable a \u00e9t\u00e9 d\u00e9tect\u00e9e.
-VBF_EXC_SYNTAX_NO_VAL_NULL=IWAE0018E La classe de valideur {0} n''a pas pu \u00eatre cr\u00e9\u00e9e. IConfigurationElement.createExecutableExtension(String) a renvoy\u00e9 NULL.
-
-VBF_EXC_DISABLEV=IWAE0019E Impossible d''instancier le valideur {0}. D\u00e9sactivation du valideur ; consultez le journal pour plus de d\u00e9tails.
-VBF_EXC_DISABLEH=IWAE0020E Impossible d''instancier l''auxiliaire {0}. D\u00e9sactivation du valideur {1} ; consultez le journal pour plus de d\u00e9tails.
-VBF_EXC_ORPHAN_IVALIDATOR=IWAE0021E M\u00e9tadonn\u00e9es du valideur {0} introuvables.
-
-VBF_EXC_VALIDATORNAME_IS_NULL=IWAE0022E Le plug-in dont l''ID est {0} a \u00e9t\u00e9 d\u00e9sactiv\u00e9 car sa m\u00e9thode getName() a renvoy\u00e9 NULL. Cette m\u00e9thode doit renvoyer une valeur.
-
-VBF_EXC_NULLCREATE=IWAE0023E Impossible de cr\u00e9er une configuration de validation sur une ressource NULL.
-VBF_EXC_NULLSAVE=IWAE0024E Impossible de sauvegarder une configuration de validation sur une ressource NULL.
-VBF_EXC_SAVE=IWAE0025E Impossible de sauvegarder la configuration de validation sur la ressource {0}.
-VBF_EXC_NULLRETRIEVE=IWAE0026E Impossible d'extraire la configuration de validation car la ressource est NULL.
-VBF_EXC_RETRIEVE=IWAE0027E Impossible d''extraire la configuration de validation de la ressource {0}.
-
-VBF_EXC_BADVMD=IWAE0028E ValidatorMetaData[] ne doit pas \u00eatre NULL ou vide.
-VBF_EXC_OPENPRJ=IWAE0029E Le projet {0} doit \u00eatre ouvert.
-VBF_EXC_EXISTPRJ=IWAE0030E Le projet {0} doit exister.
-VBF_EXC_BADPRJ=IWAE0031E Le projet {0} doit correspondre au projet qui contient les ressources dans IResource[].
-VBF_EXC_MULTIPRJ=IWAE0032E Toutes les instances IResource d''IResource[] doivent appartenir \u00e0 la m\u00eame instance IProject. Les ressources proviennent des projets suivants : {0}.
-VBF_EXC_BADVAL=IWAE0033E Le valideur {0} doit \u00eatre configur\u00e9 sur {1} ;
-
-VBF_STATUS_INITIALIZING=Initialisation de {0}.
-
-VBF_STATUS_VALIDATOR_CLEANUP=Nettoyage sur {0} avant arr\u00eat.
-
-VBF_STATUS_PROGRESSMONITOR_TITLE=Validation
-VBF_STATUS_NULL_DELTA=Le dernier \u00e9tat de compilation de {0} n''a pas pu \u00eatre extrait. Validation int\u00e9grale en cours.
-
-VBF_STATUS_VALIDATOR_TERMINATED=La validation de {0} \u00e0 l''aide de {1} a \u00e9t\u00e9 annul\u00e9e.
-
-VBF_STATUS_START_REMOVING_OLD_MESSAGES=La suppression des messages {0} sur {1} a commenc\u00e9...
-VBF_STATUS_FINISH_REMOVING_OLD_MESSAGES=Messages supprim\u00e9s.
-
-VBF_STATUS_STARTING_VALIDATION=La validation de {0} par {1} a commenc\u00e9...
-VBF_STATUS_ENDING_VALIDATION=La validation de {0} par {1} est termin\u00e9e. Tous les incidents recens\u00e9s ont \u00e9t\u00e9 signal\u00e9s.
-VBF_STATUS_ENDING_VALIDATION_ABNORMALLY=La validation de {0} par {1} ne s''est pas termin\u00e9e correctement. La liste des incidents est peut-\u00eatre incompl\u00e8te. Recherchez le motif de cette fin anormale dans les messages d'information.
-
-VBF_STATUS_LOOKING=Recherche des messages de validation des valideurs d\u00e9sinstall\u00e9s...
-VBF_STATUS_LOOKINGDONE=Recherche des messages de validation des valideurs d\u00e9sinstall\u00e9s...termin\u00e9e.
-VBF_STATUS_REMOVING=Suppression des messages de validation des valideurs d\u00e9sinstall\u00e9s...
-VBF_STATUS_REMOVINGDONE=Suppression des messages de validation des valideurs d\u00e9sinstall\u00e9s...termin\u00e9e.
-
-# The following message will be deleted soon.
-VBF_TASK_WARN_MESSAGE_LIMIT_ABORT=IWAE0034W IWAD3000I: {1} a termin\u00e9 la validation de {0} car le nombre maximal de messages a \u00e9t\u00e9 signal\u00e9. Certains messages sont peut-\u00eatre manquants.
-
-VBF_TASK_WARN_MESSAGE_LIMIT_VAL=IWAE0035W IWAD3000I: Certains messages peuvent \u00eatre manquants car le nombre de messages signal\u00e9s a atteint la limite admise. Augmentez le nombre maximal de messages autoris\u00e9s, puis recommencez.
-
-#
-# End Validation Builder Framework Strings
-#
-
diff --git a/plugins/org.eclipse.wst.validation/property_files/validate_base_it.properties b/plugins/org.eclipse.wst.validation/property_files/validate_base_it.properties
deleted file mode 100644
index 403ae83..0000000
--- a/plugins/org.eclipse.wst.validation/property_files/validate_base_it.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 L''indicatore non pu\u00f2 essere aggiunto alla risorsa {0} nell''elenco attivit\u00e0.
-VBF_EXC_CANNOT_REMOVE_MARKER=IWAE0002E L''indicatore non pu\u00f2 essere rimosso dalla risorsa {0} nell''elenco attivit\u00e0.
-
-VBF_EXC_HELPER_MISSING=IWAE0003E Impossibile caricare {0}. Non \u00e8 stato specificato alcun <helper>. Ciascun validator deve identificare la classe helper che carica il modello MOF.
-VBF_EXC_HELPER_CANNOTLOAD=IWAE0004E Impossibile caricare {0}. L''<helper>, {1}, non pu\u00f2 essere caricato. Verificare che il nome, che segue la distinzione maiuscolo/minuscolo, sia specificato correttamente.
-
-VBF_EXC_INTERNAL=IWAE0005E Errore interno durante la convalida. La convalida era in corso sul progetto {0} con il validator {1}. Il messaggio attivato era {2}.
-
-# 2TC: In the following string, "type" is a noun
-VBF_EXC_INVALID_TYPE_FILTER=IWAE0006E Filtro di tipo non valido; {0} deve essere un''istanza di {1}.
-VBF_EXC_INVALID_RESOURCE=IWAE0007E Il messaggio "{0}" non pu\u00f2 essere aggiunto con l''oggetto di destinazione "{1}". Impossibile trovare file, cartelle o progetti con cui associare il messaggio.
-
-VBF_EXC_MISSING_VALIDATOR_EP=IWAE0008E Impossibile avviare la struttura del validator. Non \u00e8 stato possibile individuare il punto di estensione \"{0}\". Salvare tutti i file di log e contattare il rappresentante IBM.
-VBF_EXC_MISSING_PROJECTNATURE_ID=IWAE0009E projectNature deve essere associato a un ID. La convalida ignora questo tag e continua.
-
-VBF_EXC_RUNTIME=IWAE0010E Eccezione run-time {0} durante la convalida. Il validator in corso di esecuzione era {1} e il messaggio generato era {2}.
-
-VBF_EXC_SYNTAX_NULL_NAME=IWAE0011E Impossibile aggiungere la risorsa {0} all''elenco dei file. IHelper.getPortableName() restituisce null. Questa risorsa non sar\u00e0 convalidata dal validator {1}.
-VBF_EXC_SYNTAX_NO_HELPER=IWAE0012E Non \u00e8 stato specificato alcun <helper> nel file plugin.xml per il validator {0}. Dal momento che l''helper non pu\u00f2 essere creato, il validator non verr\u00e0 caricato.
-VBF_EXC_SYNTAX_NO_HELPER_CLASS=IWAE0013E Non \u00e8 stato specificato alcun attributo "class" nell''elemento <helper> nel file plugin.xml per il validator {0}. Impossibile creare l''helper senza il nome della classe che lo implementa. Dal momento che l''helper non pu\u00f2 essere creato, il validator non verr\u00e0 caricato.
-VBF_EXC_SYNTAX_NO_HELPER_THROWABLE=IWAE0014E Impossibile creare l''helper {0} perch\u00e9 \u00e8 stata rilevata un''eccezione Throwable.
-VBF_EXC_SYNTAX_NO_VAL_RUN=IWAE0015E Impossibile creare il validator. Non \u00e8 stato specificato alcun elemento <run> nel file plugin.xml per il validator {0}. Impossibile creare un validator a meno che non esiste un elemento <run> che specifichi l''attributo "class". Il valore dell''attributo "class" deve corrispondere al nome della classe che implementa l''interfaccia IWorkbenchHelper.
-VBF_EXC_SYNTAX_NO_VAL_CLASS=IWAE0016E Impossibile creare il validator. Non \u00e8 stato specificato alcun attributo "class" nell''elemento <run> del file plugin.xml per il validator {0}. Impossibile creare un validator a meno che non esiste un elemento <run> che specifichi l''attributo "class". Il valore dell''attributo "class" deve corrispondere al nome della classe che implementa l''interfaccia IWorkbenchHelper.
-VBF_EXC_SYNTAX_NO_VAL_THROWABLE=IWAE0017E Impossibile creare un validator {0}. \u00c8 stato rilevato un Throwable.
-VBF_EXC_SYNTAX_NO_VAL_NULL=IWAE0018E Impossibile creare la classe {0} del validator. IConfigurationElement.createExecutableExtension(String) ha restituito null.
-
-VBF_EXC_DISABLEV=IWAE0019E Impossibile creare l''istanza del validator {0}. Disabilitazione del validator in corso; leggere il log per i dettagli.
-VBF_EXC_DISABLEH=IWAE0020E Impossibile creare l''istanza dell''helper {0}. Disabilitazione del validator {1} in corso; leggere il log per i dettagli.
-VBF_EXC_ORPHAN_IVALIDATOR=IWAE0021E Impossibile rilevare i metadati del validator {0}.
-
-VBF_EXC_VALIDATORNAME_IS_NULL=IWAE0022E Il plugin con ID {0} \u00e8 stato disattivato. Il suo metodo getName() restituisce null. Il metodo deve restituire un valore.
-
-VBF_EXC_NULLCREATE=IWAE0023E Impossibile creare una configurazione di convalida su una risorsa null.
-VBF_EXC_NULLSAVE=IWAE0024E Impossibile salvare una configurazione di convalida su una risorsa null.
-VBF_EXC_SAVE=IWAE0025E Impossibile salvare la configurazione di convalida per la risorsa {0}.
-VBF_EXC_NULLRETRIEVE=IWAE0026E Impossibile richiamare la configurazione di convalida perch\u00e9 la risorsa \u00e8 null.
-VBF_EXC_RETRIEVE=IWAE0027E Impossibile richiamare la configurazione di convalida per la risorsa {0}.
-
-VBF_EXC_BADVMD=IWAE0028E ValidatorMetaData[] non deve essere null o vuoto.
-VBF_EXC_OPENPRJ=IWAE0029E Il progetto {0} deve essere aperto.
-VBF_EXC_EXISTPRJ=IWAE0030E Il progetto {0} deve esistere.
-VBF_EXC_BADPRJ=IWAE0031E Il progetto {0} deve contenere le risorse in IResource[].
-VBF_EXC_MULTIPRJ=IWAE0032E Tutte le istanze IResource in IResource[] devono appartenere alla stessa instanza IProject. La risorsa viene dai seguenti progetti: {0}.
-VBF_EXC_BADVAL=IWAE0033E Il validator {0} deve essere configurato su {1};
-
-VBF_STATUS_INITIALIZING=Inizializzazione di {0}.
-
-VBF_STATUS_VALIDATOR_CLEANUP=Esecuzione pulitura su {0} prima della terminazione.
-
-VBF_STATUS_PROGRESSMONITOR_TITLE=Convalida in corso
-VBF_STATUS_NULL_DELTA=\u00c8 impossibile recuperare l''ultimo stato di generazione di {0}. Esecuzione di una operazione di convalida completa.
-
-VBF_STATUS_VALIDATOR_TERMINATED=La convalida di {0} mediante {1} \u00e8 stata annullata.
-
-VBF_STATUS_START_REMOVING_OLD_MESSAGES=L''eliminazione di {0} messaggi mediante {1} \u00e8 stata avviata...
-VBF_STATUS_FINISH_REMOVING_OLD_MESSAGES=Messaggi eliminati.
-
-VBF_STATUS_STARTING_VALIDATION=La convalida di {0} mediante {1} \u00e8 stata avviata...
-VBF_STATUS_ENDING_VALIDATION=La convalida di {0} mediante {1} \u00e8 completa. \u00c8 stato creato un prospetto di tutti i problemi noti.
-VBF_STATUS_ENDING_VALIDATION_ABNORMALLY=La convalida di {0} mediante {1} \u00e8 terminata in modo anomalo. L''elenco dei problemi potrebbe essere incompleto. Controllare i messaggi di informazione per individuare la causa della terminazione anomala.
-
-VBF_STATUS_LOOKING=Ricerca di messaggi di convalida dei validator disinstallati...
-VBF_STATUS_LOOKINGDONE=Ricerca di messaggi di convalida dei validator disinstallati...eseguito.
-VBF_STATUS_REMOVING=Rimozione dei messaggi di convalida dei validator disinstallati...
-VBF_STATUS_REMOVINGDONE=Rimozione dei messaggi di convalida dei validator disinstallati...eseguito.
-
-# The following message will be deleted soon.
-VBF_TASK_WARN_MESSAGE_LIMIT_ABORT=IWAE0034W IWAD3000I: {1} ha interrotto la convalida di {0} poich\u00e9 \u00e8 stato rilevato il numero massimo di messaggi. Alcuni messaggi potrebbero mancare.
-
-VBF_TASK_WARN_MESSAGE_LIMIT_VAL=IWAE0035W IWAD3000I: Raggiunto il numero massimo di messaggi visualizzabili. Aumentare il numero massimo di messaggi e provare nuovamente.
-
-#
-# End Validation Builder Framework Strings
-#
-
diff --git a/plugins/org.eclipse.wst.validation/property_files/validate_base_ja.properties b/plugins/org.eclipse.wst.validation/property_files/validate_base_ja.properties
deleted file mode 100644
index 4a48da7..0000000
--- a/plugins/org.eclipse.wst.validation/property_files/validate_base_ja.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 \u30de\u30fc\u30ab\u30fc\u3092\u30bf\u30b9\u30af\u30fb\u30ea\u30b9\u30c8\u5185\u306e\u30ea\u30bd\u30fc\u30b9 {0} \u306b\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3002
-VBF_EXC_CANNOT_REMOVE_MARKER=IWAE0002E \u30de\u30fc\u30ab\u30fc\u3092\u30bf\u30b9\u30af\u30fb\u30ea\u30b9\u30c8\u5185\u306e\u30ea\u30bd\u30fc\u30b9 {0} \u304b\u3089\u9664\u53bb\u3067\u304d\u307e\u305b\u3093\u3002
-
-VBF_EXC_HELPER_MISSING=IWAE0003E <helper> \u304c\u672a\u6307\u5b9a\u306e\u305f\u3081\u3001{0} \u3092\u30ed\u30fc\u30c9\u3067\u304d\u307e\u305b\u3093\u3002 \u305d\u308c\u305e\u308c\u306e\u30d0\u30ea\u30c7\u30fc\u30bf\u30fc\u304c\u3001\u56fa\u6709\u306e MOF \u30e2\u30c7\u30eb\u3092\u30ed\u30fc\u30c9\u3059\u308b\u30d8\u30eb\u30d1\u30fc\u30fb\u30af\u30e9\u30b9\u3092\u8b58\u5225\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002
-VBF_EXC_HELPER_CANNOTLOAD=IWAE0004E <helper> {1} \u3092\u30ed\u30fc\u30c9\u3067\u304d\u306a\u304b\u3063\u305f\u305f\u3081\u3001{0} \u3092\u30ed\u30fc\u30c9\u3067\u304d\u307e\u305b\u3093\u3002 \u5927\u6587\u5b57\u5c0f\u6587\u5b57\u3092\u533a\u5225\u3059\u308b\u30d5\u30a1\u30a4\u30eb\u540d\u304c\u6b63\u3057\u304f\u30b9\u30da\u30eb\u3055\u308c\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002
-
-VBF_EXC_INTERNAL=IWAE0005E \u59a5\u5f53\u6027\u691c\u67fb\u4e2d\u306b\u5185\u90e8\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 \u59a5\u5f53\u6027\u691c\u67fb\u306f\u3001\u30d0\u30ea\u30c7\u30fc\u30bf\u30fc {1} \u3092\u4f7f\u7528\u3057\u3066\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 {0} \u3067\u5b9f\u884c\u3055\u308c\u3066\u3044\u307e\u3057\u305f\u3002 \u30b9\u30ed\u30fc\u3055\u308c\u305f\u30e1\u30c3\u30bb\u30fc\u30b8\u306f {2} \u3067\u3059\u3002
-
-# 2TC: In the following string, "type" is a noun
-VBF_EXC_INVALID_TYPE_FILTER=IWAE0006E \u7121\u52b9\u306a\u578b\u306e\u30d5\u30a3\u30eb\u30bf\u30fc; {0} \u306f {1} \u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
-VBF_EXC_INVALID_RESOURCE=IWAE0007E \u30e1\u30c3\u30bb\u30fc\u30b8\u306b\u95a2\u9023\u4ed8\u3051\u308b\u30d5\u30a1\u30a4\u30eb\u3001\u30d5\u30a9\u30eb\u30c0\u30fc\u307e\u305f\u306f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u304c\u898b\u3064\u304b\u3089\u306a\u3044\u305f\u3081\u3001\u30bf\u30fc\u30b2\u30c3\u30c8\u30fb\u30aa\u30d6\u30b8\u30a7\u30af\u30c8 "{1}" \u3092\u6301\u3064\u30e1\u30c3\u30bb\u30fc\u30b8 "{0}" \u3092\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3002
-
-VBF_EXC_MISSING_VALIDATOR_EP=IWAE0008E \u30d0\u30ea\u30c7\u30fc\u30bf\u30fc\u30fb\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3092\u958b\u59cb\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 \"{0}\" \u3068\u3044\u3046\u540d\u524d\u306e\u62e1\u5f35\u30dd\u30a4\u30f3\u30c8\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002 \u30ed\u30b0\u30fb\u30d5\u30a1\u30a4\u30eb\u3092\u3059\u3079\u3066\u4fdd\u7ba1\u3057\u3066\u3001IBM \u62c5\u5f53\u54e1\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002
-VBF_EXC_MISSING_PROJECTNATURE_ID=IWAE0009E projectNature \u306b\u306f\u95a2\u9023 ID \u304c\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002 \u59a5\u5f53\u6027\u691c\u67fb\u306f\u3053\u306e\u30bf\u30b0\u3092\u7121\u8996\u3057\u3066\u7d9a\u884c\u4e2d\u3067\u3059\u3002
-
-VBF_EXC_RUNTIME=IWAE0010E \u59a5\u5f53\u6027\u691c\u67fb\u4e2d\u306b\u30e9\u30f3\u30bf\u30a4\u30e0\u4f8b\u5916 {0} \u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 \u5b9f\u884c\u3057\u3066\u3044\u305f\u30d0\u30ea\u30c7\u30fc\u30bf\u30fc\u306f {1} \u3067\u3001\u30b9\u30ed\u30fc\u3055\u308c\u305f\u30e1\u30c3\u30bb\u30fc\u30b8\u306f {2} \u3067\u3059\u3002
-
-VBF_EXC_SYNTAX_NULL_NAME=IWAE0011E IHelper.getPortableName() \u304c NULL \u3092\u623b\u3059\u305f\u3081\u3001\u30ea\u30bd\u30fc\u30b9 {0} \u3092\u30d5\u30a1\u30a4\u30eb\u30fb\u30ea\u30b9\u30c8\u306b\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3002 \u3053\u306e\u30ea\u30bd\u30fc\u30b9\u306f\u3001{1} \u3068\u3044\u3046\u540d\u524d\u306e\u30d0\u30ea\u30c7\u30fc\u30bf\u30fc\u3067\u306f\u59a5\u5f53\u6027\u691c\u67fb\u3055\u308c\u307e\u305b\u3093\u3002
-VBF_EXC_SYNTAX_NO_HELPER=IWAE0012E \u30d0\u30ea\u30c7\u30fc\u30bf\u30fc {0} \u306e plugin.xml \u30d5\u30a1\u30a4\u30eb\u306b <helper> \u30a8\u30ec\u30e1\u30f3\u30c8\u304c\u6307\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 \u30d8\u30eb\u30d1\u30fc\u3092\u4f5c\u6210\u3067\u304d\u306a\u3044\u305f\u3081\u3001\u30d0\u30ea\u30c7\u30fc\u30bf\u30fc\u306f\u30ed\u30fc\u30c9\u3055\u308c\u307e\u305b\u3093\u3002
-VBF_EXC_SYNTAX_NO_HELPER_CLASS=IWAE0013E \u30d0\u30ea\u30c7\u30fc\u30bf\u30fc {0} \u306e plugin.xml \u30d5\u30a1\u30a4\u30eb\u306b\u3001<helper> \u30a8\u30ec\u30e1\u30f3\u30c8\u306e "\u30af\u30e9\u30b9" \u5c5e\u6027\u304c\u6307\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 \u30d8\u30eb\u30d1\u30fc\u3092\u5b9f\u88c5\u3059\u308b\u30af\u30e9\u30b9\u306e\u540d\u524d\u304c\u306a\u3044\u3068\u3001\u30d8\u30eb\u30d1\u30fc\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3002 \u30d8\u30eb\u30d1\u30fc\u3092\u4f5c\u6210\u3067\u304d\u306a\u3044\u305f\u3081\u3001\u30d0\u30ea\u30c7\u30fc\u30bf\u30fc\u306f\u30ed\u30fc\u30c9\u3055\u308c\u307e\u305b\u3093\u3002
-VBF_EXC_SYNTAX_NO_HELPER_THROWABLE=IWAE0014E throw \u53ef\u80fd\u30af\u30e9\u30b9\u304c\u30ad\u30e3\u30c3\u30c1\u3055\u308c\u305f\u305f\u3081\u3001\u30d8\u30eb\u30d1\u30fc {0} \u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3002
-VBF_EXC_SYNTAX_NO_VAL_RUN=IWAE0015E {0} \u3068\u3044\u3046\u540d\u524d\u306e\u30d0\u30ea\u30c7\u30fc\u30bf\u30fc\u306e plugin.xml \u30d5\u30a1\u30a4\u30eb\u306b <run> \u30a8\u30ec\u30e1\u30f3\u30c8\u304c\u6307\u5b9a\u3055\u308c\u3066\u3044\u306a\u3044\u305f\u3081\u3001\u30d0\u30ea\u30c7\u30fc\u30bf\u30fc\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3002 "\u30af\u30e9\u30b9" \u5c5e\u6027\u3092\u6307\u5b9a\u3059\u308b <run> \u30a8\u30ec\u30e1\u30f3\u30c8\u304c\u5b58\u5728\u3057\u306a\u3044\u9650\u308a\u3001\u30d0\u30ea\u30c7\u30fc\u30bf\u30fc\u3092\u4f5c\u6210\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002 "\u30af\u30e9\u30b9" \u5c5e\u6027\u306e\u5024\u306f\u3001IWorkbenchHelper \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u3092\u5b9f\u88c5\u3059\u308b\u30af\u30e9\u30b9\u306e\u540d\u524d\u3067\u3059\u3002
-VBF_EXC_SYNTAX_NO_VAL_CLASS=IWAE0016E {0} \u3068\u3044\u3046\u540d\u524d\u306e\u30d0\u30ea\u30c7\u30fc\u30bf\u30fc\u306e plugin.xml \u30d5\u30a1\u30a4\u30eb\u5185\u306e <run> \u30a8\u30ec\u30e1\u30f3\u30c8\u306b "\u30af\u30e9\u30b9" \u5c5e\u6027\u304c\u6307\u5b9a\u3055\u308c\u3066\u3044\u306a\u3044\u305f\u3081\u3001\u30d0\u30ea\u30c7\u30fc\u30bf\u30fc\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3002 "\u30af\u30e9\u30b9" \u5c5e\u6027\u3092\u6307\u5b9a\u3059\u308b <run> \u30a8\u30ec\u30e1\u30f3\u30c8\u304c\u5b58\u5728\u3057\u306a\u3044\u9650\u308a\u3001\u30d0\u30ea\u30c7\u30fc\u30bf\u30fc\u3092\u4f5c\u6210\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002 "\u30af\u30e9\u30b9" \u5c5e\u6027\u306e\u5024\u306f\u3001IWorkbenchHelper \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u3092\u5b9f\u88c5\u3059\u308b\u30af\u30e9\u30b9\u306e\u540d\u524d\u3067\u3059\u3002
-VBF_EXC_SYNTAX_NO_VAL_THROWABLE=IWAE0017E throw \u53ef\u80fd\u30af\u30e9\u30b9\u304c\u30ad\u30e3\u30c3\u30c1\u3055\u308c\u305f\u305f\u3081\u3001\u30d0\u30ea\u30c7\u30fc\u30bf\u30fc {0} \u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3002
-VBF_EXC_SYNTAX_NO_VAL_NULL=IWAE0018E \u30d0\u30ea\u30c7\u30fc\u30bf\u30fc\u30fb\u30af\u30e9\u30b9 {0} \u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 IConfigurationElement.createExecutableExtension(String) \u304c NULL \u3092\u623b\u3057\u307e\u3057\u305f\u3002
-
-VBF_EXC_DISABLEV=IWAE0019E \u30d0\u30ea\u30c7\u30fc\u30bf\u30fc {0} \u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u751f\u6210\u3067\u304d\u307e\u305b\u3093\u3002 \u30d0\u30ea\u30c7\u30fc\u30bf\u30fc\u3092\u4f7f\u7528\u4e0d\u53ef\u306b\u3057\u307e\u3059\u3002\u8a73\u3057\u304f\u306f\u3001\u30ed\u30b0\u30fb\u30d5\u30a1\u30a4\u30eb\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002
-VBF_EXC_DISABLEH=IWAE0020E \u30d8\u30eb\u30d1\u30fc {0} \u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u751f\u6210\u3067\u304d\u307e\u305b\u3093\u3002 \u30d0\u30ea\u30c7\u30fc\u30bf\u30fc {1} \u3092\u4f7f\u7528\u4e0d\u53ef\u306b\u3057\u307e\u3059\u3002\u8a73\u3057\u304f\u306f\u3001\u30ed\u30b0\u30fb\u30d5\u30a1\u30a4\u30eb\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002
-VBF_EXC_ORPHAN_IVALIDATOR=IWAE0021E \u30d0\u30ea\u30c7\u30fc\u30bf\u30fc {0} \u306e\u30e1\u30bf\u30c7\u30fc\u30bf\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002
-
-VBF_EXC_VALIDATORNAME_IS_NULL=IWAE0022E ID {0} \u306e\u30d7\u30e9\u30b0\u30a4\u30f3\u306e getName() \u30e1\u30bd\u30c3\u30c9\u304c NULL \u3092\u623b\u3059\u305f\u3081\u3001\u3053\u306e\u30d7\u30e9\u30b0\u30a4\u30f3\u306f\u4f7f\u7528\u4e0d\u53ef\u306b\u3055\u308c\u307e\u3057\u305f\u3002 \u30e1\u30bd\u30c3\u30c9\u306f\u5024\u3092\u623b\u3059\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002
-
-VBF_EXC_NULLCREATE=IWAE0023E NULL \u30ea\u30bd\u30fc\u30b9\u3067\u306f\u59a5\u5f53\u6027\u691c\u67fb\u69cb\u6210\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3002
-VBF_EXC_NULLSAVE=IWAE0024E NULL \u30ea\u30bd\u30fc\u30b9\u3067\u306f\u59a5\u5f53\u6027\u691c\u67fb\u69cb\u6210\u3092\u4fdd\u7ba1\u3067\u304d\u307e\u305b\u3093\u3002
-VBF_EXC_SAVE=IWAE0025E \u30ea\u30bd\u30fc\u30b9 {0} \u3067\u59a5\u5f53\u6027\u691c\u67fb\u69cb\u6210\u3092\u4fdd\u7ba1\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
-VBF_EXC_NULLRETRIEVE=IWAE0026E \u30ea\u30bd\u30fc\u30b9\u304c NULL \u3067\u3042\u308b\u305f\u3081\u3001\u59a5\u5f53\u6027\u691c\u67fb\u69cb\u6210\u3092\u691c\u7d22\u3067\u304d\u307e\u305b\u3093\u3002
-VBF_EXC_RETRIEVE=IWAE0027E \u30ea\u30bd\u30fc\u30b9 {0} \u306e\u59a5\u5f53\u6027\u691c\u67fb\u69cb\u6210\u3092\u691c\u7d22\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
-
-VBF_EXC_BADVMD=IWAE0028E ValidatorMetaData[] \u306f NULL \u307e\u305f\u306f\u7a7a\u306b\u3067\u304d\u307e\u305b\u3093\u3002
-VBF_EXC_OPENPRJ=IWAE0029E \u30d7\u30ed\u30b8\u30a7\u30af\u30c8 {0} \u3092\u958b\u304f\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002
-VBF_EXC_EXISTPRJ=IWAE0030E \u30d7\u30ed\u30b8\u30a7\u30af\u30c8 {0} \u304c\u5b58\u5728\u3057\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
-VBF_EXC_BADPRJ=IWAE0031E \u30d7\u30ed\u30b8\u30a7\u30af\u30c8 {0} \u306f\u3001IResource[] \u5185\u306e\u30ea\u30bd\u30fc\u30b9\u3092\u542b\u3080\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
-VBF_EXC_MULTIPRJ=IWAE0032E IResource[] \u5185\u306e\u3059\u3079\u3066\u306e IResource \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306f\u3001\u540c\u3058 IProject \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u4e00\u90e8\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002 \u30ea\u30bd\u30fc\u30b9\u306f\u3001\u4ee5\u4e0b\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u304b\u3089\u3082\u306e\u3067\u3059\u3002{0}
-VBF_EXC_BADVAL=IWAE0033E \u30d0\u30ea\u30c7\u30fc\u30bf\u30fc {0} \u306f {1} \u4e0a\u306b\u69cb\u6210\u3057\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
-
-VBF_STATUS_INITIALIZING={0} \u3092\u521d\u671f\u5316\u3057\u3066\u3044\u307e\u3059\u3002
-
-VBF_STATUS_VALIDATOR_CLEANUP=\u7d42\u4e86\u3059\u308b\u524d\u306b {0} \u3067\u306e\u30af\u30ea\u30fc\u30f3\u30a2\u30c3\u30d7\u3092\u5b9f\u884c\u3057\u3066\u3044\u307e\u3059\u3002
-
-VBF_STATUS_PROGRESSMONITOR_TITLE=\u691c\u67fb\u4e2d
-VBF_STATUS_NULL_DELTA={0} \u306e\u6700\u5f8c\u306e\u30d3\u30eb\u30c9\u72b6\u614b\u3092\u691c\u7d22\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 \u5b8c\u5168\u59a5\u5f53\u6027\u691c\u67fb\u3092\u5b9f\u884c\u3057\u3066\u3044\u307e\u3059\u3002
-
-VBF_STATUS_VALIDATOR_TERMINATED={1} \u3092\u4f7f\u7528\u3059\u308b {0} \u306e\u59a5\u5f53\u6027\u691c\u67fb\u304c\u53d6\u308a\u6d88\u3055\u308c\u307e\u3057\u305f\u3002
-
-VBF_STATUS_START_REMOVING_OLD_MESSAGES={1} \u3067\u306e {0} \u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u9664\u53bb\u304c\u958b\u59cb\u3057\u307e\u3057\u305f...
-VBF_STATUS_FINISH_REMOVING_OLD_MESSAGES=\u30e1\u30c3\u30bb\u30fc\u30b8\u304c\u9664\u53bb\u3055\u308c\u307e\u3057\u305f\u3002
-
-VBF_STATUS_STARTING_VALIDATION={1} \u306b\u3088\u308b {0} \u306e\u59a5\u5f53\u6027\u691c\u67fb\u304c\u958b\u59cb\u3057\u307e\u3057\u305f...
-VBF_STATUS_ENDING_VALIDATION={1} \u306b\u3088\u308b {0} \u306e\u59a5\u5f53\u6027\u691c\u67fb\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f\u3002 \u3059\u3079\u3066\u306e\u65e2\u77e5\u306e\u554f\u984c\u304c\u5831\u544a\u3055\u308c\u3066\u3044\u307e\u3059\u3002
-VBF_STATUS_ENDING_VALIDATION_ABNORMALLY={1} \u306b\u3088\u308b {0} \u306e\u59a5\u5f53\u6027\u691c\u67fb\u304c\u7570\u5e38\u7d42\u4e86\u3057\u307e\u3057\u305f\u3002 \u554f\u984c\u306e\u30ea\u30b9\u30c8\u306f\u4e0d\u5b8c\u5168\u306a\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002 \u60c5\u5831\u30e1\u30c3\u30bb\u30fc\u30b8\u3067\u7570\u5e38\u7d42\u4e86\u306e\u539f\u56e0\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002
-
-VBF_STATUS_LOOKING=\u30a2\u30f3\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u305f\u30d0\u30ea\u30c7\u30fc\u30bf\u30fc\u304c\u6240\u6709\u3057\u3066\u3044\u305f\u59a5\u5f53\u6027\u691c\u67fb\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u63a2\u3057\u3066\u3044\u307e\u3059...
-VBF_STATUS_LOOKINGDONE=\u30a2\u30f3\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u305f\u30d0\u30ea\u30c7\u30fc\u30bf\u30fc\u304c\u6240\u6709\u3057\u3066\u3044\u305f\u59a5\u5f53\u6027\u691c\u67fb\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u63a2\u3057\u3066\u3044\u307e\u3059... \u5b8c\u4e86\u3002
-VBF_STATUS_REMOVING=\u30a2\u30f3\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u305f\u30d0\u30ea\u30c7\u30fc\u30bf\u30fc\u304c\u6240\u6709\u3057\u3066\u3044\u305f\u59a5\u5f53\u6027\u691c\u67fb\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9664\u53bb\u3057\u3066\u3044\u307e\u3059...
-VBF_STATUS_REMOVINGDONE=\u30a2\u30f3\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u305f\u30d0\u30ea\u30c7\u30fc\u30bf\u30fc\u304c\u6240\u6709\u3057\u3066\u3044\u305f\u59a5\u5f53\u6027\u691c\u67fb\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9664\u53bb\u3057\u3066\u3044\u307e\u3059... \u5b8c\u4e86\u3002
-
-# The following message will be deleted soon.
-VBF_TASK_WARN_MESSAGE_LIMIT_ABORT=IWAE0034W IWAD3000I: \u6700\u5927\u6570\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u304c\u5831\u544a\u3055\u308c\u305f\u305f\u3081\u3001{1} \u304c {0} \u306e\u59a5\u5f53\u6027\u691c\u67fb\u3092\u7d42\u4e86\u3057\u307e\u3057\u305f\u3002 \u4e00\u90e8\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u304c\u6b20\u843d\u3057\u3066\u3044\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002
-
-VBF_TASK_WARN_MESSAGE_LIMIT_VAL=IWAE0035W IWAD3000I: \u6700\u5927\u6570\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u304c\u5831\u544a\u3055\u308c\u305f\u305f\u3081\u3001\u4e00\u90e8\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u304c\u6b20\u843d\u3057\u3066\u3044\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002 \u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u6700\u5927\u6570\u3092\u5897\u3084\u3057\u3066\u3001\u518d\u5ea6\u8a66\u884c\u3057\u3066\u304f\u3060\u3055\u3044\u3002
-
-#
-# End Validation Builder Framework Strings
-#
-
diff --git a/plugins/org.eclipse.wst.validation/property_files/validate_base_ko.properties b/plugins/org.eclipse.wst.validation/property_files/validate_base_ko.properties
deleted file mode 100644
index 58a6d08..0000000
--- a/plugins/org.eclipse.wst.validation/property_files/validate_base_ko.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 \ud0c0\uc2a4\ud06c \ubaa9\ub85d\uc758 \uc790\uc6d0 {0}\uc5d0 \ub9c8\ucee4\ub97c \ucd94\uac00\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
-VBF_EXC_CANNOT_REMOVE_MARKER=IWAE0002E \ud0c0\uc2a4\ud06c \ubaa9\ub85d\uc758 \uc790\uc6d0 {0}\uc5d0\uc11c \ub9c8\ucee4\ub97c \uc81c\uac70\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
-
-VBF_EXC_HELPER_MISSING=IWAE0003E <helper>\ub97c \uc9c0\uc815\ud558\uc9c0 \uc54a\uc558\uc73c\ubbc0\ub85c {0}\uc744(\ub97c) \ub85c\ub4dc\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \uac01 \uc720\ud6a8\uc131 \uac80\uc99d\uae30\ub294 MOF \ubaa8\ub378\uc744 \ub85c\ub4dc\ud558\ub294 \ud5ec\ud37c \ud074\ub798\uc2a4\ub97c \uc2dd\ubcc4\ud574\uc57c \ud569\ub2c8\ub2e4.
-VBF_EXC_HELPER_CANNOTLOAD=IWAE0004E <helper> {1}\uc744(\ub97c) \ub85c\ub4dc\ud560 \uc218 \uc5c6\uc73c\ubbc0\ub85c {0}\uc744(\ub97c) \ub85c\ub4dc\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \ub300\uc18c\ubb38\uc790 \uad6c\ubd84 \ud30c\uc77c \uc774\ub984 \ucca0\uc790\uac00 \uc62c\ubc14\ub978\uc9c0 \ud655\uc778\ud558\uc2ed\uc2dc\uc624.
-
-VBF_EXC_INTERNAL=IWAE0005E \uc720\ud6a8\uc131 \uac80\uc99d \ub3d9\uc548 \ub0b4\ubd80 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4. {1} \uc720\ud6a8\uc131 \uac80\uc99d\uae30\ub85c {0} \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c \uc720\ud6a8\uc131 \uac80\uc99d\uc744 \uc2e4\ud589 \uc911\uc774\uc5c8\uc2b5\ub2c8\ub2e4. \ucc98\ub9ac\ub41c \uba54\uc2dc\uc9c0\ub294 {2}\uc785\ub2c8\ub2e4.
-
-# 2TC: In the following string, "type" is a noun
-VBF_EXC_INVALID_TYPE_FILTER=IWAE0006E \uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \uc720\ud615 \ud544\ud130, {0}\uc740(\ub294) {1}\uc758 \uc778\uc2a4\ud134\uc2a4\uc5ec\uc57c \ud569\ub2c8\ub2e4.
-VBF_EXC_INVALID_RESOURCE=IWAE0007E \uba54\uc2dc\uc9c0\ub97c \uc5f0\uad00\uc2dc\ud0ac \ud30c\uc77c, \ud3f4\ub354 \ub610\ub294 \ud504\ub85c\uc81d\ud2b8\ub97c \ucc3e\uc744 \uc218 \uc5c6\uc73c\ubbc0\ub85c \ub300\uc0c1 \uc624\ube0c\uc81d\ud2b8 "{1}"(\uc73c)\ub85c {0}" \uba54\uc2dc\uc9c0\ub97c \ucd94\uac00\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
-
-VBF_EXC_MISSING_VALIDATOR_EP=IWAE0008E \uc720\ud6a8\uc131 \uac80\uc99d\uae30 \ud504\ub808\uc784\uc6cc\ud06c\ub97c \uc2dc\uc791\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \ud655\uc7a5\uc810 \"{0}\"\uc744(\ub97c) \ucc3e\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \ubaa8\ub4e0 \ub85c\uadf8 \ud30c\uc77c\uc744 \uc800\uc7a5\ud558\uace0 IBM \ub2f4\ub2f9\uc790\uc5d0\uac8c \ubb38\uc758\ud558\uc2ed\uc2dc\uc624.
-VBF_EXC_MISSING_PROJECTNATURE_ID=IWAE0009E projectNature\uc5d0 \uc5f0\uad00\ub41c ID\uac00 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. \uc720\ud6a8\uc131 \uac80\uc99d\uc5d0\uc11c \uc774 \ud0dc\uadf8\ub97c \ubb34\uc2dc\ud558\uace0 \uacc4\uc18d\ud569\ub2c8\ub2e4.
-
-VBF_EXC_RUNTIME=IWAE0010E \ub7f0\ud0c0\uc784 \uc608\uc678 {0}\uc774(\uac00) \uc720\ud6a8\uc131 \uac80\uc99d \uc911 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4. \uc2e4\ud589 \uc911\uc778 \uc720\ud6a8\uc131 \uac80\uc99d\uae30\ub294 {1}\uc774\uba70 \ucc98\ub9ac \uba54\uc2dc\uc9c0\ub294 {2}\uc785\ub2c8\ub2e4.
-
-VBF_EXC_SYNTAX_NULL_NAME=IWAE0011E IHelper.getPortableName()\uc774 \ub110(null)\uc744 \ub9ac\ud134\ud558\ubbc0\ub85c {0} \uc790\uc6d0\uc740 \ud30c\uc77c \ubaa9\ub85d\uc5d0 \ucd94\uac00\ub420 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \uc774 \uc790\uc6d0\uc740 \uc720\ud6a8\uc131 \uac80\uc99d\uae30 {1}\uc5d0 \uc758\ud574 \uc720\ud6a8\uc131 \uac80\uc99d\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.
-VBF_EXC_SYNTAX_NO_HELPER=IWAE0012E <helper> \uc694\uc18c\uac00 \uc720\ud6a8\uc131 \uac80\uc99d\uae30 {0}\uc758 plugin.xml \ud30c\uc77c\uc5d0 \uc9c0\uc815\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. \ud5ec\ud37c\ub97c \uc791\uc131\ud560 \uc218 \uc5c6\uc73c\ubbc0\ub85c \uc720\ud6a8\uc131 \uac80\uc99d\uae30\uac00 \ub85c\ub4dc\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.
-VBF_EXC_SYNTAX_NO_HELPER_CLASS=IWAE0013E <helper> \uc694\uc18c\uc758 "class" \uc18d\uc131\uc774 \uc720\ud6a8\uc131 \uac80\uc99d\uae30 {0}\uc758 plugin.xml \ud30c\uc77c\uc5d0 \uc9c0\uc815\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. \ud5ec\ud37c\ub294 \uad6c\ud604\ud558\ub294 \ud074\ub798\uc2a4\uc758 \uc774\ub984 \uc5c6\uc774 \uc791\uc131\ub420 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \ud5ec\ud37c\ub97c \uc791\uc131\ud560 \uc218 \uc5c6\uc73c\ubbc0\ub85c \uc720\ud6a8\uc131 \uac80\uc99d\uae30\uac00 \ub85c\ub4dc\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.
-VBF_EXC_SYNTAX_NO_HELPER_THROWABLE=IWAE0014E throwable\uc744 \ubc1c\uacac\ud588\uc73c\ubbc0\ub85c {0} \ud5ec\ud37c\ub97c \uc791\uc131\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
-VBF_EXC_SYNTAX_NO_VAL_RUN=IWAE0015E \uc720\ud6a8\uc131 \uac80\uc99d\uae30 {0}\uc758 plugin.xml \ud30c\uc77c\uc5d0 \uc9c0\uc815\ub41c <run> \uc694\uc18c\uac00 \uc5c6\uc73c\ubbc0\ub85c \uc720\ud6a8\uc131 \uac80\uc99d\uae30\ub97c \uc791\uc131\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. "class" \uc18d\uc131\uc744 \uc9c0\uc815\ud558\ub294 <run> \uc694\uc18c\uac00 \uc874\uc7ac\ud558\ub294 \uacbd\uc6b0\ub97c \uc81c\uc678\ud558\uace0\ub294 \uc720\ud6a8\uc131 \uac80\uc99d\uae30\ub97c \uc791\uc131\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. "class" \uc18d\uc131 \uac12\uc740 IWorkbenchHelper \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud558\ub294 \ud074\ub798\uc2a4\uc758 \uc774\ub984\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4.
-VBF_EXC_SYNTAX_NO_VAL_CLASS=IWAE0016E \uc720\ud6a8\uc131 \uac80\uc99d\uae30 {0}\uc758 plugin.xml \ud30c\uc77c \uc911 <run> \uc694\uc18c\uc5d0 \uc9c0\uc815\ub41c "class" \uc18d\uc131\uc774 \uc5c6\uc73c\ubbc0\ub85c \uc720\ud6a8\uc131 \uac80\uc99d\uae30\ub97c \uc791\uc131\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. "class" \uc18d\uc131\uc744 \uc9c0\uc815\ud558\ub294 <run> \uc694\uc18c\uac00 \uc874\uc7ac\ud558\ub294 \uacbd\uc6b0\ub97c \uc81c\uc678\ud558\uace0\ub294 \uc720\ud6a8\uc131 \uac80\uc99d\uae30\ub97c \uc791\uc131\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. "class" \uc18d\uc131 \uac12\uc740 IWorkbenchHelper \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud558\ub294 \ud074\ub798\uc2a4\uc758 \uc774\ub984\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4.
-VBF_EXC_SYNTAX_NO_VAL_THROWABLE=IWAE0017E Throwable\uc744 \ubc1c\uacac\ud588\uc73c\ubbc0\ub85c \uc720\ud6a8\uc131 \uac80\uc99d\uae30 {0}\uc744(\ub97c) \uc791\uc131\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
-VBF_EXC_SYNTAX_NO_VAL_NULL=IWAE0018E \uc720\ud6a8\uc131 \uac80\uc99d\uae30 \ud074\ub798\uc2a4 {0}\uc744(\ub97c) \uc791\uc131\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. IConfigurationElement.createExecutableExtension(String)\uc774 \ub110(null)\uc744 \ub9ac\ud134\ud588\uc2b5\ub2c8\ub2e4.
-
-VBF_EXC_DISABLEV=\uc720\ud6a8\uc131 \uac80\uc99d\uae30 {0}\uc744(\ub97c) \uc2e4\uc99d\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \uc720\ud6a8\uc131 \uac80\uc99d\uae30\ub97c \uc0ac\uc6a9 \uc548\ud568, \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 \ub85c\uadf8\ub97c \ucc38\uc870\ud558\uc2ed\uc2dc\uc624.
-VBF_EXC_DISABLEH=IWAE0020E {0} \ud5ec\ud37c\ub97c \uc2e4\uc99d\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. {1} \uc720\ud6a8\uc131 \uac80\uc99d\uae30 \uc0ac\uc6a9 \uc548\ud568, \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 \ub85c\uadf8\ub97c \ucc38\uc870\ud558\uc2ed\uc2dc\uc624.
-VBF_EXC_ORPHAN_IVALIDATOR=IWAE0021E \uc720\ud6a8\uc131 \uac80\uc99d\uae30 {0}\uc758 \uba54\ud0c0\ub370\uc774\ud130\ub97c \ucc3e\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
-
-VBF_EXC_VALIDATORNAME_IS_NULL=IWAE0022E getName() \uba54\uc18c\ub4dc\uac00 \ub110(null)\uc744 \ub9ac\ud134\ud558\ubbc0\ub85c {0} ID\uac00 \uc788\ub294 \ud50c\ub7ec\uadf8\uc778\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \uba54\uc18c\ub4dc\ub294 \uac12\uc744 \ub9ac\ud134\ud574\uc57c \ud569\ub2c8\ub2e4.
-
-VBF_EXC_NULLCREATE=IWAE0023E \ub110(null) \uc790\uc6d0\uc5d0 \ub300\ud55c \uc720\ud6a8\uc131 \uac80\uc99d \uad6c\uc131\uc744 \uc791\uc131\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
-VBF_EXC_NULLSAVE=IWAE0024E \ub110(null) \uc790\uc6d0\uc5d0\uc11c \uc720\ud6a8\uc131 \uac80\uc99d \uad6c\uc131\uc744 \uc800\uc7a5\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
-VBF_EXC_SAVE=IWAE0025E {0} \uc790\uc6d0\uc5d0 \ub300\ud55c \uc720\ud6a8\uc131 \uac80\uc99d \uad6c\uc131\uc744 \uc800\uc7a5\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
-VBF_EXC_NULLRETRIEVE=IWAE0026E \uc790\uc6d0\uc774 \ub110(null)\uc774\ubbc0\ub85c \uc720\ud6a8\uc131 \uac80\uc99d \uad6c\uc131\uc744 \uac80\uc0c9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
-VBF_EXC_RETRIEVE=IWAE0027E \uc790\uc6d0 {0}\uc758 \uc720\ud6a8\uc131 \uac80\uc99d \uad6c\uc131\uc744 \uac80\uc0c9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
-
-VBF_EXC_BADVMD=IWAE0028E ValidatorMetaData[]\ub294 \ub110(null)\uc774\uac70\ub098 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
-VBF_EXC_OPENPRJ=IWAE0029E {0} \ud504\ub85c\uc81d\ud2b8\ub97c \uc5f4\uc5b4\uc57c \ud569\ub2c8\ub2e4.
-VBF_EXC_EXISTPRJ=IWAE0030E {0} \ud504\ub85c\uc81d\ud2b8\uac00 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4.
-VBF_EXC_BADPRJ=IWAE0031E {0} \ud504\ub85c\uc81d\ud2b8\ub294 IResource[]\uc5d0 \uc790\uc6d0\uc744 \ud3ec\ud568\ud558\ub294 \ud504\ub85c\uc81d\ud2b8\uc5ec\uc57c \ud569\ub2c8\ub2e4.
-VBF_EXC_MULTIPRJ=IWAE0032E IResource[]\uc758 \ubaa8\ub4e0 IResource \uc778\uc2a4\ud134\uc2a4\ub294 \ub3d9\uc77c\ud55c IProject \uc778\uc2a4\ud134\uc2a4\uc758 \ud30c\ud2b8\uc5ec\uc57c \ud569\ub2c8\ub2e4. \uc790\uc6d0\uc740 \ub2e4\uc74c \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c \uc81c\uacf5\ub429\ub2c8\ub2e4: {0}.
-VBF_EXC_BADVAL=IWAE0033E {0} \uc720\ud6a8\uc131 \uac80\uc99d\uae30\ub294 {1}\uc5d0\uc11c \uad6c\uc131\ub418\uc5b4\uc57c \ud569\ub2c8\ub2e4.
-
-VBF_STATUS_INITIALIZING={0} \ucd08\uae30\ud654.
-
-VBF_STATUS_VALIDATOR_CLEANUP=\uc885\ub8cc\ud558\uae30 \uc804\uc5d0 {0} \uc5d0\uc11c \uc815\ub9ac \uc218\ud589.
-
-VBF_STATUS_PROGRESSMONITOR_TITLE=\uc720\ud6a8\uc131 \uac80\uc99d
-VBF_STATUS_NULL_DELTA={0}\uc758 \ucd5c\uc885 \ube4c\ub4dc \uc0c1\ud0dc\ub97c \uac80\uc0c9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \uc804\uccb4 \uc720\ud6a8\uc131 \uac80\uc99d \uc218\ud589.
-
-VBF_STATUS_VALIDATOR_TERMINATED={1}\uc744(\ub97c) \uc0ac\uc6a9\ud558\ub294 {0}\uc758 \uc720\ud6a8\uc131 \uac80\uc99d\uc774 \ucde8\uc18c\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-
-VBF_STATUS_START_REMOVING_OLD_MESSAGES={1}\uc5d0\uc11c {0} \uba54\uc2dc\uc9c0 \uc81c\uac70\uac00 \uc2dc\uc791\ub418\uc5c8\uc2b5\ub2c8\ub2e4...
-VBF_STATUS_FINISH_REMOVING_OLD_MESSAGES=\uba54\uc2dc\uc9c0\uac00 \uc81c\uac70\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-
-VBF_STATUS_STARTING_VALIDATION={1}\uc5d0 \uc758\ud55c {0}\uc758 \uc720\ud6a8\uc131 \uac80\uc99d\uc774 \uc2dc\uc791\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-VBF_STATUS_ENDING_VALIDATION={1}\uc5d0 \uc758\ud55c {0}\uc758 \uc720\ud6a8\uc131 \uac80\uc99d\uc774 \uc644\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc54c\ub824\uc9c4 \ubaa8\ub4e0 \ubb38\uc81c\uc810\uc774 \ubcf4\uace0\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-VBF_STATUS_ENDING_VALIDATION_ABNORMALLY={1}\uc5d0 \uc758\ud55c {0}\uc758 \uc720\ud6a8\uc131 \uac80\uc99d\uc774 \ube44\uc815\uc0c1\uc801\uc73c\ub85c \uc885\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ubb38\uc81c\uc810 \ubaa9\ub85d\uc774 \ubd88\uc644\uc804\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ube44\uc815\uc0c1 \uc885\ub8cc\uc758 \uc6d0\uc778\uc73c\ub85c \uc815\ubcf4 \uba54\uc2dc\uc9c0\ub97c \uac80\uc0ac\ud558\uc2ed\uc2dc\uc624.
-
-VBF_STATUS_LOOKING=\uc124\uce58 \uc81c\uac70\ub41c \uc720\ud6a8\uc131 \uac80\uc99d\uae30\uc5d0\uc11c \uc18c\uc720\ud558\ub294 \uc720\ud6a8\uc131 \uac80\uc99d \uba54\uc2dc\uc9c0 \ucc3e\uae30...
-VBF_STATUS_LOOKINGDONE=\uc124\uce58 \uc81c\uac70\ub41c \uc720\ud6a8\uc131 \uac80\uc99d\uae30\uc5d0\uc11c \uc18c\uc720\ud558\ub294 \uc720\ud6a8\uc131 \uac80\uc99d \uba54\uc2dc\uc9c0 \ucc3e\uae30... \uc644\ub8cc
-VBF_STATUS_REMOVING=\uc124\uce58 \uc81c\uac70\ub41c \uc720\ud6a8\uc131 \uac80\uc99d\uae30\uc5d0\uc11c \uc18c\uc720\ud558\ub294 \uc720\ud6a8\uc131 \uac80\uc99d \uba54\uc2dc\uc9c0 \uc81c\uac70...
-VBF_STATUS_REMOVINGDONE=\uc124\uce58 \uc81c\uac70\ub41c \uc720\ud6a8\uc131 \uac80\uc99d\uae30\uc5d0\uc11c \uc18c\uc720\ud558\ub294 \uc720\ud6a8\uc131 \uac80\uc99d \uba54\uc2dc\uc9c0 \uc81c\uac70... \uc644\ub8cc
-
-# The following message will be deleted soon.
-VBF_TASK_WARN_MESSAGE_LIMIT_ABORT=IWAE0034W IWAD3000I: \uba54\uc2dc\uc9c0\uc758 \ucd5c\ub300 \uc218\uac00 \ubcf4\uace0\ub418\uc5c8\uc73c\ubbc0\ub85c {1}\uc774(\uac00) {0}\uc758 \uc720\ud6a8\uc131 \uac80\uc99d\uc744 \uc885\ub8cc\ud588\uc2b5\ub2c8\ub2e4. \uc77c\ubd80 \uba54\uc2dc\uc9c0\uac00 \ub204\ub77d\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
-
-VBF_TASK_WARN_MESSAGE_LIMIT_VAL=IWAE0035W IWAD3000I: \uba54\uc2dc\uc9c0\uc758 \ucd5c\ub300 \uc218\uac00 \ubcf4\uace0\ub418\uc5c8\uc73c\ubbc0\ub85c \uc77c\ubd80 \uba54\uc2dc\uc9c0\uac00 \ub204\ub77d\ub418\uc5c8\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uba54\uc2dc\uc9c0\uc758 \ucd5c\ub300 \uc218\ub97c \uc99d\uac00\ud558\uace0 \ub2e4\uc2dc \uc2dc\ub3c4\ud558\uc2ed\uc2dc\uc624.
-
-#
-# End Validation Builder Framework Strings
-#
-
diff --git a/plugins/org.eclipse.wst.validation/property_files/validate_base_pt_BR.properties b/plugins/org.eclipse.wst.validation/property_files/validate_base_pt_BR.properties
deleted file mode 100644
index 8317d79..0000000
--- a/plugins/org.eclipse.wst.validation/property_files/validate_base_pt_BR.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 O marcador n\u00e3o pode ser inclu\u00eddo no recurso {0} na lista de tarefas.
-VBF_EXC_CANNOT_REMOVE_MARKER=IWAE0002E O marcador n\u00e3o pode ser removido do recurso {0} na lista de tarefas.
-
-VBF_EXC_HELPER_MISSING=IWAE0003E N\u00e3o \u00e9 poss\u00edvel carregar {0} porque ele n\u00e3o especificou um <auxiliar>. Cada validador deve identificar a classe de helpers que carrega o modelo MOF.
-VBF_EXC_HELPER_CANNOTLOAD=IWAE0004E N\u00e3o \u00e9 poss\u00edvel carregar {0} porque seu <auxiliar>, {1}, n\u00e3o p\u00f4de ser carregado. Certifique-se de que o nome do arquivo que faz distin\u00e7\u00e3o entre mai\u00fasculas e min\u00fasculas esteja escrito corretamente.
-
-VBF_EXC_INTERNAL=IWAE0005E Ocorreu um erro interno durante a valida\u00e7\u00e3o. A valida\u00e7\u00e3o estava sendo executada no projeto {0} com o validador {1}. A mensagem lan\u00e7ada foi {2}.
-
-# 2TC: In the following string, "type" is a noun
-VBF_EXC_INVALID_TYPE_FILTER=IWAE0006E Filtro de tipo inv\u00e1lido; {0} deve ser uma inst\u00e2ncia de {1}.
-VBF_EXC_INVALID_RESOURCE=IWAE0007E N\u00e3o \u00e9 poss\u00edvel incluir mensagem "{0}" com objeto de destino "{1}" porque nenhum arquivo, pasta ou projeto pode ser localizado ao qual a mensagem pode ser associada.
-
-VBF_EXC_MISSING_VALIDATOR_EP=IWAE0008E A estrutura do validador n\u00e3o p\u00f4de ser iniciada. N\u00e3o foi poss\u00edvel encontrar o ponto de extens\u00e3o denominado \"{0}\". Salve todos os arquivos de log e entre em contato com o representante IBM.
-VBF_EXC_MISSING_PROJECTNATURE_ID=IWAE0009E Um projectNature deve ter um ID associado. A valida\u00e7\u00e3o ignora esta tag e prossegue.
-
-VBF_EXC_RUNTIME=IWAE0010E Ocorreu uma exce\u00e7\u00e3o de tempo de execu\u00e7\u00e3o {0} durante a valida\u00e7\u00e3o. O validador que estava sendo executado era {1} e a mensagem lan\u00e7ada foi {2}.
-
-VBF_EXC_SYNTAX_NULL_NAME=IWAE0011E O recurso {0} n\u00e3o pode ser inclu\u00eddo na lista de arquivos porque o IHelper.getPortableName() retorna nulo. Este recurso n\u00e3o ser\u00e1 validado pelo validador nomeado {1}.
-VBF_EXC_SYNTAX_NO_HELPER=IWAE0012E Nenhum elemento <auxiliar> est\u00e1 especificado no arquivo plugin.xml para o validador {0}. Como o helper n\u00e3o pode ser criado, o validador n\u00e3o ser\u00e1 carregado.
-VBF_EXC_SYNTAX_NO_HELPER_CLASS=IWAE0013E Nenhum atributo de "classe" no elemento <helper> est\u00e1 especificado no arquivo plugin.xml para o validador {0}. O helper n\u00e3o pode ser criado sem o nome da classe que o implementa. Como o helper n\u00e3o pode ser criado, o validador n\u00e3o ser\u00e1 carregado.
-VBF_EXC_SYNTAX_NO_HELPER_THROWABLE=IWAE0014E O helper {0} n\u00e3o pode ser criado porque um Throwable foi capturado.
-VBF_EXC_SYNTAX_NO_VAL_RUN=IWAE0015E N\u00e3o \u00e9 poss\u00edvel criar o validador porque nenhum elemento <run> est\u00e1 especificado no arquivo plugin.xml para o validador denominado {0}. N\u00e3o \u00e9 poss\u00edvel criar um validador a menos que um elemento <run> existente especifique o atributo "class". O valor do atributo <class> deve ser o nome da classe que implementa a interface IWorkbenchHelper.
-VBF_EXC_SYNTAX_NO_VAL_CLASS=IWAE0016E N\u00e3o \u00e9 poss\u00edvel criar o validador porque nenhum atributo "classe" est\u00e1 especificado no elemento <run> do arquivo plugin.xml para o validador denominado {0}. N\u00e3o \u00e9 poss\u00edvel criar um validador a menos que um elemento <run> existente especifique o atributo "class". O valor do atributo <class> deve ser o nome da classe que implementa a interface IWorkbenchHelper.
-VBF_EXC_SYNTAX_NO_VAL_THROWABLE=IWAE0017E N\u00e3o \u00e9 poss\u00edvel criar o validador {0} porque um Throwable foi capturado.
-VBF_EXC_SYNTAX_NO_VAL_NULL=IWAE0018E N\u00e3o foi poss\u00edvel ser criada a classe de validador {0}. IConfigurationElement.createExecutableExtension(String) foi retornado nulo.
-
-VBF_EXC_DISABLEV=IWAE0019E N\u00e3o \u00e9 poss\u00edvel instanciar o validador {0}. Desativando o validador; leia o log para obter detalhes.
-VBF_EXC_DISABLEH=IWAE0020E N\u00e3o \u00e9 poss\u00edvel instanciar o helper {0}. Desativando o validador {1}; leia o log para obter detalhes.
-VBF_EXC_ORPHAN_IVALIDATOR=IWAE0021E N\u00e3o \u00e9 poss\u00edvel localizar metadados para o validador {0}.
-
-VBF_EXC_VALIDATORNAME_IS_NULL=IWAE0022E O plug-in com ID {0} foi desativado porque seu m\u00e9todo getName() retorna nulo. O m\u00e9todo deve retornar um valor.
-
-VBF_EXC_NULLCREATE=IWAE0023E N\u00e3o \u00e9 poss\u00edvel criar uma configura\u00e7\u00e3o de valida\u00e7\u00e3o sobre um recurso nulo.
-VBF_EXC_NULLSAVE=IWAE0024E N\u00e3o \u00e9 poss\u00edvel salvar uma configura\u00e7\u00e3o de valida\u00e7\u00e3o sobre um recurso nulo.
-VBF_EXC_SAVE=IWAE0025E N\u00e3o \u00e9 poss\u00edvel salvar a configura\u00e7\u00e3o de valida\u00e7\u00e3o sobre o recurso {0}.
-VBF_EXC_NULLRETRIEVE=IWAE0026E N\u00e3o \u00e9 poss\u00edvel recuperar a configura\u00e7\u00e3o de valida\u00e7\u00e3o porque o recurso \u00e9 nulo.
-VBF_EXC_RETRIEVE=IWAE0027E N\u00e3o foi poss\u00edvel recuperar a configura\u00e7\u00e3o de valida\u00e7\u00e3o para o recurso {0}.
-
-VBF_EXC_BADVMD=IWAE0028E ValidatorMetaData[] n\u00e3o deve ser nulo ou vazio.
-VBF_EXC_OPENPRJ=IWAE0029E O projeto {0} deve ser aberto.
-VBF_EXC_EXISTPRJ=IWAE0030E O projeto {0} deve existir.
-VBF_EXC_BADPRJ=IWAE0031E O projeto {0} deve ser o projeto que contenha os recursos no IResource[].
-VBF_EXC_MULTIPRJ=IWAE0032E Todas as inst\u00e2ncias de IResource no IResource[] devem fazer parte da mesma inst\u00e2ncia de IProject. Os recursos vem dos seguintes projetos: {0}.
-VBF_EXC_BADVAL=IWAE0033E O validador {0} deve ser configurado no {1};
-
-VBF_STATUS_INITIALIZING=Inicializando {0}.
-
-VBF_STATUS_VALIDATOR_CLEANUP=Executando limpeza no {0} antes da finaliza\u00e7\u00e3o.
-
-VBF_STATUS_PROGRESSMONITOR_TITLE=Validando
-VBF_STATUS_NULL_DELTA=O estado da \u00faltima gera\u00e7\u00e3o de {0} n\u00e3o p\u00f4de ser recuperado. Executando uma valida\u00e7\u00e3o completa.
-
-VBF_STATUS_VALIDATOR_TERMINATED=A valida\u00e7\u00e3o de {0} utilizando {1} foi cancelada.
-
-VBF_STATUS_START_REMOVING_OLD_MESSAGES=Remo\u00e7\u00e3o de mensagens {0} em {1} foi iniciada...
-VBF_STATUS_FINISH_REMOVING_OLD_MESSAGES=Mensagens removidas.
-
-VBF_STATUS_STARTING_VALIDATION=A valida\u00e7\u00e3o de {0} por {1} foi iniciada...
-VBF_STATUS_ENDING_VALIDATION=A valida\u00e7\u00e3o de {0} por {1} foi conclu\u00edda. Todos os problemas conhecidos foram relatados.
-VBF_STATUS_ENDING_VALIDATION_ABNORMALLY=A valida\u00e7\u00e3o de {0} por {1} foi finalizada de forma anormal. A lista de problemas pode estar incompleta. Verifique a causa da finaliza\u00e7\u00e3o anormal nas mensagens de informa\u00e7\u00f5es.
-
-VBF_STATUS_LOOKING=Procurando as mensagens de valida\u00e7\u00e3o possu\u00eddas por validadores desinstalados...
-VBF_STATUS_LOOKINGDONE=Procurando as mensagens de valida\u00e7\u00e3o possu\u00eddas por validadores desinstalados... conclu\u00eddo.
-VBF_STATUS_REMOVING=Removendo as mensagens de valida\u00e7\u00e3o possu\u00eddas por validadores desinstalados...
-VBF_STATUS_REMOVINGDONE=Removendo as mensagens de valida\u00e7\u00e3o possu\u00eddas por validadores desinstalados... conclu\u00eddo.
-
-# The following message will be deleted soon.
-VBF_TASK_WARN_MESSAGE_LIMIT_ABORT=IWAE0034W IWAD3000I: {1} finalizou a valida\u00e7\u00e3o de {0} porque o n\u00famero m\u00e1ximo de mensagens foi reportado. Algumas mensagens podem ter sido perdidas.
-
-VBF_TASK_WARN_MESSAGE_LIMIT_VAL=IWAE0035W IWAD3000I: Algumas mensagens podem estar faltando porque o n\u00famero m\u00e1ximo de mensagens foi reportado. Aumente o n\u00famero m\u00e1ximo de mensagens e tente novamente.
-
-#
-# End Validation Builder Framework Strings
-#
-
diff --git a/plugins/org.eclipse.wst.validation/property_files/validate_base_zh_CN.properties b/plugins/org.eclipse.wst.validation/property_files/validate_base_zh_CN.properties
deleted file mode 100644
index 8d1f60a..0000000
--- a/plugins/org.eclipse.wst.validation/property_files/validate_base_zh_CN.properties
+++ /dev/null
@@ -1,138 +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 \u4e0d\u80fd\u5c06\u8be5\u6807\u8bb0\u6dfb\u52a0\u81f3\u4efb\u52a1\u5217\u8868\u4e2d\u7684\u8d44\u6e90 {0}\u3002
-VBF_EXC_CANNOT_REMOVE_MARKER=IWAE0002E \u4e0d\u80fd\u4ece\u4efb\u52a1\u5217\u8868\u4e2d\u7684\u8d44\u6e90 {0} \u9664\u53bb\u8be5\u6807\u8bb0\u3002
-
-VBF_EXC_HELPER_MISSING=IWAE0003E \u65e0\u6cd5\u88c5\u5165 {0}\uff0c\u56e0\u4e3a\u5b83\u672a\u6307\u5b9a <helper>\u3002\u6bcf\u4e2a\u9a8c\u8bc1\u5668\u90fd\u5fc5\u987b\u6807\u8bc6\u88c5\u5165\u5176 MOF \u6a21\u578b\u7684 helper \u7c7b\u3002
-VBF_EXC_HELPER_CANNOTLOAD=IWAE0004E \u65e0\u6cd5\u88c5\u5165 {0}\uff0c\u56e0\u4e3a\u65e0\u6cd5\u88c5\u5165\u5176 <helper> {1}\u3002\u786e\u4fdd\u533a\u5206\u5927\u5c0f\u5199\u7684\u6587\u4ef6\u540d\u62fc\u5199\u6b63\u786e\u3002
-
-VBF_EXC_INTERNAL=IWAE0005E \u9a8c\u8bc1\u671f\u95f4\u53d1\u751f\u4e86\u5185\u90e8\u9519\u8bef\u3002\u6b63\u4f7f\u7528\u9a8c\u8bc1\u5668 {1} \u5728\u9879\u76ee {0} \u4e0a\u8fd0\u884c\u9a8c\u8bc1\u3002\u629b\u51fa\u7684\u6d88\u606f\u4e3a {2}\u3002
-# 2TC: In the following string, "type" is a noun
-VBF_EXC_INVALID_TYPE_FILTER=IWAE0006E \u65e0\u6548\u7684\u7c7b\u578b\u8fc7\u6ee4\u5668\uff1b{0} \u5fc5\u987b\u662f {1} \u7684\u5b9e\u4f8b\u3002
-VBF_EXC_INVALID_RESOURCE=IWAE0007E \u4e0d\u80fd\u4f7f\u7528\u76ee\u6807\u5bf9\u8c61\u201c{1}\u201d\u6dfb\u52a0\u6d88\u606f\u201c{0}\u201d\uff0c\u56e0\u4e3a\u627e\u4e0d\u5230\u4e0e\u8be5\u6d88\u606f\u76f8\u5173\u8054\u7684\u6587\u4ef6\u3001\u6587\u4ef6\u5939\u6216\u9879\u76ee\u3002
-
-VBF_EXC_MISSING_VALIDATOR_EP=IWAE0008E \u672a\u80fd\u542f\u52a8\u9a8c\u8bc1\u5668\u6846\u67b6\u3002\u627e\u4e0d\u5230\u540d\u4e3a\u201c{0}\u201d\u7684\u6269\u5c55\u70b9\u3002\u8bf7\u4fdd\u5b58\u6240\u6709\u65e5\u5fd7\u6587\u4ef6\u5e76\u4e0e IBM \u4ee3\u8868\u8054\u7cfb\u3002
-VBF_EXC_MISSING_PROJECTNATURE_ID=IWAE0009E projectNature \u5fc5\u987b\u5177\u6709\u76f8\u5173\u8054\u7684\u6807\u8bc6\u3002\u9a8c\u8bc1\u5ffd\u7565\u6b64\u6807\u8bb0\u5e76\u7ee7\u7eed\u6267\u884c\u3002
-
-VBF_EXC_RUNTIME=IWAE0010E \u9a8c\u8bc1\u671f\u95f4\u53d1\u751f\u8fd0\u884c\u65f6\u5f02\u5e38 {0}\u3002\u6b63\u5728\u8fd0\u884c\u7684\u9a8c\u8bc1\u5668\u662f {1}\uff0c\u629b\u51fa\u7684\u6d88\u606f\u662f {2}\u3002
-
-VBF_EXC_SYNTAX_NULL_NAME=IWAE0011E \u4e0d\u80fd\u5c06\u8d44\u6e90 {0} \u6dfb\u52a0\u81f3\u6587\u4ef6\u5217\u8868\uff0c\u56e0\u4e3a IHelper.getPortableName() \u8fd4\u56de null\u3002\u540d\u4e3a {1} \u7684\u9a8c\u8bc1\u5668\u5c06\u4e0d\u4f1a\u9a8c\u8bc1\u6b64\u8d44\u6e90\u3002
-VBF_EXC_SYNTAX_NO_HELPER=IWAE0012E \u5bf9\u4e8e\u9a8c\u8bc1\u5668 {0}\uff0cplugin.xml \u6587\u4ef6\u4e2d\u672a\u6307\u5b9a <helper> \u5143\u7d20\u3002\u7531\u4e8e\u4e0d\u80fd\u521b\u5efa helper\uff0c\u6240\u4ee5\u5c06\u4e0d\u4f1a\u88c5\u5165\u9a8c\u8bc1\u5668\u3002
-VBF_EXC_SYNTAX_NO_HELPER_CLASS=IWAE0013E \u5bf9\u4e8e\u9a8c\u8bc1\u5668 {0}\uff0cplugin.xml \u6587\u4ef6\u4e2d\u672a\u6307\u5b9a <helper> \u5143\u7d20\u4e2d\u7684\u201cclass\u201d\u5c5e\u6027\u3002\u6ca1\u6709\u5b9e\u73b0 helper \u7684\u7c7b\u7684\u540d\u79f0\uff0c\u5c31\u65e0\u6cd5\u521b\u5efa\u8be5 helper\u3002\u7531\u4e8e\u4e0d\u80fd\u521b\u5efa helper\uff0c\u6240\u4ee5\u5c06\u4e0d\u4f1a\u88c5\u5165\u9a8c\u8bc1\u5668\u3002
-VBF_EXC_SYNTAX_NO_HELPER_THROWABLE=IWAE0014E \u4e0d\u80fd\u521b\u5efa helper {0}\uff0c\u56e0\u4e3a\u6355\u83b7\u5230\u201c\u53ef\u629b\u51fa\u201d\u5f02\u5e38\u3002
-VBF_EXC_SYNTAX_NO_VAL_RUN=IWAE0015E \u4e0d\u80fd\u521b\u5efa\u9a8c\u8bc1\u5668\uff0c\u56e0\u4e3a\u5bf9\u4e8e\u540d\u4e3a\u201c{0}\u201d\u7684\u9a8c\u8bc1\u5668\uff0cplugin.xml \u6587\u4ef6\u4e2d\u672a\u6307\u5b9a\u4efb\u4f55 <run> \u5143\u7d20\u3002\u4e0d\u80fd\u521b\u5efa\u9a8c\u8bc1\u5668\uff0c\u9664\u975e\u6307\u5b9a\u201cclass\u201d\u5c5e\u6027\u7684 <run> \u5143\u7d20\u5b58\u5728\u3002\u201cclass\u201d\u5c5e\u6027\u7684\u503c\u5e94\u662f\u5b9e\u73b0 IWorkbenchHelper \u63a5\u53e3\u7684\u7c7b\u7684\u540d\u79f0\u3002
-VBF_EXC_SYNTAX_NO_VAL_CLASS=IWAE0016E \u4e0d\u80fd\u521b\u5efa\u9a8c\u8bc1\u5668\uff0c\u56e0\u4e3a\u5bf9\u4e8e\u540d\u4e3a {0} \u7684\u9a8c\u8bc1\u5668\uff0cplugin.xml \u6587\u4ef6\u7684 <run> \u5143\u7d20\u4e2d\u672a\u6307\u5b9a\u4efb\u4f55\u201cclass\u201d\u5c5e\u6027\u3002\u4e0d\u80fd\u521b\u5efa\u9a8c\u8bc1\u5668\uff0c\u9664\u975e\u6307\u5b9a\u201cclass\u201d\u5c5e\u6027\u7684 <run> \u5143\u7d20\u5b58\u5728\u3002\u201cclass\u201d\u5c5e\u6027\u7684\u503c\u5e94\u662f\u5b9e\u73b0 IWorkbenchHelper \u63a5\u53e3\u7684\u7c7b\u7684\u540d\u79f0\u3002
-VBF_EXC_SYNTAX_NO_VAL_THROWABLE=IWAE0017E \u4e0d\u80fd\u521b\u5efa\u9a8c\u8bc1\u5668 {0}\uff0c\u56e0\u4e3a\u6355\u83b7\u5230\u201c\u53ef\u629b\u51fa\u201d\u5f02\u5e38\u3002
-VBF_EXC_SYNTAX_NO_VAL_NULL=IWAE0018E \u65e0\u6cd5\u521b\u5efa\u9a8c\u8bc1\u5668\u7c7b {0}\u3002IConfigurationElement.createExecutableExtension(String) \u8fd4\u56de null\u3002
-
-VBF_EXC_DISABLEV=IWAE0019E \u65e0\u6cd5\u5b9e\u4f8b\u5316\u9a8c\u8bc1\u5668 {0}\u3002\u7981\u7528\u9a8c\u8bc1\u5668\uff0c\u8bf7\u9605\u8bfb\u65e5\u5fd7\u4e86\u89e3\u8be6\u7ec6\u4fe1\u606f\u3002
-VBF_EXC_DISABLEH=IWAE0020E \u65e0\u6cd5\u5b9e\u4f8b\u5316 helper {0}\u3002\u7981\u7528\u9a8c\u8bc1\u5668 {1}\uff0c\u8bf7\u9605\u8bfb\u65e5\u5fd7\u4e86\u89e3\u8be6\u7ec6\u4fe1\u606f\u3002
-VBF_EXC_ORPHAN_IVALIDATOR=IWAE0021E \u65e0\u6cd5\u627e\u5230\u9a8c\u8bc1\u5668 {0} \u7684\u5143\u6570\u636e\u3002
-
-VBF_EXC_VALIDATORNAME_IS_NULL=IWAE0022E \u6807\u8bc6\u4e3a {0} \u7684\u63d2\u4ef6\u5df2\u7981\u7528\uff0c\u56e0\u4e3a\u5b83\u7684 getName() \u65b9\u6cd5\u8fd4\u56de null\u3002\u8be5\u65b9\u6cd5\u5fc5\u987b\u8fd4\u56de\u4e00\u4e2a\u503c\u3002
-
-VBF_EXC_NULLCREATE=IWAE0023E \u4e0d\u80fd\u5728\u7a7a\u8d44\u6e90\u4e0a\u521b\u5efa\u9a8c\u8bc1\u914d\u7f6e\u3002
-VBF_EXC_NULLSAVE=IWAE0024E \u4e0d\u80fd\u5728\u7a7a\u8d44\u6e90\u4e0a\u4fdd\u5b58\u9a8c\u8bc1\u914d\u7f6e\u3002
-VBF_EXC_SAVE=IWAE0025E \u4e0d\u80fd\u5728\u8d44\u6e90 {0} \u4e0a\u4fdd\u5b58\u9a8c\u8bc1\u914d\u7f6e\u3002
-VBF_EXC_NULLRETRIEVE=IWAE0026E \u56e0\u4e3a\u8d44\u6e90\u4e3a\u7a7a\uff0c\u6240\u4ee5\u4e0d\u80fd\u68c0\u7d22\u9a8c\u8bc1\u914d\u7f6e\u3002
-VBF_EXC_RETRIEVE=IWAE0027E \u4e0d\u80fd\u68c0\u7d22\u8d44\u6e90 {0} \u7684\u9a8c\u8bc1\u914d\u7f6e\u3002
-
-VBF_EXC_BADVMD=IWAE0028E ValidatorMetaData[] \u4e00\u5b9a\u4e0d\u80fd\u4e3a\u7a7a\u6216\u662f\u7a7a\u767d\u3002
-VBF_EXC_OPENPRJ=IWAE0029E \u5fc5\u987b\u6253\u5f00\u9879\u76ee {0}\u3002
-VBF_EXC_EXISTPRJ=IWAE0030E \u9879\u76ee {0} \u5fc5\u987b\u5b58\u5728\u3002
-VBF_EXC_BADPRJ=IWAE0031E \u9879\u76ee {0} \u5fc5\u987b\u662f\u5305\u542b IResource[] \u4e2d\u7684\u8d44\u6e90\u7684\u9879\u76ee\u3002
-VBF_EXC_MULTIPRJ=IWAE0032E IResource[] \u4e2d\u7684\u6240\u6709 IResource \u5b9e\u4f8b\u5fc5\u987b\u662f\u540c\u4e00 IProject \u5b9e\u4f8b\u7684\u4e00\u90e8\u5206\u3002\u8d44\u6e90\u6765\u81ea\u4e0b\u5217\u9879\u76ee\uff1a{0}\u3002
-VBF_EXC_BADVAL=IWAE0033E \u5fc5\u987b\u5728 {1} \u4e0a\u914d\u7f6e\u9a8c\u8bc1\u5668 {0}\uff1b
-
-VBF_STATUS_INITIALIZING=\u521d\u59cb\u5316 {0}\u3002
-
-VBF_STATUS_VALIDATOR_CLEANUP=\u5728\u7ec8\u6b62\u4e4b\u524d\u5bf9 {0} \u6267\u884c\u6e05\u9664\u3002
-
-VBF_STATUS_PROGRESSMONITOR_TITLE=\u6b63\u5728\u9a8c\u8bc1
-VBF_STATUS_NULL_DELTA=\u672a\u80fd\u68c0\u7d22\u5230 {0} \u7684\u4e0a\u4e00\u6b21\u6784\u5efa\u72b6\u6001\u3002\u8bf7\u6267\u884c\u5b8c\u5168\u9a8c\u8bc1\u3002
-
-VBF_STATUS_VALIDATOR_TERMINATED=\u53d6\u6d88\u4f7f\u7528 {1} \u6765\u8fdb\u884c\u9a8c\u8bc1 {0}\u3002
-
-VBF_STATUS_START_REMOVING_OLD_MESSAGES=\u5df2\u5f00\u59cb\u5728 {1} \u4e0a\u9664\u53bb {0} \u6d88\u606f...
-VBF_STATUS_FINISH_REMOVING_OLD_MESSAGES=\u6d88\u606f\u5df2\u9664\u53bb\u3002
-
-VBF_STATUS_STARTING_VALIDATION=\u5df2\u5f00\u59cb\u901a\u8fc7 {1} \u5bf9 {0} \u8fdb\u884c\u9a8c\u8bc1...
-VBF_STATUS_ENDING_VALIDATION=\u901a\u8fc7 {1} \u5bf9 {0} \u7684\u9a8c\u8bc1\u5df2\u5b8c\u6210\u3002\u5df2\u62a5\u544a\u6240\u6709\u5df2\u77e5\u95ee\u9898\u3002
-VBF_STATUS_ENDING_VALIDATION_ABNORMALLY=\u901a\u8fc7 {1} \u5bf9 {0} \u7684\u9a8c\u8bc1\u5df2\u5f02\u5e38\u7ed3\u675f\u3002\u95ee\u9898\u7684\u5217\u8868\u53ef\u80fd\u4e0d\u5b8c\u6574\u3002\u8bf7\u68c0\u67e5\u53c2\u8003\u6d88\u606f\uff0c\u4ee5\u4e86\u89e3\u5f02\u5e38\u7ec8\u6b62\u7684\u539f\u56e0\u3002
-
-VBF_STATUS_LOOKING=\u6b63\u5728\u67e5\u627e\u5df2\u5378\u8f7d\u7684\u9a8c\u8bc1\u5668\u62e5\u6709\u7684\u9a8c\u8bc1\u6d88\u606f...
-VBF_STATUS_LOOKINGDONE=\u67e5\u627e\u5df2\u5378\u8f7d\u7684\u9a8c\u8bc1\u5668\u62e5\u6709\u7684\u9a8c\u8bc1\u6d88\u606f...\u5b8c\u6bd5\u3002
-VBF_STATUS_REMOVING=\u6b63\u5728\u9664\u53bb\u5df2\u5378\u8f7d\u7684\u9a8c\u8bc1\u5668\u62e5\u6709\u7684\u9a8c\u8bc1\u6d88\u606f...
-VBF_STATUS_REMOVINGDONE=\u9664\u53bb\u5df2\u5378\u8f7d\u7684\u9a8c\u8bc1\u5668\u62e5\u6709\u7684\u9a8c\u8bc1\u6d88\u606f...\u5b8c\u6bd5\u3002
-
-# The following message will be deleted soon.
-VBF_TASK_WARN_MESSAGE_LIMIT_ABORT=IWAE0034W IWAD3000I\uff1a{1} \u7ec8\u6b62\u4e86\u5bf9 {0} \u7684\u9a8c\u8bc1\uff0c\u539f\u56e0\u662f\u5df2\u62a5\u544a\u6700\u5927\u6570\u76ee\u7684\u6d88\u606f\u3002\u53ef\u80fd\u4e22\u5931\u4e86\u4e00\u4e9b\u6d88\u606f\u3002
-
-VBF_TASK_WARN_MESSAGE_LIMIT_VAL=IWAE0035W IWAD3000I\uff1a\u7531\u4e8e\u5df2\u62a5\u544a\u4e86\u6700\u5927\u6570\u76ee\u7684\u6d88\u606f\uff0c\u56e0\u6b64\u67d0\u4e9b\u6d88\u606f\u53ef\u80fd\u4e22\u5931\u3002\u589e\u52a0\u6d88\u606f\u7684\u6700\u5927\u6570\u76ee\u5e76\u91cd\u8bd5\u3002
-
-#
-# End Validation Builder Framework Strings
-#
-
diff --git a/plugins/org.eclipse.wst.validation/property_files/validate_base_zh_TW.properties b/plugins/org.eclipse.wst.validation/property_files/validate_base_zh_TW.properties
deleted file mode 100644
index 2ebe0d5..0000000
--- a/plugins/org.eclipse.wst.validation/property_files/validate_base_zh_TW.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 \u7121\u6cd5\u5c07\u6a19\u8a18\u65b0\u589e\u81f3\u4f5c\u696d\u6e05\u55ae\u4e2d\u7684 {0} \u8cc7\u6e90\u3002
-VBF_EXC_CANNOT_REMOVE_MARKER=IWAE0002E \u7121\u6cd5\u5f9e\u4f5c\u696d\u6e05\u55ae\u4e2d\u7684 {0} \u8cc7\u6e90\u79fb\u9664\u6a19\u8a18\u3002
-
-VBF_EXC_HELPER_MISSING=IWAE0003E \u7121\u6cd5\u8f09\u5165 {0}\uff0c\u56e0\u70ba\u5b83\u6c92\u6709\u6307\u5b9a <helper>\u3002\u9a57\u8b49\u5668\u5fc5\u9808\u8b58\u5225\u8f09\u5165\u5176 MOF \u6a21\u578b\u7684 Helper \u985e\u5225\u3002
-VBF_EXC_HELPER_CANNOTLOAD=IWAE0004E \u7121\u6cd5\u8f09\u5165 {0}\uff0c\u56e0\u70ba\u7121\u6cd5\u8f09\u5165\u5b83\u7684 <helper> {1}\u3002\u78ba\u5b9a\u6709\u6b63\u78ba\u62fc\u51fa\u6709\u5340\u5206\u5927\u5c0f\u5beb\u7684\u6a94\u540d\u3002
-
-VBF_EXC_INTERNAL=IWAE0005E \u9a57\u8b49\u671f\u9593\u767c\u751f\u5167\u90e8\u932f\u8aa4\u3002\u5df2\u5728\u542b\u6709 {1} \u9a57\u8b49\u5668\u7684 {0} \u5c08\u6848\u57f7\u884c\u9a57\u8b49\u3002\u64f2\u51fa\u7684\u8a0a\u606f\u662f {2}\u3002
-
-# 2TC: In the following string, "type" is a noun
-VBF_EXC_INVALID_TYPE_FILTER=IWAE0006E \u985e\u578b\u904e\u6ffe\u5668\u7121\u6548\uff1b{0} \u5fc5\u9808\u662f {1} \u7684\u5be6\u4f8b\u3002
-VBF_EXC_INVALID_RESOURCE=IWAE0007E \u7121\u6cd5\u65b0\u589e\u542b\u76ee\u6a19\u7269\u4ef6 "{1}" \u7684 "{0}" \u8a0a\u606f\uff0c\u56e0\u70ba\u627e\u4e0d\u5230\u8981\u8207\u8a0a\u606f\u7522\u751f\u95dc\u806f\u7684\u6a94\u6848\u3001\u8cc7\u6599\u593e\u6216\u5c08\u6848\u3002
-
-VBF_EXC_MISSING_VALIDATOR_EP=IWAE0008E \u7121\u6cd5\u555f\u52d5\u9a57\u8b49\u5668\u67b6\u69cb\u3002\u627e\u4e0d\u5230\u540d\u7a31\u70ba \"{0}\" \u7684\u5ef6\u4f38\u9ede\u3002\u5132\u5b58\u6240\u6709\u65e5\u8a8c\u6a94\u4e26\u806f\u7d61 IBM \u696d\u52d9\u4ee3\u8868\u3002
-VBF_EXC_MISSING_PROJECTNATURE_ID=IWAE0009E projectNature \u5fc5\u9808\u6709\u76f8\u95dc\u806f\u7684 ID\u3002\u9a57\u8b49\u7a0b\u5e8f\u6b63\u5728\u5ffd\u7565\u9019\u500b\u6a19\u793a\uff0c\u4e26\u7e7c\u7e8c\u4f5c\u696d\u3002
-
-VBF_EXC_RUNTIME=IWAE0010E \u5728\u9a57\u8b49\u671f\u9593\u767c\u751f\u57f7\u884c\u6642\u671f\u7570\u5e38\u72c0\u6cc1 {0}\u3002\u88ab\u57f7\u884c\u7684\u9a57\u8b49\u5668\u662f {1}\uff0c\u64f2\u51fa\u7684\u8a0a\u606f\u662f {2}\u3002
-
-VBF_EXC_SYNTAX_NULL_NAME=IWAE0011E \u7121\u6cd5\u65b0\u589e\u8cc7\u6e90 {0} \u5230\u6a94\u6848\u6e05\u55ae\uff0c\u56e0\u70ba IHelper.getPortableName() \u50b3\u56de\u7a7a\u503c\u3002{1} \u9a57\u8b49\u5668\u5c07\u4e0d\u9a57\u8b49\u9019\u9805\u8cc7\u6e90\u3002
-VBF_EXC_SYNTAX_NO_HELPER=IWAE0012E \u5728 plugin.xml \u6a94\u4e2d\u6c92\u6709\u6307\u5b9a {0} \u9a57\u8b49\u5668\u7684 <helper> \u5143\u7d20\u3002\u56e0\u70ba\u7121\u6cd5\u5efa\u7acb Helper\uff0c\u6240\u4ee5\u4e0d\u6703\u8f09\u5165\u9a57\u8b49\u5668\u3002
-VBF_EXC_SYNTAX_NO_HELPER_CLASS=IWAE0013E \u5728 plugin.xml \u6a94\u7684 <helper> \u5143\u7d20\u4e2d\u6c92\u6709\u6307\u5b9a {0} \u9a57\u8b49\u5668\u7684 "class" \u5c6c\u6027\u3002\u7f3a\u5c11\u57f7\u884c\u7684\u985e\u5225\u540d\u7a31\uff0c\u6240\u4ee5\u7121\u6cd5\u5efa\u7acb Helper\u3002\u56e0\u70ba\u7121\u6cd5\u5efa\u7acb Helper\uff0c\u6240\u4ee5\u4e0d\u6703\u8f09\u5165\u9a57\u8b49\u5668\u3002
-VBF_EXC_SYNTAX_NO_HELPER_THROWABLE=IWAE0014E \u7121\u6cd5\u5efa\u7acb Helper {0}\uff0c\u56e0\u70ba\u6355\u6349\u5230 Throwable\u3002
-VBF_EXC_SYNTAX_NO_VAL_RUN=IWAE0015E \u7121\u6cd5\u5efa\u7acb\u9a57\u8b49\u5668\uff0c\u56e0\u70ba\u5728 plugin.xml \u6a94\u4e2d\u6c92\u6709\u6307\u5b9a {0} \u9a57\u8b49\u5668\u7684 <run> \u5143\u7d20\u3002\u9664\u975e\u6307\u5b9a "class" \u5c6c\u6027\u7684 <run> \u5143\u7d20\u5b58\u5728\uff0c\u5426\u5247\u7121\u6cd5\u5efa\u7acb\u9a57\u8b49\u5668\u3002"class" \u5c6c\u6027\u7684\u503c\u61c9\u8a72\u662f\u57f7\u884c IWorkbenchHelper \u4ecb\u9762\u7684\u985e\u5225\u540d\u7a31\u3002
-VBF_EXC_SYNTAX_NO_VAL_CLASS=IWAE0016E \u7121\u6cd5\u5efa\u7acb\u9a57\u8b49\u5668\uff0c\u56e0\u70ba\u5728 plugin.xml \u6a94\u7684 <run> \u5143\u7d20\u4e2d\u6c92\u6709\u6307\u5b9a {0} \u9a57\u8b49\u5668\u7684 "class" \u5c6c\u6027\u3002\u9664\u975e\u6307\u5b9a "class" \u5c6c\u6027\u7684 <run> \u5143\u7d20\u5b58\u5728\uff0c\u5426\u5247\u7121\u6cd5\u5efa\u7acb\u9a57\u8b49\u5668\u3002"class" \u5c6c\u6027\u7684\u503c\u61c9\u8a72\u662f\u57f7\u884c IWorkbenchHelper \u4ecb\u9762\u7684\u985e\u5225\u540d\u7a31\u3002
-VBF_EXC_SYNTAX_NO_VAL_THROWABLE=IWAE0017E \u7121\u6cd5\u5efa\u7acb {0} \u9a57\u8b49\u5668\uff0c\u56e0\u70ba\u6355\u6349\u5230 Throwable\u3002
-VBF_EXC_SYNTAX_NO_VAL_NULL=IWAE0018E \u7121\u6cd5\u5efa\u7acb\u9a57\u8b49\u5668\u985e\u5225 {0}\u3002IConfigurationElement.createExecutableExtension(String) \u50b3\u56de\u7a7a\u503c\u3002
-
-VBF_EXC_DISABLEV=IWAE0019E \u7121\u6cd5\u5efa\u7acb {0} \u9a57\u8b49\u5668\u7684\u5be6\u4f8b\u3002\u505c\u7528\u9a57\u8b49\u5668\uff1b\u8acb\u95b1\u8b80\u65e5\u8a8c\u4ee5\u53d6\u5f97\u8a73\u7d30\u8cc7\u6599\u3002
-VBF_EXC_DISABLEH=IWAE0020E \u7121\u6cd5\u5efa\u7acb Helper {0} \u7684\u5be6\u4f8b\u3002\u505c\u7528 {1} \u9a57\u8b49\u5668\uff1b\u8acb\u95b1\u8b80\u65e5\u8a8c\u4ee5\u53d6\u5f97\u8a73\u7d30\u8cc7\u6599\u3002
-VBF_EXC_ORPHAN_IVALIDATOR=IWAE0021E \u627e\u4e0d\u5230 {0} \u9a57\u8b49\u5668\u7684 Meta \u8cc7\u6599\u3002
-
-VBF_EXC_VALIDATORNAME_IS_NULL=IWAE0022E \u5df2\u505c\u7528 ID \u70ba {0} \u7684\u5916\u639b\u7a0b\u5f0f\uff0c\u56e0\u70ba\u5b83\u7684 getName() \u65b9\u6cd5\u50b3\u56de\u7a7a\u503c\u3002\u65b9\u6cd5\u5fc5\u9808\u50b3\u56de\u4e00\u503c\u3002
-
-VBF_EXC_NULLCREATE=IWAE0023E \u7121\u6cd5\u5efa\u7acb\u7a7a\u503c\u8cc7\u6e90\u7684\u9a57\u8b49\u914d\u7f6e\u3002
-VBF_EXC_NULLSAVE=IWAE0024E \u7121\u6cd5\u5132\u5b58\u7a7a\u503c\u8cc7\u6e90\u7684\u9a57\u8b49\u914d\u7f6e\u3002
-VBF_EXC_SAVE=IWAE0025E \u7121\u6cd5\u5132\u5b58 {0} \u8cc7\u6e90\u7684\u9a57\u8b49\u914d\u7f6e\u3002
-VBF_EXC_NULLRETRIEVE=IWAE0026E \u7121\u6cd5\u64f7\u53d6\u9a57\u8b49\u914d\u7f6e\uff0c\u56e0\u70ba\u8cc7\u6e90\u662f\u7a7a\u503c\u3002
-VBF_EXC_RETRIEVE=IWAE0027E \u7121\u6cd5\u64f7\u53d6 {0} \u8cc7\u6e90\u7684\u9a57\u8b49\u914d\u7f6e\u3002
-
-VBF_EXC_BADVMD=IWAE0028E ValidatorMetaData[] \u4e0d\u80fd\u662f\u7a7a\u503c\u6216\u662f\u7a7a\u7684\u3002
-VBF_EXC_OPENPRJ=IWAE0029E \u5fc5\u9808\u958b\u555f {0} \u5c08\u6848\u3002
-VBF_EXC_EXISTPRJ=IWAE0030E {0} \u5c08\u6848\u5fc5\u9808\u5b58\u5728\u3002
-VBF_EXC_BADPRJ=IWAE0031E {0} \u5c08\u6848\u5fc5\u9808\u662f\u542b\u6709 IResource[] \u4e2d\u4e4b\u8cc7\u6e90\u7684\u5c08\u6848\u3002
-VBF_EXC_MULTIPRJ=IWAE0032E IResource[] \u4e2d\u7684\u6240\u6709 IResource \u5be6\u4f8b\u90fd\u5fc5\u9808\u662f\u76f8\u540c IProject \u5be6\u4f8b\u7684\u4e00\u90e8\u5206\u3002\u8cc7\u6e90\u4f86\u81ea\u4e0b\u5217\u5c08\u6848\uff1a{0}\u3002
-VBF_EXC_BADVAL=IWAE0033E \u5fc5\u9808\u5728 {1} \u914d\u7f6e {0} \u9a57\u8b49\u5668\uff1b
-
-VBF_STATUS_INITIALIZING=\u6b63\u5728\u8d77\u59cb\u8a2d\u5b9a {0}\u3002
-
-VBF_STATUS_VALIDATOR_CLEANUP=\u5728\u7d42\u6b62\u4e4b\u524d\uff0c\u6b63\u5728\u57f7\u884c {0} \u4e0a\u7684\u6e05\u9664\u4f5c\u696d\u3002
-
-VBF_STATUS_PROGRESSMONITOR_TITLE=\u6b63\u5728\u9a57\u8b49
-VBF_STATUS_NULL_DELTA=\u7121\u6cd5\u64f7\u53d6\u524d\u6b21\u5efa\u7f6e\u72c0\u614b {0}\u3002\u6b63\u5728\u57f7\u884c\u5b8c\u6574\u7684\u9a57\u8b49\u3002
-
-VBF_STATUS_VALIDATOR_TERMINATED=\u5df2\u53d6\u6d88\u4f7f\u7528 {1} \u5c0d {0} \u7684\u9a57\u8b49\u7a0b\u5e8f\u3002
-
-VBF_STATUS_START_REMOVING_OLD_MESSAGES=\u5df2\u958b\u59cb\u79fb\u9664 {1} \u4e0a\u7684 {0} \u8a0a\u606f...
-VBF_STATUS_FINISH_REMOVING_OLD_MESSAGES=\u5df2\u79fb\u9664\u8a0a\u606f\u3002
-
-VBF_STATUS_STARTING_VALIDATION=\u5df2\u958b\u59cb\u4f7f\u7528 {1} \u5c0d {0} \u7684\u9a57\u8b49\u7a0b\u5e8f...
-VBF_STATUS_ENDING_VALIDATION=\u5b8c\u6210 {1} \u5c0d {0} \u7684\u9a57\u8b49\u7a0b\u5e8f\u3002\u5df2\u5831\u544a\u6240\u6709\u5e38\u898b\u7684\u554f\u984c\u3002
-VBF_STATUS_ENDING_VALIDATION_ABNORMALLY=\u4f7f\u7528 {1} \u5c0d {0} \u7684\u9a57\u8b49\u7a0b\u5e8f\u7570\u5e38\u7d42\u6b62\u3002\u554f\u984c\u6e05\u55ae\u53ef\u80fd\u4e0d\u5b8c\u6574\u3002\u6709\u95dc\u7570\u5e38\u7d42\u6b62\u7684\u539f\u56e0\uff0c\u8acb\u53c3\u95b1\u53c3\u8003\u8a0a\u606f\u3002
-
-VBF_STATUS_LOOKING=\u6b63\u5728\u5c0b\u627e\u89e3\u9664\u5b89\u88dd\u4e4b\u9a57\u8b49\u5668\u6240\u64c1\u6709\u7684\u9a57\u8b49\u8a0a\u606f...
-VBF_STATUS_LOOKINGDONE=\u6b63\u5728\u5c0b\u627e\u89e3\u9664\u5b89\u88dd\u4e4b\u9a57\u8b49\u5668\u6240\u64c1\u6709\u7684\u9a57\u8b49\u8a0a\u606f...\u5b8c\u6210\u3002
-VBF_STATUS_REMOVING=\u6b63\u5728\u79fb\u9664\u89e3\u9664\u5b89\u88dd\u4e4b\u9a57\u8b49\u5668\u6240\u64c1\u6709\u7684\u9a57\u8b49\u8a0a\u606f...
-VBF_STATUS_REMOVINGDONE=\u6b63\u5728\u79fb\u9664\u89e3\u9664\u5b89\u88dd\u4e4b\u9a57\u8b49\u5668\u6240\u64c1\u6709\u7684\u9a57\u8b49\u8a0a\u606f...\u5b8c\u6210\u3002
-
-# The following message will be deleted soon.
-VBF_TASK_WARN_MESSAGE_LIMIT_ABORT=IWAE0034W IWAD3000I: {1} \u5df2\u7d42\u6b62 {0} \u7684\u9a57\u8b49\uff0c\u56e0\u70ba\u5df2\u5831\u544a\u7684\u8a0a\u606f\u6578\u76ee\u9054\u5230\u4e86\u4e0a\u9650\u3002\u53ef\u80fd\u6703\u907a\u6f0f\u90e8\u5206\u8a0a\u606f\u3002
-
-VBF_TASK_WARN_MESSAGE_LIMIT_VAL=IWAE0035W IWAD3000I: \u53ef\u80fd\u6703\u907a\u6f0f\u90e8\u5206\u8a0a\u606f\uff0c\u56e0\u70ba\u5df2\u5831\u544a\u7684\u8a0a\u606f\u6578\u76ee\u9054\u5230\u4e86\u4e0a\u9650\u3002\u8acb\u589e\u52a0\u8a0a\u606f\u6578\u76ee\u7684\u4e0a\u9650\uff0c\u7136\u5f8c\u518d\u8a66\u4e00\u6b21\u3002
-
-#
-# 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 c2b6c37..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/FilterUtil.java
+++ /dev/null
@@ -1,729 +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.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);
-				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 461bdfe..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/GlobalConfiguration.java
+++ /dev/null
@@ -1,186 +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.wst.validation.internal.plugin.ValidationPlugin;
-
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-
-
-/**
- * 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/InternalValidatorManager.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/InternalValidatorManager.java
deleted file mode 100644
index e05d451..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/InternalValidatorManager.java
+++ /dev/null
@@ -1,207 +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.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;
-
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-
-/**
- */
-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 77c2f7c..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ReferencialFileValidatorExtension.java
+++ /dev/null
@@ -1,83 +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.internal.runtime.Assert;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.wst.validation.internal.operations.ReferencialFileValidator;
-
-import org.eclipse.jem.util.logger.proxy.Logger;
-
-/**
- * @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) {
-		Assert.isLegal(REF_FILE_VALIDATOR_EXTENSION.equals(element.getName()), "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;
-	}
-
-	/**
-	 * @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 38e98cc..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ReferencialFileValidatorRegistryReader.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
- *******************************************************************************/
-/*
- * 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) {
-		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 09beb92..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/VThreadManager.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.Vector;
-import java.util.logging.Level;
-
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-
-
-/**
- * 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 91553fe..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidationConfiguration.java
+++ /dev/null
@@ -1,770 +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.wst.validation.internal.plugin.ValidationPlugin;
-
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-
-
-/**
- * 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 5e59a3e..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidationFactoryImpl.java
+++ /dev/null
@@ -1,24 +0,0 @@
-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 3ad120f..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidationRegistryReader.java
+++ /dev/null
@@ -1,1369 +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.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
-
-	// getTempList() method.
-
-	/**
-	 * 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);
-				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});
-				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$
-				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);
-					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) {
-		Set prjVmds = getValidatorMetaData(project);
-		if (prjVmds == null) {
-			return false;
-		}
-
-		if (prjVmds.size() == 0) {
-			return false;
-		}
-
-		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});
-				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);
-					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/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 48ddb53..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidatorFilter.java
+++ /dev/null
@@ -1,104 +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);
-		_nameFilter.setCaseSensitive(isCaseSensitiveString);
-	}
-
-	/**
-	 * 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 ab04868..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidatorMetaData.java
+++ /dev/null
@@ -1,482 +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.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.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) {
-				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) {
-				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 (filter.isApplicableType(resource) && filter.isApplicableName(resource) && filter.isApplicableAction(resourceDelta)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * 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 e0994c2..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidatorNameFilter.java
+++ /dev/null
@@ -1,152 +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 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());
-	}
-
-	/**
-	 * 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();
-		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 991547e..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidatorTypeFilter.java
+++ /dev/null
@@ -1,154 +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.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);
-						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 3dafbfe..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/AllValidatorsOperation.java
+++ /dev/null
@@ -1,73 +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.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;
-
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-
-/**
- * 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 995138f..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidationOperation.java
+++ /dev/null
@@ -1,1456 +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.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.FileDelta;
-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.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);
-		}
-	}
-
-	private void initValidateContext(IFileDelta[] delta) {
-		 if (context instanceof WorkbenchContext) {
-			 ((WorkbenchContext)context).setValidationFileURIs(new ArrayList());
-			 for(int i = 0; i < delta.length; i++) {
-				 IFileDelta file = (IFileDelta)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 context, 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,context,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 f898477..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidationUtility.java
+++ /dev/null
@@ -1,122 +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.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;
-
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-
-/**
- * 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 ba4df88..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidatorManager.java
+++ /dev/null
@@ -1,1335 +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.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.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;
-
-import org.eclipse.jem.util.logger.LogEntry;
-import org.eclipse.jem.util.logger.proxy.Logger;
-
-/**
- * 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;
-
-	/**
-	 * 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, IMessage.ALL_MESSAGES);
-			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-			int max = prjp.getMaximumNumberOfMessages();
-			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.length - 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;
-	}
-
-	/**
-	 * 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 d65a2f1..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidatorSubsetOperation.java
+++ /dev/null
@@ -1,318 +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.core.resources.IResourceDelta;
-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 6fbb6a2..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/WorkbenchContext.java
+++ /dev/null
@@ -1,788 +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";
-	public static final String GET_FILE = "getFile";
-	private static final IContainer[] NO_CONTAINERS = new IContainer[0];
-	public static final String VALIDATION_MARKER = "com.ibm.etools.validation.problemmarker";
-	public static final String VALIDATION_MARKER_OWNER = "owner";  
-
-	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() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/**
-	 * @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 440c643..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/WorkbenchReporter.java
+++ /dev/null
@@ -1,720 +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.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;
-
-/**
- * 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());
-		} 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 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);
-	}
-
-	// 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);
-				entry.setTokens(new String[]{message.getText(), getTargetObjectName(helper, message)});
-				logger.write(Level.FINE, entry);
-			}
-			return;
-		}
-
-		ValidatorManager mgr = ValidatorManager.getManager();
-		if (mgr.isMessageLimitExceeded(resource.getProject())) {
-			validateMessageLimitExceeded(validator, resource);
-		}
-
-		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/ValidationPlugin.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/plugin/ValidationPlugin.java
deleted file mode 100644
index 6576a98..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#shutdown()
-	 */
-	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 7fcc415..0000000
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/provisional/ValidationFactory.java
+++ /dev/null
@@ -1,36 +0,0 @@
-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.
- * 
- * @since 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
-	 * @since 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 21a9cd6..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.
- * 
- * @since 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.
-	 * @since 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.
-	 * @since 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 91e149c..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.Locale;
-import java.util.List;
-
-
-/**
- * <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 ff87d4e..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 constants specified in SeverityEnum. 
-	 * @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 constants specified in SeverityEnum. 
-	 * @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 constants specified in SeverityEnum. 
-	 * @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 1c6c558..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.
- * 
- * @since 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 249148e..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.
- * 
- * @since 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 2e89755..0000000
--- a/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/provisional/core/IMetaModelContext.java
+++ /dev/null
@@ -1,7 +0,0 @@
-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 338df89..0000000
--- a/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/provisional/core/IValidationContext.java
+++ /dev/null
@@ -1,79 +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;
-
-
-/**
- * <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>
-	 * @since 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);
-	
-	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 7eb61cb..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
-	 * @since 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 3c512ca..0000000
--- a/plugins/org.eclipse.wst.validation/xsds/referencialFileExtSchema.exsd
+++ /dev/null
@@ -1,119 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="com.ibm.etools.validation">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="com.ibm.etools.validation" id="referencialFileValidator" name="ReferencialFileValidator"/>
-      </appInfo>
-      <documentation>
-         [Enter description of this extension point.]
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <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>
-      <complexType>
-         <sequence>
-            <element ref="referencialFileValidator"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="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>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         
-      </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 de29048..0000000
--- a/plugins/org.eclipse.wst.validation/xsds/validatorExtSchema.exsd
+++ /dev/null
@@ -1,280 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="com.ibm.etools.validation">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="com.ibm.etools.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>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </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>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-</schema>
