diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/ModuleCore.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/ModuleCore.java
index 294c17a..941bd20 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/ModuleCore.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/ModuleCore.java
@@ -70,7 +70,6 @@
 public class ModuleCore implements IEditModelHandler {
 
 	public static final Class ADAPTER_TYPE = ModuleCore.class;
-	public static final int DELETE_METAMODEL_ONLY = 0x100000; 
 
 	static final String DEPLOYABLES_ROOT = ".deployables/"; //$NON-NLS-1$
 	static String MODULE_META_FILE_NAME = ".wtpmodules"; //$NON-NLS-1$
@@ -103,7 +102,8 @@
 	 * @return A ModuleCore edit facade to access the WTP Modules Model
 	 */
 	public static ModuleCore getModuleCoreForRead(IProject aProject) {
-		return new ModuleCore(ModuleCoreNature.getModuleCoreNature(aProject), true);
+		ModuleCoreNature nature = ModuleCoreNature.getModuleCoreNature(aProject);
+		return nature != null ? new ModuleCore(nature, true) : null;
 	}
 
 	/**
@@ -122,7 +122,8 @@
 	 * @return A ModuleCore edit facade to access the WTP Modules Model
 	 */
 	public static ModuleCore getModuleCoreForWrite(IProject aProject) {
-		return new ModuleCore(ModuleCoreNature.getModuleCoreNature(aProject), false);
+		ModuleCoreNature nature = ModuleCoreNature.getModuleCoreNature(aProject);
+		return nature != null ? new ModuleCore(nature, false) : null;
 	}
 
 	/**
@@ -150,8 +151,8 @@
 
 	/**
 	 * <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.
+	 * 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,
@@ -184,12 +185,11 @@
 	/**
 	 * <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}).
+	 * {@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>
@@ -210,8 +210,8 @@
 
 	/**
 	 * <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}.
+	 * 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>
@@ -236,8 +236,8 @@
 	 * <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)}.
+	 * 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
@@ -272,15 +272,15 @@
 	public static String getDeployedName(URI aFullyQualifiedModuleURI) throws UnresolveableURIException {
 		return ModuleURIUtil.getDeployedName(aFullyQualifiedModuleURI);
 	}
-	
+
 	public static IVirtualContainer create(IProject aProject, String aName) {
 		return new VirtualContainer(aProject, aName, new Path("/")); //$NON-NLS-1$
 	}
-	
+
 	public static IVirtualFolder create(IFolder aFolder, String aComponentName, IPath aRuntimePath) {
 		return new VirtualFolder(aFolder, aComponentName, aRuntimePath);
 	}
-	
+
 	public static ComponentType getComponentType(IVirtualContainer aComponent) {
 		ModuleCore moduleCore = null;
 		ComponentType componentType = null;
@@ -289,30 +289,29 @@
 			WorkbenchComponent wbComponent = moduleCore.findWorkbenchModuleByDeployName(aComponent.getComponentName());
 			componentType = wbComponent.getComponentType();
 		} finally {
-			if(moduleCore != null)
+			if (moduleCore != null)
 				moduleCore.dispose();
 		}
 		return componentType;
 	}
-	
-	
+
+
 	public static void setComponentType(IVirtualContainer component, ComponentType aComponentType) {
-		ModuleCore moduleCore = null; 
+		ModuleCore moduleCore = null;
 		try {
 			moduleCore = ModuleCore.getModuleCoreForWrite(component.getProject());
 			WorkbenchComponent wbComponent = moduleCore.findWorkbenchModuleByDeployName(component.getComponentName());
 			wbComponent.setComponentType(aComponentType);
 		} finally {
-			if(moduleCore != null) {
+			if (moduleCore != null) {
 				moduleCore.saveIfNecessary(null);
 				moduleCore.dispose();
 			}
-		} 
+		}
 	}
-	
+
 	public static URI createComponentURI(IProject aContainingProject, String aComponentName) {
-		return URI.createURI(PlatformURLModuleConnection.MODULE_PROTOCOL+IPath.SEPARATOR+PlatformURLModuleConnection.RESOURCE_MODULE
-								+aContainingProject.getName()+IPath.SEPARATOR+aComponentName);
+		return URI.createURI(PlatformURLModuleConnection.MODULE_PROTOCOL + IPath.SEPARATOR + PlatformURLModuleConnection.RESOURCE_MODULE + aContainingProject.getName() + IPath.SEPARATOR + aComponentName);
 	}
 
 	protected ModuleCore(ModuleCoreNature aNature, boolean toAccessAsReadOnly) {
@@ -414,20 +413,22 @@
 	public ProjectComponents getModuleModelRoot() {
 		return (ProjectComponents) structuralModel.getPrimaryRootObject();
 	}
-	
+
 	/**
 	 * <p>
-	 * 	Return the an array of ComponentResource which basically represent the
-	 * source containers of a WorkbenchResource.
+	 * 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 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
@@ -444,9 +445,9 @@
 
 	/**
 	 * <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
+	 * 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>
 	 * 
@@ -477,8 +478,8 @@
 	 *            {@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
+	 * @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
 	 */
@@ -494,15 +495,15 @@
 
 	/**
 	 * <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.
+	 * 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
+	 * @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
 	 */
@@ -560,16 +561,15 @@
 
 	/**
 	 * <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.
+	 * 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}.
+	 * 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 aWorkspaceRelativePath
@@ -590,25 +590,25 @@
 			module = (WorkbenchComponent) modules.get(i);
 			resources = module.findWorkbenchModuleResourceBySourcePath(aWorkspaceRelativePath);
 			if (resources != null && resources.length != 0)
-					foundResources.addAll(Arrays.asList(resources));
-			}
-			if (foundResources.size() > 0)
-				return (ComponentResource[]) foundResources.toArray(new ComponentResource[foundResources.size()]);
+				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.
+	 * 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
+	 * @return The {@see WorkbenchComponent}contained by the current ModuleCore with the deploy
+	 *         name aModuleName
 	 * @see WorkbenchComponent#getDeployedName()
 	 */
 	public WorkbenchComponent findWorkbenchModuleByDeployName(String aModuleName) {
@@ -644,12 +644,14 @@
 	 * <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.
+	 * {@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
+	 * @return A non-null array of the {@see WorkbenchComponent}s that match the given module type
+	 *         id
 	 */
 	public WorkbenchComponent[] findWorkbenchModuleByType(String aModuleTypeId) {
 		WorkbenchComponent[] availableModules = getWorkbenchModules();
@@ -698,10 +700,10 @@
 			dependentCore = (ModuleCore) dependentCores.get(aModuleURI);
 			if (dependentCore == null) {
 				IProject container = getContainingProject(aModuleURI);
-				if(container != null) {
+				if (container != null) {
 					dependentCore = getModuleCoreForRead(container);
 					dependentCores.put(aModuleURI, dependentCore);
-				} else 
+				} else
 					throw new UnresolveableURIException(aModuleURI);
 			}
 		}
@@ -711,21 +713,23 @@
 	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)
+		if (getWorkbenchModules().length > 0)
 			return getWorkbenchModules()[0];
 		return null;
 	}
-	
+
 	/**
-	 * temporary method to return artifact edit for first module in project
-	 * USERS MUST DISPOSE THE ARTIFACT EDIT
+	 * temporary method to return artifact edit for first module in project USERS MUST DISPOSE THE
+	 * ARTIFACT EDIT
+	 * 
 	 * @param project
 	 * @return the artifact edit for the first module
 	 * @deprecated
@@ -739,7 +743,7 @@
 			module = moduleCore.getFirstModule();
 			artEdit = ArtifactEdit.getArtifactEditForRead(module);
 		} finally {
-			if (moduleCore !=null)
+			if (moduleCore != null)
 				moduleCore.dispose();
 		}
 		return artEdit;
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/internal/resources/VirtualContainer.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/internal/resources/VirtualContainer.java
index 3e65919..90f3e16 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/internal/resources/VirtualContainer.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/internal/resources/VirtualContainer.java
@@ -84,17 +84,7 @@
 		// moduleCore.dispose();
 		// }
 		return new VirtualFolder(getComponentHandle(), getRuntimePath().append(path));
-	}
-
-	public String getDefaultCharset() throws CoreException {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-		// return null;
-	}
-
-	public String getDefaultCharset(boolean checkImplicit) throws CoreException {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-		// return null;
-	}
+	} 
 
 	/**
 	 * @see IContainer#getFile(org.eclipse.core.runtime.IPath)
@@ -179,7 +169,8 @@
 
 					if (fullRuntimePath.segmentCount() == 1) {
 						realResource = ModuleCore.getEclipseResource(componentResources[componentResourceIndex]);
-						addVirtualResource(virtualResources, realResource, newRuntimePath);
+						if(realResource != null)
+							addVirtualResource(virtualResources, realResource, newRuntimePath);
 					} else if (fullRuntimePath.segmentCount() > 1) {
 						virtualResources.add(new VirtualFolder(getComponentHandle(), newRuntimePath));
 					}
@@ -194,32 +185,11 @@
 		return (IVirtualResource[]) virtualResources.toArray(new IVirtualResource[virtualResources.size()]);
 	}
 
-	/**
-	 * @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));
-	}
 
 	public IVirtualFile[] findDeletedMembersWithHistory(int depth, IProgressMonitor monitor) throws CoreException {
 		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
 		// return null;
-	}
-
-	public void setDefaultCharset(String charset) throws CoreException {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-
-	}
-
-	public void setDefaultCharset(String charset, IProgressMonitor monitor) throws CoreException {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-
-	}
+	} 
 
 	public void commit() throws CoreException{
 		
@@ -236,11 +206,15 @@
 			}
 		} 
 	}
+	
+	public int getType() {
+		return IResource.ROOT;
+	}
 
 	protected void doDeleteMetaModel(int updateFlags, IProgressMonitor monitor) {
 		ModuleCore moduleCore = null;
 		try {
-			moduleCore = ModuleCore.getModuleCoreForRead(getComponentHandle().getProject());
+			moduleCore = ModuleCore.getModuleCoreForWrite(getComponentHandle().getProject());
 			WorkbenchComponent component = moduleCore.findWorkbenchModuleByDeployName(getComponentHandle().getName());
 			moduleCore.getModuleModelRoot().getComponents().remove(component);
 		} finally {
@@ -254,5 +228,18 @@
 	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/modulecore/internal/resources/VirtualFile.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/internal/resources/VirtualFile.java
index ea33452..7c9f6bc 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/internal/resources/VirtualFile.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/internal/resources/VirtualFile.java
@@ -8,45 +8,20 @@
  **************************************************************************************************/
 package org.eclipse.wst.common.modulecore.internal.resources;
 
-import java.io.InputStream;
-
 import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFileState;
+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.content.IContentDescription;
 import org.eclipse.wst.common.modulecore.resources.IVirtualFile;
 
 public class VirtualFile extends VirtualResource implements IVirtualFile {
-	 
-	private final IFile realFile;
-	
-//	public VirtualFile(IFile aRealFile, String aComponentName, IPath aRuntimePath) {
-//		super(aRealFile.getProject(), aComponentName, aRuntimePath); 
-//	}
 
 	protected VirtualFile(ComponentHandle aComponentHandle, IPath aRuntimePath) {
-		super(aComponentHandle, aRuntimePath);
-		realFile = getProject().getFile(getProjectRelativePath());
+		super(aComponentHandle, aRuntimePath); 
 	}
 
-	public void appendContents(InputStream source, boolean force, boolean keepHistory, IProgressMonitor monitor) throws CoreException {		
-		realFile.create(source, force, monitor);
-	}
-
-	public void appendContents(InputStream source, int updateFlags, IProgressMonitor monitor) throws CoreException {
-		realFile.appendContents(source, updateFlags, monitor);
-	}
-
-	public void create(InputStream source, boolean force, IProgressMonitor monitor) throws CoreException {
-		realFile.create(source, force, monitor);
-	}
-
-	public void create(InputStream source, int updateFlags, IProgressMonitor monitor) throws CoreException {
-		realFile.create(source, updateFlags, monitor);
-
-	}
+ 
 	public void createLink(IPath aProjectRelativeLocation, int updateFlags, IProgressMonitor monitor) throws CoreException {
 		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
 //		
@@ -75,73 +50,25 @@
 		
 		
 	}
-
-	public void delete(boolean force, boolean keepHistory, IProgressMonitor monitor) throws CoreException { 
-		realFile.delete(force, keepHistory, monitor);
-
-	}
-
-	public String getCharset() throws CoreException {
-		return realFile.getCharset();
-	}
-
-	public String getCharset(boolean checkImplicit) throws CoreException {
-		return realFile.getCharset(checkImplicit);
-	}
-
-	public IContentDescription getContentDescription() throws CoreException { 
-		return realFile.getContentDescription();
-	}
-
-	public InputStream getContents() throws CoreException { 
-		return realFile.getContents();
-	}
-
-	public InputStream getContents(boolean force) throws CoreException {
-		return realFile.getContents(force);
-	}
- 
-
-	public IFileState[] getHistory(IProgressMonitor monitor) throws CoreException { 
-		return realFile.getHistory(monitor);
-	}
-
-	public void move(IPath destination, boolean force, boolean keepHistory, IProgressMonitor monitor) throws CoreException {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-
-	}
-
-	public void setCharset(String newCharset, IProgressMonitor monitor) throws CoreException { 
-		realFile.setCharset(newCharset, monitor);
-
-	}
-
-	public void setContents(InputStream source, boolean force, boolean keepHistory, IProgressMonitor monitor) throws CoreException {
-		realFile.setContents(source, force, keepHistory, monitor);
-	}
-
-	public void setContents(IFileState source, boolean force, boolean keepHistory, IProgressMonitor monitor) throws CoreException {
-		realFile.setContents(source, force, keepHistory, monitor);
-	}
-
-	public void setContents(InputStream source, int updateFlags, IProgressMonitor monitor) throws CoreException {
-		realFile.setContents(source, updateFlags, monitor);
-	}
-
-	public void setContents(IFileState source, int updateFlags, IProgressMonitor monitor) throws CoreException {
-		realFile.setContents(source, updateFlags, monitor);
+	
+	public int getType() {
+		return IResource.FILE;
 	}
 	
 	public IFile getRealFile() {
-		return realFile;
+		return getProject().getFile(getProjectRelativePath());
 	}
 	
 	public IFile[] getRealFiles() {
-		return new IFile[] {realFile};
+		return new IFile[] {getRealFile()};
 	}
+
+	protected void doDeleteMetaModel(int updateFlags,IProgressMonitor monitor) {
+		
+	}	
 	
 	protected void doDeleteRealResources(int updateFlags, IProgressMonitor monitor) throws CoreException {
-		realFile.delete(updateFlags, monitor);
+
 	}
 
 }
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/internal/resources/VirtualFolder.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/internal/resources/VirtualFolder.java
index 9bfe16f..6664947 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/internal/resources/VirtualFolder.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/internal/resources/VirtualFolder.java
@@ -9,14 +9,12 @@
 package org.eclipse.wst.common.modulecore.internal.resources;
 
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.Set;
 
 import org.eclipse.core.resources.IContainer;
 import org.eclipse.core.resources.IFolder;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
@@ -27,7 +25,6 @@
 import org.eclipse.wst.common.modulecore.WorkbenchComponent;
 import org.eclipse.wst.common.modulecore.internal.impl.ResourceTreeRoot;
 import org.eclipse.wst.common.modulecore.resources.IVirtualContainer;
-import org.eclipse.wst.common.modulecore.resources.IVirtualFile;
 import org.eclipse.wst.common.modulecore.resources.IVirtualFolder;
 import org.eclipse.wst.common.modulecore.resources.IVirtualResource;
 
@@ -66,18 +63,13 @@
 	protected VirtualFolder(ComponentHandle aComponentHandle, IPath aRuntimePath) {
 		super(aComponentHandle, aRuntimePath);
 	}
-
+ 
 	// TODO WTP:Implement this method
-	public void create(boolean force, boolean local, IProgressMonitor monitor) throws CoreException {
-		create((force ? IResource.FORCE : IResource.NONE), local, monitor);
-	}
-
-	// TODO WTP:Implement this method
-	public void create(int updateFlags, boolean local, IProgressMonitor monitor) throws CoreException {
+	public void create(int updateFlags, IProgressMonitor monitor) throws CoreException {
 
 		IVirtualContainer container = ModuleCore.create(getProject(), getComponentHandle().getName());
 		IVirtualFolder root = container.getFolder(new Path("/"));  //$NON-NLS-1$		
-		IFolder realFolder = ResourcesPlugin.getWorkspace().getRoot().getFolder(root.getWorkspaceRelativePath()); 
+		IFolder realFolder = getProject().getFolder(root.getProjectRelativePath()); 
 		IFolder newFolder = realFolder.getFolder(getRuntimePath()); 
 		createResource(newFolder, updateFlags, monitor); 
 
@@ -136,11 +128,6 @@
 
 	}
 
-	public void move(IPath destination, boolean force, boolean keepHistory, IProgressMonitor monitor) throws CoreException {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-
-	}
-
 	// TODO WTP:Implement this method
 	public boolean exists(IPath path) {
 		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
@@ -170,53 +157,69 @@
 		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
 		// return null;
 	}
-
-	public String getDefaultCharset() throws CoreException {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-		// return null;
-	}
-
-	public String getDefaultCharset(boolean checkImplicit) throws CoreException {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-		// return null;
-	}
-
-	public IVirtualFile[] findDeletedMembersWithHistory(int depth, IProgressMonitor monitor) throws CoreException {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-		// return null;
-	}
-
-	public void setDefaultCharset(String charset) throws CoreException {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-
-	}
-
-	public void setDefaultCharset(String charset, IProgressMonitor monitor) throws CoreException {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-
+ 
+	public int getType() {
+		return IResource.FOLDER;
 	}
 
 	public void commit() throws CoreException {
-
-		// ModuleCore moduleCore = null;
-		// try {
-		// moduleCore = ModuleCore.getModuleCoreForWrite(getProject());
-		// WorkbenchComponent component =
-		// moduleCore.findWorkbenchModuleByDeployName(getComponentHandle().getName());
-		// if(component == null)
-		// moduleCore.createWorkbenchModule(getComponentHandle().getName());
-		// } finally {
-		// if (moduleCore != null) {
-		// moduleCore.saveIfNecessary(null);
-		// moduleCore.dispose();
-		// }
-		// }
+ 
 	}
 
+	public IFolder getRealFolder() { 
+		return getProject().getFolder(getProjectRelativePath());
+	}
+	
+	public IFolder[] getRealFolders() {
+		return new IFolder[] {getRealFolder()};
+	}
+
+	protected void doDeleteMetaModel(int updateFlags, IProgressMonitor monitor) {
+
+		// only handles explicit mappings
+		ModuleCore moduleCore = null;
+		try {
+			URI runtimeURI = URI.createURI(getRuntimePath().toString());
+			moduleCore = ModuleCore.getModuleCoreForWrite(getProject());
+			WorkbenchComponent component = moduleCore.findWorkbenchModuleByDeployName(getComponentName());
+			ComponentResource[] resources = component.findWorkbenchModuleResourceByDeployPath(runtimeURI);
+			for (int i = 0; i < resources.length; i++) {
+				if(runtimeURI.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 {
-		for (Iterator iter = realFolders.iterator(); iter.hasNext();) {
-			IFolder realFolder = (IFolder) iter.next();
-			realFolder.delete(updateFlags, monitor);
+
+		// only handles explicit mappings
+		ModuleCore moduleCore = null;
+		try {
+			URI runtimeURI = URI.createURI(getRuntimePath().toString());
+			moduleCore = ModuleCore.getModuleCoreForWrite(getProject());
+			WorkbenchComponent component = moduleCore.findWorkbenchModuleByDeployName(getComponentName());
+			ComponentResource[] resources = component.findWorkbenchModuleResourceByDeployPath(runtimeURI);
+			IResource realResource;
+			for (int i = 0; i < resources.length; i++) {
+				if(runtimeURI.equals(resources[i].getRuntimePath())) {
+					realResource = ModuleCore.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/modulecore/internal/resources/VirtualResource.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/internal/resources/VirtualResource.java
index 0194127..7fb9691 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/internal/resources/VirtualResource.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/internal/resources/VirtualResource.java
@@ -35,6 +35,7 @@
 	private IPath runtimePath;
 	private int hashCode;
 	private String toString;
+	private static final String EMPTY_STRING = ""; //$NON-NLS-1$
 	
 	protected VirtualResource(ComponentHandle aComponentHandle, IPath aRuntimePath) {
 		componentHandle = aComponentHandle;		
@@ -64,21 +65,10 @@
 	public void accept(IResourceVisitor visitor, int depth, int memberFlags) throws CoreException {
 		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
 
-	} 
-
-	public void copy(IPath destination, boolean force, IProgressMonitor monitor) throws CoreException {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-
-	}
-
-	public void copy(IPath destination, int updateFlags, IProgressMonitor monitor) throws CoreException {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-
-	}  
-
+	}   
+	
 	public void delete(boolean force, IProgressMonitor monitor) throws CoreException {
 		delete(force ? IResource.FORCE : IResource.NONE, monitor);
-
 	}
 
 	public void delete(boolean force, boolean keepHistory, IProgressMonitor monitor) throws CoreException {
@@ -89,12 +79,12 @@
 
 
 	public void delete(int updateFlags, IProgressMonitor monitor) throws CoreException {
-		doDeleteMetaModel(updateFlags, monitor);
 		
-		
-		if( (updateFlags & ModuleCore.DELETE_METAMODEL_ONLY) == 0) {
+		if( (updateFlags & IVirtualResource.DELETE_METAMODEL_ONLY) == 0) {
 			doDeleteRealResources(updateFlags, monitor);
 		} 
+
+		doDeleteMetaModel(updateFlags, monitor);		
 	}
 
 	protected void doDeleteMetaModel(int updateFlags,IProgressMonitor monitor) {
@@ -117,82 +107,27 @@
 
 	// TODO WTP:Implement this method 
 	public boolean exists() {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-		//return false;
+		return true;
 	}
 
 	public String getFileExtension() {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-		//return null;
+		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);
 	}
-	
-	// TODO WTP:Implement this method 
+	 
 	public IPath getWorkspaceRelativePath() {
-		ModuleCore moduleCore = null;
-		try {
-			moduleCore = ModuleCore.getModuleCoreForRead(getProject());
-			WorkbenchComponent component = moduleCore.findWorkbenchModuleByDeployName(getComponentHandle().getName());
-			ResourceTreeRoot root = ResourceTreeRoot.getDeployResourceTreeRoot(component);
-			
-			ComponentResource[] componentResources = new ComponentResource[0];
-			IPath currentPath = null;
-			IPath potentialMatchRuntimePath = null; 
-			
-			do { 
-				currentPath = (currentPath == null) ? getRuntimePath() : currentPath.removeLastSegments(1);
-				componentResources = root.findModuleResources(currentPath, false);
-				for (int i = 0; i < componentResources.length; i++) {
-					potentialMatchRuntimePath = new Path(componentResources[i].getRuntimePath().path());					
-					if(isPotentalMatch(potentialMatchRuntimePath)) {
-						IPath sourcePath = new Path(componentResources[i].getSourcePath().path());
-						IPath subpath = getRuntimePath().removeFirstSegments(potentialMatchRuntimePath.segmentCount());
-						IPath finalPath = sourcePath.append(subpath);
-						// already workspace relative
-						if(finalPath.segment(0).equals(getComponentHandle().getProject().getName())) {
-							return finalPath;
-						} 
-						// make workspace relative
-						return new Path(IPath.SEPARATOR+getProject().getName()).append(finalPath);
-					}
-				}   
-			} while(currentPath.segmentCount() > 0 && componentResources.length == 0);
-		} finally {
-			if(moduleCore != null) {
-				moduleCore.dispose();
-			}
-		}
-		return getRuntimePath();
-	}
-
-	private boolean isPotentalMatch(IPath aRuntimePath) {
-		return aRuntimePath.isPrefixOf(getRuntimePath());
-	}
-
-	// TODO WTP:Implement this method 
-	public IPath getLocation() {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-		//return null;
-	} 
-	
-	// TODO WTP:Implement this method 
-	public String getName() {
-		return getRuntimePath().lastSegment();
+		return getProject().getFullPath().append(getProjectRelativePath());
 	}
 	
-	public String getComponentName() {
-		return getComponentHandle().getName();
-	}
-
-	// TODO WTP:Implement this method 
-	public IVirtualContainer getParent() {
-		return new VirtualFolder(getComponentHandle(), getRuntimePath().removeLastSegments(1));
-	} 
-
-	public IProject getProject() {
-		return getComponentHandle().getProject();
-	}
-
-	// TODO WTP:Implement this method 
+	public IPath getRuntimePath() {
+		return runtimePath;
+	}  
+	 
 	public IPath getProjectRelativePath() {
 
 		ModuleCore moduleCore = null;
@@ -229,43 +164,31 @@
 			}
 		}
 		return getRuntimePath();
-	} 
-
-	public int getType() {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-		//return 0;
+	}  
+	 
+	public String getName() {
+		return getRuntimePath().lastSegment();
+	}
+	
+	public String getComponentName() {
+		return getComponentHandle().getName();
 	}
  
+	public IVirtualContainer getParent() {
+		if(getRuntimePath().segmentCount() > 0)
+			return new VirtualFolder(getComponentHandle(), getRuntimePath().removeLastSegments(1));
+		return ModuleCore.create(getProject(), getComponentName());
+	} 
+
+	public IProject getProject() {
+		return getComponentHandle().getProject();
+	}
 
 	public boolean isAccessible() {
 		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
 		//return false;
 	} 
-	
-	public boolean isReadOnly() {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-		//return false;
-	} 
-
-	public void move(IPath destination, boolean force, IProgressMonitor monitor) throws CoreException {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-
-	}
-
-	public void move(IPath destination, int updateFlags, IProgressMonitor monitor) throws CoreException {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-
-	} 
-
-	public void refreshLocal(int depth, IProgressMonitor monitor) throws CoreException {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-
-	} 
-
-	public void setReadOnly(boolean readOnly) {
-		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
-
-	} 
+	 
 	public Object getAdapter(Class adapter) {
 		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
 		//return null;
@@ -280,11 +203,7 @@
 		throw new UnsupportedOperationException("Method not supported"); //$NON-NLS-1$
 		//return false;
 	}
-
-	public IPath getRuntimePath() {
-		return runtimePath;
-	}  
-
+  
 	public String toString() {
 		if(toString == null)
 			toString = "["+getComponentHandle()+":"+getRuntimePath()+"]";  //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
@@ -301,7 +220,12 @@
 		return hashCode() == ((anOther != null && anOther instanceof VirtualResource) ? anOther.hashCode() : 0 );
 	} 
 
-	public ComponentHandle getComponentHandle() {
+	protected ComponentHandle getComponentHandle() {
 		return componentHandle;
 	} 
+
+	private boolean isPotentalMatch(IPath aRuntimePath) {
+		return aRuntimePath.isPrefixOf(getRuntimePath());
+	}
+ 
 }
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/resources/IVirtualContainer.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/resources/IVirtualContainer.java
index 5353d31..24f3b4a 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/resources/IVirtualContainer.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/resources/IVirtualContainer.java
@@ -12,7 +12,6 @@
 
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
 
 public interface IVirtualContainer extends IVirtualResource {
 
@@ -234,35 +233,6 @@
 	 * Returns a list of all member resources (projects, folders and files)
 	 * in this resource, in no particular order.
 	 * <p>
-	 * This is a convenience method, fully equivalent to:
-	 * <pre>
-	 *   members(includePhantoms ? INCLUDE_PHANTOMS : IVirtualResource.NONE);
-	 * </pre>
-	 * Team-private member resources are <b>not</b> included in the result.
-	 * </p>
-	 *
-	 * @param includePhantoms <code>true</code> if phantom resources are
-	 *   of interest; <code>false</code> if phantom resources are not 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> <code>includePhantoms</code> is <code>false</code> and
-	 *     this resource does not exist.</li>
-	 * <li> <code>includePhantoms</code> is <code>false</code> and
-	 *     this resource is a project that is not open.</li>
-	 * </ul>
-	 * @see #members(int)
-	 * @see IVirtualResource#exists()
-	 * @see IVirtualResource#isPhantom()
-	 */
-	public IVirtualResource[] members(boolean includePhantoms) 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,
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/resources/IVirtualFile.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/resources/IVirtualFile.java
index 8ed564c..b5971f4 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/resources/IVirtualFile.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/resources/IVirtualFile.java
@@ -10,302 +10,15 @@
  *******************************************************************************/ 
 package org.eclipse.wst.common.modulecore.resources;
 
-import java.io.InputStream;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IEncodedStorage;
 import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFileState;
-import org.eclipse.core.resources.IStorage;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.core.runtime.content.IContentTypeManager;
 
 public interface IVirtualFile extends IVirtualResource {
 
 	/**
-	 * Character encoding constant (value 0) which identifies
-	 * files that have an unknown character encoding scheme.
-	 * 
-	 * @see IVirtualFile#getEncoding()
-	 * @deprecated see getEncoding for details
-	 */
-	public int ENCODING_UNKNOWN = 0;
-	/**
-	 * Character encoding constant (value 1) which identifies
-	 * files that are encoded with the US-ASCII character encoding scheme.
-	 * 
-	 * @see IVirtualFile#getEncoding()
-	 * @deprecated see getEncoding for details 
-	 */
-	public int ENCODING_US_ASCII = 1;
-	/**
-	 * Character encoding constant (value 2) which identifies
-	 * files that are encoded with the ISO-8859-1 character encoding scheme,
-	 * also known as ISO-LATIN-1.
-	 * 
-	 * @see IVirtualFile#getEncoding()
-	 * @deprecated see getEncoding for details
-	 */
-	public int ENCODING_ISO_8859_1 = 2;
-	/**
-	 * Character encoding constant (value 3) which identifies
-	 * files that are encoded with the UTF-8 character encoding scheme.
-	 * 
-	 * @see IVirtualFile#getEncoding()
-	 * @deprecated see getEncoding for details
-	 */
-	public int ENCODING_UTF_8 = 3;
-	/**
-	 * Character encoding constant (value 4) which identifies
-	 * files that are encoded with the UTF-16BE character encoding scheme.
-	 * 
-	 * @see IVirtualFile#getEncoding()
-	 * @deprecated see getEncoding for details
-	 */
-	public int ENCODING_UTF_16BE = 4;
-	/**
-	 * Character encoding constant (value 5) which identifies
-	 * files that are encoded with the UTF-16LE character encoding scheme.
-	 * 
-	 * @see IVirtualFile#getEncoding()
-	 * @deprecated see getEncoding for details
-	 */
-	public int ENCODING_UTF_16LE = 5;
-	/**
-	 * Character encoding constant (value 6) which identifies
-	 * files that are encoded with the UTF-16 character encoding scheme.
-	 * 
-	 * @see IVirtualFile#getEncoding()
-	 * @deprecated see getEncoding for details
-	 */
-	public int ENCODING_UTF_16 = 6;
-
-	/**
-	 * Appends the entire contents of the given stream to this file.
-	 * <p>
-	 * This is a convenience method, fully equivalent to:
-	 * <pre>
-	 *   appendContents(source, (keepHistory ? KEEP_HISTORY : IVirtualResource.NONE) | (force ? FORCE : IVirtualResource.NONE), monitor);
-	 * </pre>
-	 * </p>
-	 * <p>
-	 * This method changes resources; these changes will be reported
-	 * in a subsequent resource change event, including an indication 
-	 * that this file's content have been changed.
-	 * </p>
-	 * <p>
-	 * This method is long-running; progress and cancelation are provided
-	 * by the given progress monitor. 
-	 * </p>
-	 *
-	 * @param source an input stream containing the new contents of the file
-	 * @param force a flag controlling how to deal with resources that
-	 *    are not in sync with the local file system
-	 * @param keepHistory a flag indicating whether or not to store
-	 *    the current contents in the local history
-	 * @param monitor a progress monitor, or <code>null</code> if progress
-	 *    reporting is not desired
-	 * @exception CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li> This resource does not exist.</li>
-	 * <li> The corresponding location in the local file system
-	 *       is occupied by a directory.</li>
-	 * <li> The workspace is not in sync with the corresponding location
-	 *       in the local file system and <code>force </code> is <code>false</code>.</li>
-	 * <li> Resource changes are disallowed during certain types of resource change 
-	 *       event notification. See <code>IVirtualResourceChangeEvent</code> for more details.</li>
-	 * <li> The file modification validator disallowed the change.</li>
-	 * </ul>
-	 * @exception OperationCanceledException if the operation is canceled. 
-	 * Cancelation can occur even if no progress monitor is provided.
-	 * @see #appendContents(java.io.InputStream,int,IProgressMonitor)
-	 */
-	public void appendContents(InputStream source, boolean force, boolean keepHistory, IProgressMonitor monitor) throws CoreException;
-
-	/**
-	 * Appends the entire contents of the given stream to this file.
-	 * The stream, which must not be <code>null</code>, will get closed 
-	 * whether this method succeeds or fails.
-	 * <p>
-	 * The <code>FORCE</code> update flag controls how this method deals with
-	 * cases where the workspace is not completely in sync with the local file 
-	 * system. If <code>FORCE</code> is not specified, the method will only attempt
-	 * to overwrite a corresponding file in the local file system provided
-	 * it is in sync with the workspace. This option ensures there is no 
-	 * unintended data loss; it is the recommended setting.
-	 * However, if <code>FORCE</code> is specified, an attempt will be made
-	 * to write a corresponding file in the local file system, overwriting any
-	 * existing one if need be. In either case, if this method succeeds, the 
-	 * resource will be marked as being local (even if it wasn't before).
-	 * </p>
-	 * <p>
-	 * If this file is non-local then this method will always fail. The only exception
-	 * is when <code>FORCE</code> is specified and the file exists in the local 
-	 * file system. In this case the file is made local and the given contents are appended.
-	 * </p>
-	 * <p>
-	 * The <code>KEEP_HISTORY</code> update flag controls whether or not a copy of
-	 * current contents of this file should be captured in the workspace's local
-	 * history (properties are not recorded in the local history). The local history
-	 * mechanism serves as a safety net to help the user recover from mistakes that
-	 * might otherwise result in data loss. Specifying <code>KEEP_HISTORY</code>
-	 * is recommended except in circumstances where past states of the files are of
-	 * no conceivable interest to the user. Note that local history is maintained
-	 * with each individual project, and gets discarded when a project is deleted
-	 * from the workspace. This flag is ignored if the file was not previously local.
-	 * </p>
-	 * <p>
-	 * Update flags other than <code>FORCE</code> and <code>KEEP_HISTORY</code> 
-	 * are ignored.
-	 * </p>
-	 * <p>
-	 * Prior to modifying the contents of this file, the file modification validator (if provided 
-	 * by the VCM plug-in), will be given a chance to perform any last minute preparations.  Validation
-	 * is performed by calling <code>IVirtualFileModificationValidator.validateSave</code> on this file.
-	 * If the validation fails, then this operation will fail.
-	 * </p>
-	 * <p>
-	 * This method changes resources; these changes will be reported
-	 * in a subsequent resource change event, including an indication 
-	 * that this file's content have been changed.
-	 * </p>
-	 * <p>
-	 * This method is long-running; progress and cancelation are provided
-	 * by the given progress monitor. 
-	 * </p>
-	 *
-	 * @param source an input stream containing the new contents of the file
-	 * @param updateFlags bit-wise or of update flag constants
-	 *   (<code>FORCE</code> and <code>KEEP_HISTORY</code>)
-	 * @param monitor a progress monitor, or <code>null</code> if progress
-	 *    reporting is not desired
-	 * @exception CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li> This resource does not exist.</li>
-	 * <li> The corresponding location in the local file system
-	 *       is occupied by a directory.</li>
-	 * <li> The workspace is not in sync with the corresponding location
-	 *       in the local file system and <code>FORCE</code> is not specified.</li>
-	 * <li> Resource changes are disallowed during certain types of resource change 
-	 *       event notification. See <code>IVirtualResourceChangeEvent</code> for more details.</li>
-	 * <li> The file modification validator disallowed the change.</li>
-	 * </ul>
-	 * @exception OperationCanceledException if the operation is canceled. 
-	 * Cancelation can occur even if no progress monitor is provided.
-	 * @see IVirtualResourceRuleFactory#modifyRule(IVirtualResource)
-	 * @since 2.0
-	 */
-	public void appendContents(InputStream source, int updateFlags, IProgressMonitor monitor) throws CoreException;
-
-	/**
-	 * Creates a new file resource as a member of this handle's parent resource.
-	 * <p>
-	 * This is a convenience method, fully equivalent to:
-	 * <pre>
-	 *   create(source, (force ? FORCE : IVirtualResource.NONE), monitor);
-	 * </pre>
-	 * </p>
-	 * <p>
-	 * This method changes resources; these changes will be reported
-	 * in a subsequent resource change event, including an indication 
-	 * that the file has been added to its parent.
-	 * </p>
-	 * <p>
-	 * This method is long-running; progress and cancellation are provided
-	 * by the given progress monitor. 
-	 * </p>
-	 *
-	 * @param source an input stream containing the initial contents of the file,
-	 *    or <code>null</code> if the file should be marked as not local
-	 * @param force a flag controlling how to deal with resources that
-	 *    are not in sync with the local file system
-	 * @param monitor a progress monitor, or <code>null</code> if progress
-	 *    reporting is not desired
-	 * @exception CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li> This resource already exists in the workspace.</li>
-	 * <li> The parent of this resource does not exist.</li>
-	 * <li> The project of this resource is not accessible.</li>
-	 * <li> The parent contains a resource of a different type 
-	 *      at the same path as this resource.</li>
-	 * <li> The name of this resource is not valid (according to 
-	 *    <code>IWorkspace.validateName</code>).</li>
-	 * <li> The corresponding location in the local file system is occupied
-	 *    by a directory.</li>
-	 * <li> The corresponding location in the local file system is occupied
-	 *    by a file and <code>force </code> is <code>false</code>.</li>
-	 * <li> Resource changes are disallowed during certain types of resource change 
-	 *       event notification. See <code>IVirtualResourceChangeEvent</code> for more details.</li>
-	 * </ul>
-	 * @exception OperationCanceledException if the operation is canceled. 
-	 * Cancelation can occur even if no progress monitor is provided.
-	 */
-	public void create(InputStream source, boolean force, IProgressMonitor monitor) throws CoreException;
-
-	/**
-	 * Creates a new file resource as a member of this handle's parent resource.
-	 * The resource's contents are supplied by the data in the given stream.
-	 * This method closes the stream whether it succeeds or fails.
-	 * If the stream is <code>null</code> then a file is not created in the local
-	 * file system and the created file is marked as being non-local.
-	 * <p>
-	 * The <code>FORCE</code> update flag controls how this method deals with
-	 * cases where the workspace is not completely in sync with the local file 
-	 * system. If <code>FORCE</code> is not specified, the method will only attempt
-	 * to write a file in the local file system if it does not already exist. 
-	 * This option ensures there is no unintended data loss; it is the recommended
-	 * setting. However, if <code>FORCE</code> is specified, this method will 
-	 * attempt to write a corresponding file in the local file system, 
-	 * overwriting any existing one if need be.
-	 * </p>
-	 * <p>
-	 * Update flags other than <code>FORCE</code> are ignored.
-	 * </p>
-	 * <p>
-	 * This method changes resources; these changes will be reported
-	 * in a subsequent resource change event, including an indication 
-	 * that the file has been added to its parent.
-	 * </p>
-	 * <p>
-	 * This method is long-running; progress and cancellation are provided
-	 * by the given progress monitor. 
-	 * </p>
-	 *
-	 * @param source an input stream containing the initial contents of the file,
-	 *    or <code>null</code> if the file should be marked as not local
-	 * @param updateFlags bit-wise or of update flag constants
-	 *   (only <code>FORCE</code> is relevant here)
-	 * @param monitor a progress monitor, or <code>null</code> if progress
-	 *    reporting is not desired
-	 * @exception CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li> This resource already exists in the workspace.</li>
-	 * <li> The parent of this resource does not exist.</li>
-	 * <li> The project of this resource is not accessible.</li>
-	 * <li> The parent contains a resource of a different type 
-	 *      at the same path as this resource.</li>
-	 * <li> The name of this resource is not valid (according to 
-	 *    <code>IWorkspace.validateName</code>).</li>
-	 * <li> The corresponding location in the local file system is occupied
-	 *    by a directory.</li>
-	 * <li> The corresponding location in the local file system is occupied
-	 *    by a file and <code>FORCE</code> is not specified.</li>
-	 * <li> Resource changes are disallowed during certain types of resource change 
-	 *       event notification. See <code>IVirtualResourceChangeEvent</code> for more details.</li>
-	 * </ul>
-	 * @exception OperationCanceledException if the operation is canceled. 
-	 * Cancelation can occur even if no progress monitor is provided.
-	 * @see IVirtualResourceRuleFactory#createRule(IVirtualResource)
-	 * @since 2.0
-	 */
-	public void create(InputStream source, int updateFlags, IProgressMonitor monitor) throws CoreException;
-
-	/**
 	 * Creates a new file resource as a member of this handle's parent resource.
 	 * The file's contents will be located in the file specified by the given
 	 * file system path.  The given path must be either an absolute file system
@@ -370,507 +83,7 @@
 	 * @since 2.1
 	 */
 	public void createLink(IPath localLocation, int updateFlags, IProgressMonitor monitor) throws CoreException;
-
-	/**
-	 * Deletes this file from the workspace.
-	 * <p>
-	 * This is a convenience method, fully equivalent to:
-	 * <pre>
-	 *   delete((keepHistory ? KEEP_HISTORY : IVirtualResource.NONE) | (force ? FORCE : IVirtualResource.NONE), monitor);
-	 * </pre>
-	 * </p>
-	 * <p>
-	 * This method changes resources; these changes will be reported
-	 * in a subsequent resource change event, including an indication 
-	 * that this folder has been removed from its parent.
-	 * </p>
-	 * <p>
-	 * This method is long-running; progress and cancellation are provided
-	 * by the given progress monitor. 
-	 * </p>
-	 * 
-	 * @param force a flag controlling whether resources that are not
-	 *    in sync with the local file system will be tolerated
-	 * @param keepHistory a flag controlling whether files under this folder
-	 *    should be stored in the workspace's local history
-	 * @param monitor a progress monitor, or <code>null</code> if progress
-	 *    reporting is not desired
-	 * @exception CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li> This resource could not be deleted for some reason.</li>
-	 * <li> This resource is out of sync with the local file system
-	 *      and <code>force</code> is <code>false</code>.</li>
-	 * <li> Resource changes are disallowed during certain types of resource change 
-	 *       event notification. See <code>IVirtualResourceChangeEvent</code> for more details.</li>
-	 * </ul>
-	 * @exception OperationCanceledException if the operation is canceled. 
-	 * Cancelation can occur even if no progress monitor is provided.
-	 * @see IVirtualResource#delete(int,IProgressMonitor)
-	 * @see IVirtualResourceRuleFactory#deleteRule(IVirtualResource)
-	 */
-	public void delete(boolean force, boolean keepHistory, IProgressMonitor monitor) throws CoreException;
-
-	/**
-	 * Returns the name of a charset to be used when decoding the contents of this 
-	 * file into characters. 
-	 * <p>
-	 * If checkImplicit is <code>false</code>, this method will return the 
-	 * charset defined by calling <code>setCharset</code>, provided this file 
-	 * exists, or <code>null</code> otherwise.
-	 * </p><p>
-	 * If checkImplicit is <code>true</code>, this method uses the following 
-	 * algorithm to determine the charset to be returned:
-	 * <ol>
-	 * <li>the charset defined by calling #setCharset, if any, and this file 
-	 * exists, or</li>
-	 * <li>the charset automatically discovered based on this file's contents,
-	 * if one can be determined, or</li>
-	 * <li>the default encoding for this file's parent (as defined by 
-	 * <code>IContainer#getDefaultCharset</code>).</li>
-	 * </ol>
-	 * </p><p>
-	 * <b>Note</b>:  this method does not check whether the result is a supported
-	 * charset name. Callers should be prepared to handle 
-	 * <code>UnsupportedEncodingException</code> where this charset is used. 
-	 * </p>
-	 *  
-	 * @return the name of a charset, or <code>null</code>
-	 * @exception CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li> This resource could not be read.</li>
-	 * <li> This resource is not local.</li>
-	 * <li> The corresponding location in the local file system
-	 *       is occupied by a directory.</li>
-	 * </ul>
-	 * @see IEncodedStorage#getCharset()
-	 * @see IContainer#getDefaultCharset()
-	 * @since 3.0
-	 */
-	public String getCharset(boolean checkImplicit) throws CoreException;
-
-	/**
-	 * Returns a description for this file's current contents. Returns 
-	 * <code>null</code> if a description cannot be obtained.
-	 * <p>
-	 * Calling this method produces a similar effect as calling
-	 * <code>getDescriptionFor(getContents(), getName(), IContentDescription.ALL)</code> 
-	 * on <code>IContentTypeManager</code>, but provides better 
-	 * opportunities for improved performance. Therefore, when manipulating 
-	 * <code>IVirtualFile</code>s, clients should call this method instead of 
-	 * <code>IContentTypeManager.getDescriptionFor</code>. 
-	 * </p>
-	 *  
-	 * @return a description for this file's current contents, or 
-	 * <code>null</code>
-	 * @throws CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li> This resource does not exist.</li>
-	 * <li> This resource could not be read.</li>
-	 * <li> This resource is not local.</li>
-	 * <li> The corresponding location in the local file system
-	 *       is occupied by a directory.</li>
-	 * </ul> 
-	 * @see IContentDescription
-	 * @see IContentTypeManager#getDescriptionFor(InputStream, String, QualifiedName[])
-	 * @since 3.0
-	 */
-	public IContentDescription getContentDescription() throws CoreException;
-
-	/**
-	 * Returns an open input stream on the contents of this file.
-	 * This refinement of the corresponding <code>IStorage</code> method 
-	 * returns an open input stream on the contents of this file.
-	 * The client is responsible for closing the stream when finished.
-	 *
-	 * @return an input stream containing the contents of the file
-	 * @exception CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li> This resource does not exist.</li>
-	 * <li> This resource is not local.</li>
-	 * <li> The workspace is not in sync with the corresponding location
-	 *       in the local file system.</li>
-	 * </ul>
-	 */
-	public InputStream getContents() throws CoreException;
-
-	/**
-	 * This refinement of the corresponding <code>IStorage</code> method 
-	 * returns an open input stream on the contents of this file.
-	 * The client is responsible for closing the stream when finished.
-	 * If force is <code>true</code> the file is opened and an input
-	 * stream returned regardless of the sync state of the file. The file
-	 * is not synchronized with the workspace.
-	 * If force is <code>false</code> the method fails if not in sync.
-	 *
-	 * @param force a flag controlling how to deal with resources that
-	 *    are not in sync with the local file system
-	 * @return an input stream containing the contents of the file
-	 * @exception CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li> This resource does not exist.</li>
-	 * <li> This resource is not local.</li>
-	 * <li> The workspace is not in sync with the corresponding location
-	 *       in the local file system and force is <code>false</code>.</li>
-	 * </ul>
-	 */
-	public InputStream getContents(boolean force) throws CoreException;
-
-	/**
-	 * Returns the full path of this file. 
-	 * This refinement of the corresponding <code>IStorage</code> and <code>IVirtualResource</code>
-	 * methods links the semantics of resource and storage object paths such that
-	 * <code>IVirtualFile</code>s always have a path and that path is relative to the
-	 * containing workspace.
-	 *
-	 * @see IVirtualResource#getWorkspaceRelativePath()
-	 * @see IStorage#getFullPath()
-	 */
-	public IPath getWorkspaceRelativePath();
-
-	/**
-	 * Returns a list of past states of this file known to this workspace.
-	 * Recently added states first.
-	 * <p>
-	 * This method is long-running; progress and cancellation are provided
-	 * by the given progress monitor. 
-	 * </p>
-	 * 
-	 * @param monitor a progress monitor, or <code>null</code> if progress
-	 *    reporting is not desired
-	 * @return an array of states of this file
-	 * @exception CoreException if this method fails.
-	 * @exception OperationCanceledException if the operation is canceled. 
-	 * Cancelation can occur even if no progress monitor is provided.
-	 */
-	public IFileState[] getHistory(IProgressMonitor monitor) throws CoreException;
-
-	/**
-	 * Returns the name of this file. 
-	 * This refinement of the corresponding <code>IStorage</code> and <code>IVirtualResource</code>
-	 * methods links the semantics of resource and storage object names such that
-	 * <code>IVirtualFile</code>s always have a name and that name equivalent to the
-	 * last segment of its full path.
-	 *
-	 * @see IVirtualResource#getName()
-	 * @see IStorage#getName()
-	 */
-	public String getName();
-
-	/**
-	 * Returns whether this file is read-only.
-	 * This refinement of the corresponding <code>IStorage</code> and <code>IVirtualResource</code>
-	 * methods links the semantics of read-only resources and read-only storage objects.
-	 *
-	 * @see IVirtualResource#isReadOnly()
-	 * @see IStorage#isReadOnly()
-	 */
-	public boolean isReadOnly();
-
-	/**
-	 * Moves this resource to be at the given location.
-	 * <p>
-	 * This is a convenience method, fully equivalent to:
-	 * <pre>
-	 *   move(destination, (keepHistory ? KEEP_HISTORY : IVirtualResource.NONE) | (force ? FORCE : IVirtualResource.NONE), monitor);
-	 * </pre>
-	 * </p>
-	 * <p>
-	 * This method changes resources; these changes will be reported
-	 * in a subsequent resource change event, including an indication 
-	 * that this file has been removed from its parent and a new file
-	 * has been added to the parent of the destination.
-	 * </p>
-	 * <p>
-	 * This method is long-running; progress and cancellation are provided
-	 * by the given progress monitor. 
-	 * </p>
-	 * 
-	 * @param destination the destination path 
-	 * @param force a flag controlling whether resources that are not
-	 *    in sync with the local file system will be tolerated
-	 * @param keepHistory a flag controlling whether files under this folder
-	 *    should be stored in the workspace's local history
-	 * @param monitor a progress monitor, or <code>null</code> if progress
-	 *    reporting is not desired
-	 * @exception CoreException if this resource could not be moved. Reasons include:
-	 * <ul>
-	 * <li> This resource does not exist.</li>
-	 * <li> This resource is not local.</li>
-	 * <li> The resource corresponding to the parent destination path does not exist.</li>
-	 * <li> The resource corresponding to the parent destination path is a closed 
-	 *      project.</li>
-	 * <li> A resource at destination path does exist.</li>
-	 * <li> A resource of a different type exists at the destination path.</li>
-	 * <li> This resource is out of sync with the local file system
-	 *      and <code>force</code> is <code>false</code>.</li>
-	 * <li> The workspace and the local file system are out of sync
-	 *      at the destination resource or one of its descendents.</li>
-	 * <li> Resource changes are disallowed during certain types of resource change 
-	 *       event notification. See <code>IVirtualResourceChangeEvent</code> for more details.</li>
-	 * </ul>
-	 * @exception OperationCanceledException if the operation is canceled. 
-	 * Cancelation can occur even if no progress monitor is provided.
-	 *
-	 * @see IVirtualResource#move(IPath,int,IProgressMonitor)
-	 * @see IVirtualResourceRuleFactory#moveRule(IVirtualResource, IVirtualResource)
-	 */
-	public void move(IPath destination, boolean force, boolean keepHistory, IProgressMonitor monitor) throws CoreException;
-
-	/**
-	 * Sets the charset for this file. Passing a value of <code>null</code>
-	 * will remove the charset setting for this resource.
-	 * <p>
-	 * This method changes resources; these changes will be reported
-	 * in a subsequent resource change event, including an indication 
-	 * that this file's encoding has changed.
-	 * </p>
-	 * <p>
-	 * This method is long-running; progress and cancellation are provided
-	 * by the given progress monitor. 
-	 * </p>
-	 * 
-	 * @param newCharset a charset name, or <code>null</code>
-	 * @param monitor a progress monitor, or <code>null</code> if progress
-	 *    reporting is not desired
-	 * @exception OperationCanceledException if the operation is canceled. 
-	 * Cancelation can occur even if no progress monitor is provided.
-	 * @exception CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li> This resource does not exist.</li>
-	 * <li> An error happened while persisting this setting.</li> 
-	 * <li> Resource changes are disallowed during certain types of resource change 
-	 *       event notification. See {@link IVirtualResourceChangeEvent} for more details.</li>
-	 * </ul>
-	 * @see #getCharset()
-	 * @see IVirtualResourceRuleFactory#charsetRule(IVirtualResource)
-	 * @since 3.0
-	 */
-	public void setCharset(String newCharset, IProgressMonitor monitor) throws CoreException;
-
-	/**
-	 * Sets the contents of this file to the bytes in the given input stream.
-	 * <p>
-	 * This is a convenience method, fully equivalent to:
-	 * <pre>
-	 *   setContents(source, (keepHistory ? KEEP_HISTORY : IVirtualResource.NONE) | (force ? FORCE : IVirtualResource.NONE), monitor);
-	 * </pre>
-	 * </p>
-	 * <p>
-	 * This method changes resources; these changes will be reported
-	 * in a subsequent resource change event, including an indication 
-	 * that this file's contents have been changed.
-	 * </p>
-	 * <p>
-	 * This method is long-running; progress and cancellation are provided
-	 * by the given progress monitor. 
-	 * </p>
-	 *
-	 * @param source an input stream containing the new contents of the file
-	 * @param force a flag controlling how to deal with resources that
-	 *    are not in sync with the local file system
-	 * @param keepHistory a flag indicating whether or not store
-	 *    the current contents in the local history
-	 * @param monitor a progress monitor, or <code>null</code> if progress
-	 *    reporting is not desired
-	 * @exception CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li> This resource does not exist.</li>
-	 * <li> The corresponding location in the local file system
-	 *       is occupied by a directory.</li>
-	 * <li> The workspace is not in sync with the corresponding location
-	 *       in the local file system and <code>force </code> is <code>false</code>.</li>
-	 * <li> Resource changes are disallowed during certain types of resource change 
-	 *       event notification. See <code>IVirtualResourceChangeEvent</code> for more details.</li>
-	 * <li> The file modification validator disallowed the change.</li>
-	 * </ul>
-	 * @exception OperationCanceledException if the operation is canceled. 
-	 * Cancelation can occur even if no progress monitor is provided.
-	 * @see #setContents(java.io.InputStream,int,IProgressMonitor)
-	 */
-	public void setContents(InputStream source, boolean force, boolean keepHistory, IProgressMonitor monitor) throws CoreException;
-
-	/**
-	 * Sets the contents of this file to the bytes in the given file state.
-	 * <p>
-	 * This is a convenience method, fully equivalent to:
-	 * <pre>
-	 *   setContents(source, (keepHistory ? KEEP_HISTORY : IVirtualResource.NONE) | (force ? FORCE : IVirtualResource.NONE), monitor);
-	 * </pre>
-	 * </p>
-	 * <p>
-	 * This method changes resources; these changes will be reported
-	 * in a subsequent resource change event, including an indication 
-	 * that this file's content have been changed.
-	 * </p>
-	 * <p>
-	 * This method is long-running; progress and cancellation are provided
-	 * by the given progress monitor. 
-	 * </p>
-	 *
-	 * @param source a previous state of this resource
-	 * @param force a flag controlling how to deal with resources that
-	 *    are not in sync with the local file system
-	 * @param keepHistory a flag indicating whether or not store
-	 *    the current contents in the local history
-	 * @param monitor a progress monitor, or <code>null</code> if progress
-	 *    reporting is not desired
-	 * @exception CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li> This resource does not exist.</li>
-	 * <li> The state does not exist.</li>
-	 * <li> The corresponding location in the local file system
-	 *       is occupied by a directory.</li>
-	 * <li> The workspace is not in sync with the corresponding location
-	 *       in the local file system and <code>force </code> is <code>false</code>.</li>
-	 * <li> Resource changes are disallowed during certain types of resource change 
-	 *       event notification. See <code>IVirtualResourceChangeEvent</code> for more details.</li>
-	 * <li> The file modification validator disallowed the change.</li>
-	 * </ul>
-	 * @exception OperationCanceledException if the operation is canceled. 
-	 * Cancelation can occur even if no progress monitor is provided.
-	 * @see #setContents(IFileState,int,IProgressMonitor)
-	 */
-	public void setContents(IFileState source, boolean force, boolean keepHistory, IProgressMonitor monitor) throws CoreException;
-
-	/**
-	 * Sets the contents of this file to the bytes in the given input stream.
-	 * The stream will get closed whether this method succeeds or fails.
-	 * If the stream is <code>null</code> then the content is set to be the
-	 * empty sequence of bytes.
-	 * <p>
-	 * The <code>FORCE</code> update flag controls how this method deals with
-	 * cases where the workspace is not completely in sync with the local file 
-	 * system. If <code>FORCE</code> is not specified, the method will only attempt
-	 * to overwrite a corresponding file in the local file system provided
-	 * it is in sync with the workspace. This option ensures there is no 
-	 * unintended data loss; it is the recommended setting.
-	 * However, if <code>FORCE</code> is specified, an attempt will be made
-	 * to write a corresponding file in the local file system, overwriting any
-	 * existing one if need be. In either case, if this method succeeds, the 
-	 * resource will be marked as being local (even if it wasn't before).
-	 * </p>
-	 * <p>
-	 * The <code>KEEP_HISTORY</code> update flag controls whether or not a copy of
-	 * current contents of this file should be captured in the workspace's local
-	 * history (properties are not recorded in the local history). The local history
-	 * mechanism serves as a safety net to help the user recover from mistakes that
-	 * might otherwise result in data loss. Specifying <code>KEEP_HISTORY</code>
-	 * is recommended except in circumstances where past states of the files are of
-	 * no conceivable interest to the user. Note that local history is maintained
-	 * with each individual project, and gets discarded when a project is deleted
-	 * from the workspace.  This flag is ignored if the file was not previously local.
-	 * </p>
-	 * <p>
-	 * Update flags other than <code>FORCE</code> and <code>KEEP_HISTORY</code> 
-	 * are ignored.
-	 * </p>
-	 * <p>
-	 * Prior to modifying the contents of this file, the file modification validator (if provided 
-	 * by the VCM plug-in), will be given a chance to perform any last minute preparations.  Validation
-	 * is performed by calling <code>IVirtualFileModificationValidator.validateSave</code> on this file.
-	 * If the validation fails, then this operation will fail.
-	 * </p>
-	 * <p>
-	 * This method changes resources; these changes will be reported
-	 * in a subsequent resource change event, including an indication 
-	 * that this file's content have been changed.
-	 * </p>
-	 * <p>
-	 * This method is long-running; progress and cancellation are provided
-	 * by the given progress monitor. 
-	 * </p>
-	 *
-	 * @param source an input stream containing the new contents of the file
-	 * @param updateFlags bit-wise or of update flag constants
-	 *   (<code>FORCE</code> and <code>KEEP_HISTORY</code>)
-	 * @param monitor a progress monitor, or <code>null</code> if progress
-	 *    reporting is not desired
-	 * @exception CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li> This resource does not exist.</li>
-	 * <li> The corresponding location in the local file system
-	 *       is occupied by a directory.</li>
-	 * <li> The workspace is not in sync with the corresponding location
-	 *       in the local file system and <code>FORCE</code> is not specified.</li>
-	 * <li> Resource changes are disallowed during certain types of resource change 
-	 *       event notification. See <code>IVirtualResourceChangeEvent</code> for more details.</li>
-	 * <li> The file modification validator disallowed the change.</li>
-	 * </ul>
-	 * @exception OperationCanceledException if the operation is canceled. 
-	 * Cancelation can occur even if no progress monitor is provided.
-	 * @see IVirtualResourceRuleFactory#modifyRule(IVirtualResource)
-	 * @since 2.0
-	 */
-	public void setContents(InputStream source, int updateFlags, IProgressMonitor monitor) throws CoreException;
-
-	/**
-	 * Sets the contents of this file to the bytes in the given file state.
-	 * <p>
-	 * The <code>FORCE</code> update flag controls how this method deals with
-	 * cases where the workspace is not completely in sync with the local file 
-	 * system. If <code>FORCE</code> is not specified, the method will only attempt
-	 * to overwrite a corresponding file in the local file system provided
-	 * it is in sync with the workspace. This option ensures there is no 
-	 * unintended data loss; it is the recommended setting.
-	 * However, if <code>FORCE</code> is specified, an attempt will be made
-	 * to write a corresponding file in the local file system, overwriting any
-	 * existing one if need be. In either case, if this method succeeds, the 
-	 * resource will be marked as being local (even if it wasn't before).
-	 * </p>
-	 * <p>
-	 * The <code>KEEP_HISTORY</code> update flag controls whether or not a copy of
-	 * current contents of this file should be captured in the workspace's local
-	 * history (properties are not recorded in the local history). The local history
-	 * mechanism serves as a safety net to help the user recover from mistakes that
-	 * might otherwise result in data loss. Specifying <code>KEEP_HISTORY</code>
-	 * is recommended except in circumstances where past states of the files are of
-	 * no conceivable interest to the user. Note that local history is maintained
-	 * with each individual project, and gets discarded when a project is deleted
-	 * from the workspace.  This flag is ignored if the file was not previously local.
-	 * </p>
-	 * <p>
-	 * Update flags other than <code>FORCE</code> and <code>KEEP_HISTORY</code> 
-	 * are ignored.
-	 * </p>
-	 * <p>
-	 * Prior to modifying the contents of this file, the file modification validator (if provided 
-	 * by the VCM plug-in), will be given a chance to perform any last minute preparations.  Validation
-	 * is performed by calling <code>IVirtualFileModificationValidator.validateSave</code> on this file.
-	 * If the validation fails, then this operation will fail.
-	 * </p>
-	 * <p>
-	 * This method changes resources; these changes will be reported
-	 * in a subsequent resource change event, including an indication 
-	 * that this file's content have been changed.
-	 * </p>
-	 * <p>
-	 * This method is long-running; progress and cancellation are provided
-	 * by the given progress monitor. 
-	 * </p>
-	 *
-	 * @param source a previous state of this resource
-	 * @param updateFlags bit-wise or of update flag constants
-	 *   (<code>FORCE</code> and <code>KEEP_HISTORY</code>)
-	 * @param monitor a progress monitor, or <code>null</code> if progress
-	 *    reporting is not desired
-	 * @exception CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li> This resource does not exist.</li>
-	 * <li> The state does not exist.</li>
-	 * <li> The corresponding location in the local file system
-	 *       is occupied by a directory.</li>
-	 * <li> The workspace is not in sync with the corresponding location
-	 *       in the local file system and <code>FORCE</code> is not specified.</li>
-	 * <li> Resource changes are disallowed during certain types of resource change 
-	 *       event notification. See <code>IVirtualResourceChangeEvent</code> for more details.</li>
-	 * <li> The file modification validator disallowed the change.</li>
-	 * </ul>
-	 * @exception OperationCanceledException if the operation is canceled. 
-	 * Cancelation can occur even if no progress monitor is provided.
-	 * @see IVirtualResourceRuleFactory#modifyRule(IVirtualResource)
-	 * @since 2.0
-	 */
-	public void setContents(IFileState source, int updateFlags, IProgressMonitor monitor) throws CoreException;
+ 
 	
 	public IFile getRealFile();
 	
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/resources/IVirtualFolder.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/resources/IVirtualFolder.java
index 55c6c55..3cee793 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/resources/IVirtualFolder.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/resources/IVirtualFolder.java
@@ -10,6 +10,7 @@
  *******************************************************************************/ 
 package org.eclipse.wst.common.modulecore.resources;
 
+import org.eclipse.core.resources.IFolder;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
@@ -17,55 +18,6 @@
 
 public interface IVirtualFolder extends IVirtualContainer {
 
-
-	/**
-	 * Creates a new folder resource as a member of this handle's parent resource.
-	 * <p>
-	 * This is a convenience method, fully equivalent to:
-	 * <pre>
-	 *   create((force ? FORCE : IVirtualResource.NONE), local, monitor);
-	 * </pre>
-	 * </p>
-	 * <p>
-	 * This method changes resources; these changes will be reported
-	 * in a subsequent resource change event, including an indication 
-	 * that the folder has been added to its parent.
-	 * </p>
-	 * <p>
-	 * This method is long-running; progress and cancellation are provided
-	 * by the given progress monitor. 
-	 * </p>
-	 * 
-	 * @param force a flag controlling how to deal with resources that
-	 *    are not in sync with the local file system
-	 * @param local a flag controlling whether or not the folder will be local
-	 *    after the creation
-	 * @param monitor a progress monitor, or <code>null</code> if progress
-	 *    reporting is not desired
-	 * @exception CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li> This resource already exists in the workspace.</li>
-	 * <li> The workspace contains a resource of a different type 
-	 *      at the same path as this resource.</li>
-	 * <li> The parent of this resource does not exist.</li>
-	 * <li> The parent of this resource is a project that is not open.</li>
-	 * <li> The parent contains a resource of a different type 
-	 *      at the same path as this resource.</li>
-	 * <li> The name of this resource is not valid (according to 
-	 *    <code>IWorkspace.validateName</code>).</li>
-	 * <li> The corresponding location in the local file system is occupied
-	 *    by a file (as opposed to a directory).</li>
-	 * <li> The corresponding location in the local file system is occupied
-	 *    by a folder and <code>force </code> is <code>false</code>.</li>
-	 * <li> Resource changes are disallowed during certain types of resource change 
-	 *       event notification.  See <code>IVirtualResourceChangeEvent</code> for more details.</li>
-	 * </ul>
-	 * @exception OperationCanceledException if the operation is canceled. 
-	 * Cancelation can occur even if no progress monitor is provided.
-	 * @see IVirtualFolder#create(int,boolean,IProgressMonitor)
-	 */
-	public void create(boolean force, boolean local, IProgressMonitor monitor) throws CoreException;
-
 	/**
 	 * Creates a new folder resource as a member of this handle's parent resource.
 	 * <p>
@@ -122,7 +74,7 @@
 	 * @see IVirtualResourceRuleFactory#createRule(IVirtualResource)
 	 * @since 2.0
 	 */
-	public void create(int updateFlags, boolean local, IProgressMonitor monitor) throws CoreException;
+	public void create(int updateFlags, IProgressMonitor monitor) throws CoreException;
 
 	/**
 	 * Creates a new folder resource as a member of this handle's parent resource.
@@ -191,46 +143,6 @@
 	public void createLink(IPath localLocation, int updateFlags, IProgressMonitor monitor) throws CoreException; 
 
 	/**
-	 * Deletes this resource from the workspace.
-	 * <p>
-	 * This is a convenience method, fully equivalent to:
-	 * <pre>
-	 *   delete((keepHistory ? KEEP_HISTORY : IVirtualResource.NONE) | (force ? FORCE : IVirtualResource.NONE), monitor);
-	 * </pre>
-	 * </p>
-	 * <p>
-	 * This method changes resources; these changes will be reported
-	 * in a subsequent resource change event, including an indication 
-	 * that this folder has been removed from its parent.
-	 * </p>
-	 * <p>
-	 * This method is long-running; progress and cancellation are provided
-	 * by the given progress monitor. 
-	 * </p>
-	 * 
-	 * @param force a flag controlling whether resources that are not
-	 *    in sync with the local file system will be tolerated
-	 * @param keepHistory a flag controlling whether files under this folder
-	 *    should be stored in the workspace's local history
-	 * @param monitor a progress monitor, or <code>null</code> if progress
-	 *    reporting is not desired
-	 * @exception CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li> This resource could not be deleted for some reason.</li>
-	 * <li> This resource is out of sync with the local file system
-	 *      and <code>force</code> is <code>false</code>.</li>
-	 * <li> Resource changes are disallowed during certain types of resource change 
-	 *       event notification. See <code>IVirtualResourceChangeEvent</code> for more details.</li>
-	 * </ul>
-	 * @exception OperationCanceledException if the operation is canceled. 
-	 * Cancelation can occur even if no progress monitor is provided.
-	 *
-	 * @see IVirtualResourceRuleFactory#deleteRule(IVirtualResource)
-	 * @see IVirtualResource#delete(int,IProgressMonitor)
-	 */
-	public void delete(boolean force, boolean keepHistory, IProgressMonitor monitor) throws CoreException;
-
-	/**
 	 * Returns a handle to the file with the given name in this folder.
 	 * <p> 
 	 * This is a resource handle operation; neither the resource nor
@@ -262,53 +174,7 @@
 	 */
 	public IVirtualFolder getFolder(String name);
 
-	/**
-	 * Moves this resource so that it is located at the given path.  
-	 * <p>
-	 * This is a convenience method, fully equivalent to:
-	 * <pre>
-	 *   move(destination, (keepHistory ? KEEP_HISTORY : IVirtualResource.NONE) | (force ? FORCE : IVirtualResource.NONE), monitor);
-	 * </pre>
-	 * </p>
-	 * <p>
-	 * This method changes resources; these changes will be reported
-	 * in a subsequent resource change event, including an indication 
-	 * that this folder has been removed from its parent and a new folder
-	 * has been added to the parent of the destination.
-	 * </p>
-	 * <p>
-	 * This method is long-running; progress and cancellation are provided
-	 * by the given progress monitor. 
-	 * </p>
-	 * 
-	 * @param destination the destination path 
-	 * @param force a flag controlling whether resources that are not
-	 *    in sync with the local file system will be tolerated
-	 * @param keepHistory a flag controlling whether files under this folder
-	 *    should be stored in the workspace's local history
-	 * @param monitor a progress monitor, or <code>null</code> if progress
-	 *    reporting is not desired
-	 * @exception CoreException if this resource could not be moved. Reasons include:
-	 * <ul>
-	 * <li> This resource does not exist.</li>
-	 * <li> This resource or one of its descendents is not local.</li>
-	 * <li> The resource corresponding to the parent destination path does not exist.</li>
-	 * <li> The resource corresponding to the parent destination path is a closed 
-	 *      project.</li>
-	 * <li> A resource at destination path does exist.</li>
-	 * <li> A resource of a different type exists at the destination path.</li>
-	 * <li> This resource or one of its descendents is out of sync with the local file system
-	 *      and <code>force</code> is <code>false</code>.</li>
-	 * <li> The workspace and the local file system are out of sync
-	 *      at the destination resource or one of its descendents.</li>
-	 * <li> Resource changes are disallowed during certain types of resource change 
-	 *       event notification. See <code>IVirtualResourceChangeEvent</code> for more details.</li>
-	 * </ul>
-	 * @exception OperationCanceledException if the operation is canceled. 
-	 * Cancelation can occur even if no progress monitor is provided.
-	 *
-	 * @see IVirtualResourceRuleFactory#moveRule(IVirtualResource, IVirtualResource)
-	 * @see IVirtualResource#move(IPath,int,IProgressMonitor)
-	 */
-	public void move(IPath destination, boolean force, boolean keepHistory, IProgressMonitor monitor) throws CoreException;
+	public IFolder getRealFolder();
+	
+	public IFolder[] getRealFolders();
 }
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/resources/IVirtualResource.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/resources/IVirtualResource.java
index f0a98c8..ede7775 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/resources/IVirtualResource.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/modulecore/resources/IVirtualResource.java
@@ -43,15 +43,7 @@
 	 * @see IVirtualResource#getType()
 	 * @see IVirtualFolder
 	 */
-	public static final int FOLDER = 0x2;
-
-	/**
-	 * Type constant (bit mask value 4) which identifies project resources.
-	 * 
-	 * @see IVirtualResource#getType()
-	 * @see IProject
-	 */
-	public static final int PROJECT = 0x4;
+	public static final int FOLDER = 0x2; 
 
 	/**
 	 * Type constant (bit mask value 8) which identifies the root resource.
@@ -178,6 +170,8 @@
 	 * @since 3.1
 	 */
 	public static final int BACKGROUND_REFRESH = 0x80;
+	
+	public static final int DELETE_METAMODEL_ONLY = 0x10000;
 
 	/*
 	 * ==================================================================== Other constants:
@@ -386,214 +380,8 @@
 	 * @see IResourceVisitor#visit(IVirtualResource)
 	 * @since 2.0
 	 */
-	public void accept(IResourceVisitor visitor, int depth, int memberFlags) throws CoreException; 
-
-	/**
-	 * Makes a copy of this resource at the given path.
-	 * <p>
-	 * This is a convenience method, fully equivalent to:
-	 * 
-	 * <pre>
-	 * copy(destination, (force ? FORCE : IVirtualResource.NONE), monitor);
-	 * </pre>
-	 * 
-	 * </p>
-	 * <p>
-	 * This operation changes resources; these changes will be reported in a subsequent resource
-	 * change event that will include an indication that the resource copy has been added to its new
-	 * parent.
-	 * </p>
-	 * <p>
-	 * This operation is long-running; progress and cancellation are provided by the given progress
-	 * monitor.
-	 * </p>
-	 * 
-	 * @param destination
-	 *            the destination path
-	 * @param force
-	 *            a flag controlling whether resources that are not in sync with the local file
-	 *            system will be tolerated
-	 * @param monitor
-	 *            a progress monitor, or <code>null</code> if progress reporting is not desired
-	 * @exception CoreException
-	 *                if this resource could not be copied. Reasons include:
-	 *                <ul>
-	 *                <li> This resource does not exist.</li>
-	 *                <li> This resource or one of its descendents is not local.</li>
-	 *                <li> The source or destination is the workspace root.</li>
-	 *                <li> The source is a project but the destination is not.</li>
-	 *                <li> The destination is a project but the source is not.</li>
-	 *                <li> The resource corresponding to the parent destination path does not exist.</li>
-	 *                <li> The resource corresponding to the parent destination path is a closed
-	 *                project.</li>
-	 *                <li> A resource at destination path does exist.</li>
-	 *                <li> This resource or one of its descendents is out of sync with the local
-	 *                file system and <code>force</code> is <code>false</code>.</li>
-	 *                <li> The workspace and the local file system are out of sync at the
-	 *                destination resource or one of its descendents.</li>
-	 *                <li> The source resource is a file and the destination path specifies a
-	 *                project.</li>
-	 *                <li> Resource changes are disallowed during certain types of resource change
-	 *                event notification. See <code>IVirtualResourceChangeEvent</code> for more details.</li>
-	 *                </ul>
-	 * @exception OperationCanceledException
-	 *                if the operation is canceled. Cancelation can occur even if no progress
-	 *                monitor is provided.
-	 */
-	public void copy(IPath destination, boolean force, IProgressMonitor monitor) throws CoreException;
-
-	/**
-	 * Makes a copy of this resource at the given path. The resource's descendents are copied as
-	 * well. The path of this resource must not be a prefix of the destination path. The workspace
-	 * root may not be the source or destination location of a copy operation, and a project can
-	 * only be copied to another project. After successful completion, corresponding new resources
-	 * will exist at the given path; their contents and properties will be copies of the originals.
-	 * The original resources are not affected.
-	 * <p>
-	 * The supplied path may be absolute or relative. Absolute paths fully specify the new location
-	 * for the resource, including its project. Relative paths are considered to be relative to the
-	 * container of the resource being copied. A trailing separator is ignored.
-	 * </p>
-	 * <p>
-	 * Calling this method with a one segment absolute destination path is equivalent to calling:
-	 * 
-	 * <pre>
-	 * copy(workspace.newProjectDescription(folder.getName()), updateFlags, monitor);
-	 * </pre>
-	 * 
-	 * </p>
-	 * <p>
-	 * When a resource is copied, its persistent properties are copied with it. Session properties
-	 * and markers are not copied.
-	 * </p>
-	 * <p>
-	 * The <code>FORCE</code> update flag controls how this method deals with cases where the
-	 * workspace is not completely in sync with the local file system. If <code>FORCE</code> is
-	 * not specified, the method will only attempt to copy resources that are in sync with the
-	 * corresponding files and directories in the local file system; it will fail if it encounters a
-	 * resource that is out of sync with the file system. However, if <code>FORCE</code> is
-	 * specified, the method copies all corresponding files and directories from the local file
-	 * system, including ones that have been recently updated or created. Note that in both settings
-	 * of the <code>FORCE</code> flag, the operation fails if the newly created resources in the
-	 * workspace would be out of sync with the local file system; this ensures files in the file
-	 * system cannot be accidentally overwritten.
-	 * </p>
-	 * <p>
-	 * The <code>SHALLOW</code> update flag controls how this method deals with linked resources.
-	 * If <code>SHALLOW</code> is not specified, then the underlying contents of the linked
-	 * resource will always be copied in the file system. In this case, the destination of the copy
-	 * will never be a linked resource or contain any linked resources. If <code>SHALLOW</code> is
-	 * specified when a linked resource is copied into another project, a new linked resource is
-	 * created in the destination project that points to the same file system location. When a
-	 * project containing linked resources is copied, the new project will contain the same linked
-	 * resources pointing to the same file system locations. For both of these shallow cases, no
-	 * files on disk under the linked resource are actually copied. With the <code>SHALLOW</code>
-	 * flag, copying of linked resources into anything other than a project is not permitted. The
-	 * <code>SHALLOW</code> update flag is ignored when copying non- linked resources.
-	 * </p>
-	 * <p>
-	 * Update flags other than <code>FORCE</code> and <code>SHALLOW</code> are ignored.
-	 * </p>
-	 * <p>
-	 * This operation changes resources; these changes will be reported in a subsequent resource
-	 * change event that will include an indication that the resource copy has been added to its new
-	 * parent.
-	 * </p>
-	 * <p>
-	 * An attempt will be made to copy the local history for this resource and its children, to the
-	 * destination. Since local history existence is a safety-net mechanism, failure of this action
-	 * will not result in automatic failure of the copy operation.
-	 * </p>
-	 * <p>
-	 * This operation is long-running; progress and cancellation are provided by the given progress
-	 * monitor.
-	 * </p>
-	 * 
-	 * @param destination
-	 *            the destination path
-	 * @param updateFlags
-	 *            bit-wise or of update flag constants (<code>FORCE</code> and
-	 *            <code>SHALLOW</code>)
-	 * @param monitor
-	 *            a progress monitor, or <code>null</code> if progress reporting is not desired
-	 * @exception CoreException
-	 *                if this resource could not be copied. Reasons include:
-	 *                <ul>
-	 *                <li> This resource does not exist.</li>
-	 *                <li> This resource or one of its descendents is not local.</li>
-	 *                <li> The source or destination is the workspace root.</li>
-	 *                <li> The source is a project but the destination is not.</li>
-	 *                <li> The destination is a project but the source is not.</li>
-	 *                <li> The resource corresponding to the parent destination path does not exist.</li>
-	 *                <li> The resource corresponding to the parent destination path is a closed
-	 *                project.</li>
-	 *                <li> The source is a linked resource, but the destination is not a project,
-	 *                and <code>SHALLOW</code> is specified.</li>
-	 *                <li> A resource at destination path does exist.</li>
-	 *                <li> This resource or one of its descendents is out of sync with the local
-	 *                file system and <code>FORCE</code> is not specified.</li>
-	 *                <li> The workspace and the local file system are out of sync at the
-	 *                destination resource or one of its descendents.</li>
-	 *                <li> The source resource is a file and the destination path specifies a
-	 *                project.</li>
-	 *                <li> The source is a linked resource, and the destination path does not
-	 *                specify a project.</li>
-	 *                <li> The location of the source resource on disk is the same or a prefix of
-	 *                the location of the destination resource on disk.</li>
-	 *                <li> Resource changes are disallowed during certain types of resource change
-	 *                event notification. See <code>IVirtualResourceChangeEvent</code> for more details.</li>
-	 *                </ul>
-	 * @exception OperationCanceledException
-	 *                if the operation is canceled. Cancelation can occur even if no progress
-	 *                monitor is provided.
-	 * @see #FORCE
-	 * @see #SHALLOW
-	 * @see IVirtualResourceRuleFactory#copyRule(IVirtualResource, IVirtualResource)
-	 * @since 2.0
-	 */
-	public void copy(IPath destination, int updateFlags, IProgressMonitor monitor) throws CoreException;
-
-	/**
-	 * Deletes this resource from the workspace.
-	 * <p>
-	 * This is a convenience method, fully equivalent to:
-	 * 
-	 * <pre>
-	 * delete(force ? FORCE : IVirtualResource.NONE, monitor);
-	 * </pre>
-	 * 
-	 * </p>
-	 * <p>
-	 * This method changes resources; these changes will be reported in a subsequent resource change
-	 * event.
-	 * </p>
-	 * <p>
-	 * This method is long-running; progress and cancellation are provided by the given progress
-	 * monitor.
-	 * </p>
-	 * 
-	 * @param force
-	 *            a flag controlling whether resources that are not in sync with the local file
-	 *            system will be tolerated
-	 * @param monitor
-	 *            a progress monitor, or <code>null</code> if progress reporting is not desired
-	 * @exception CoreException
-	 *                if this method fails. Reasons include:
-	 *                <ul>
-	 *                <li> This resource could not be deleted for some reason.</li>
-	 *                <li> This resource or one of its descendents is out of sync with the local
-	 *                file system and <code>force</code> is <code>false</code>.</li>
-	 *                <li> Resource changes are disallowed during certain types of resource change
-	 *                event notification. See <code>IVirtualResourceChangeEvent</code> for more details.</li>
-	 *                </ul>
-	 * @exception OperationCanceledException
-	 *                if the operation is canceled. Cancelation can occur even if no progress
-	 *                monitor is provided.
-	 * 
-	 * @see IVirtualResource#delete(int,IProgressMonitor)
-	 */
-	public void delete(boolean force, IProgressMonitor monitor) throws CoreException;
-
+	public void accept(IResourceVisitor visitor, int depth, int memberFlags) throws CoreException;  
+	
 	/**
 	 * Deletes this resource from the workspace. Deletion applies recursively to all members of this
 	 * resource in a "best- effort" fashion. That is, all resources which can be deleted are
@@ -848,9 +636,7 @@
 	 * 
 	 * @return the project handle
 	 */
-	public IProject getProject();
-
- 
+	public IProject getProject(); 
 
 	/**
 	 * Returns the type of this resource. The returned value will be one of <code>FILE</code>,
@@ -887,204 +673,5 @@
 	 * @see IProject#isOpen()
 	 */
 	public boolean isAccessible();  
-	
-	/**
-	 * Returns whether this resource is marked as read-only in the file system.
-	 * 
-	 * @return <code>true</code> if this resource is read-only, <code>false</code> otherwise
-	 * @deprecated use <tt>IVirtualResource#getResourceAttributes()</tt>
-	 */
-	public boolean isReadOnly();  
-
-	/**
-	 * Moves this resource so that it is located at the given path.
-	 * <p>
-	 * This is a convenience method, fully equivalent to:
-	 * 
-	 * <pre>
-	 * move(destination, force ? FORCE : IVirtualResource.NONE, monitor);
-	 * </pre>
-	 * 
-	 * </p>
-	 * <p>
-	 * This method changes resources; these changes will be reported in a subsequent resource change
-	 * event that will include an indication that the resource has been removed from its parent and
-	 * that a corresponding resource has been added to its new parent. Additional information
-	 * provided with resource delta shows that these additions and removals are related.
-	 * </p>
-	 * <p>
-	 * This method is long-running; progress and cancellation are provided by the given progress
-	 * monitor.
-	 * </p>
-	 * 
-	 * @param destination
-	 *            the destination path
-	 * @param force
-	 *            a flag controlling whether resources that are not in sync with the local file
-	 *            system will be tolerated
-	 * @param monitor
-	 *            a progress monitor, or <code>null</code> if progress reporting is not desired
-	 * @exception CoreException
-	 *                if this resource could not be moved. Reasons include:
-	 *                <ul>
-	 *                <li> This resource does not exist.</li>
-	 *                <li> This resource or one of its descendents is not local.</li>
-	 *                <li> The source or destination is the workspace root.</li>
-	 *                <li> The source is a project but the destination is not.</li>
-	 *                <li> The destination is a project but the source is not.</li>
-	 *                <li> The resource corresponding to the parent destination path does not exist.</li>
-	 *                <li> The resource corresponding to the parent destination path is a closed
-	 *                project.</li>
-	 *                <li> A resource at destination path does exist.</li>
-	 *                <li> A resource of a different type exists at the destination path.</li>
-	 *                <li> This resource or one of its descendents is out of sync with the local
-	 *                file system and <code>force</code> is <code>false</code>.</li>
-	 *                <li> The workspace and the local file system are out of sync at the
-	 *                destination resource or one of its descendents.</li>
-	 *                <li> Resource changes are disallowed during certain types of resource change
-	 *                event notification. See <code>IVirtualResourceChangeEvent</code> for more details.</li>
-	 *                <li> The source resource is a file and the destination path specifies a
-	 *                project.</li>
-	 *                </ul>
-	 * @exception OperationCanceledException
-	 *                if the operation is canceled. Cancelation can occur even if no progress
-	 *                monitor is provided.
-	 * @see IVirtualResourceDelta#getFlags()
-	 */
-	public void move(IPath destination, boolean force, IProgressMonitor monitor) throws CoreException;
-
-	/**
-	 * Moves this resource so that it is located at the given path. The path of the resource must
-	 * not be a prefix of the destination path. The workspace root may not be the source or
-	 * destination location of a move operation, and a project can only be moved to another project.
-	 * After successful completion, the resource and any direct or indirect members will no longer
-	 * exist; but corresponding new resources will now exist at the given path.
-	 * <p>
-	 * The supplied path may be absolute or relative. Absolute paths fully specify the new location
-	 * for the resource, including its project. Relative paths are considered to be relative to the
-	 * container of the resource being moved. A trailing slash is ignored.
-	 * </p>
-	 * <p>
-	 * Calling this method with a one segment absolute destination path is equivalent to calling:
-	 * 
-	 * <pre>
-	 * IProjectDescription description = getDescription();
-	 * description.setName(path.lastSegment());
-	 * move(description, updateFlags, monitor);
-	 * </pre>
-	 * 
-	 * </p>
-	 * <p>
-	 * When a resource moves, its session and persistent properties move with it. Likewise for all
-	 * other attributes of the resource including markers.
-	 * </p>
-	 * <p>
-	 * The <code>FORCE</code> update flag controls how this method deals with cases where the
-	 * workspace is not completely in sync with the local file system. If <code>FORCE</code> is
-	 * not specified, the method will only attempt to move resources that are in sync with the
-	 * corresponding files and directories in the local file system; it will fail if it encounters a
-	 * resource that is out of sync with the file system. However, if <code>FORCE</code> is
-	 * specified, the method moves all corresponding files and directories from the local file
-	 * system, including ones that have been recently updated or created. Note that in both settings
-	 * of the <code>FORCE</code> flag, the operation fails if the newly created resources in the
-	 * workspace would be out of sync with the local file system; this ensures files in the file
-	 * system cannot be accidentally overwritten.
-	 * </p>
-	 * <p>
-	 * The <code>KEEP_HISTORY</code> update flag controls whether or not file that are about to be
-	 * deleted from the local file system have their current contents saved in the workspace's local
-	 * history. The local history mechanism serves as a safety net to help the user recover from
-	 * mistakes that might otherwise result in data loss. Specifying <code>KEEP_HISTORY</code> is
-	 * recommended except in circumstances where past states of the files are of no conceivable
-	 * interest to the user. Note that local history is maintained with each individual project, and
-	 * gets discarded when a project is deleted from the workspace. Hence <code>KEEP_HISTORY</code>
-	 * is only really applicable when moving files and folders, but not whole projects.
-	 * </p>
-	 * <p>
-	 * If this resource is not a project, an attempt will be made to copy the local history for this
-	 * resource and its children, to the destination. Since local history existence is a safety-net
-	 * mechanism, failure of this action will not result in automatic failure of the move operation.
-	 * </p>
-	 * <p>
-	 * The <code>SHALLOW</code> update flag controls how this method deals with linked resources.
-	 * If <code>SHALLOW</code> is not specified, then the underlying contents of the linked
-	 * resource will always be moved in the file system. In this case, the destination of the move
-	 * will never be a linked resource or contain any linked resources. If <code>SHALLOW</code> is
-	 * specified when a linked resource is moved into another project, a new linked resource is
-	 * created in the destination project that points to the same file system location. When a
-	 * project containing linked resources is moved, the new project will contain the same linked
-	 * resources pointing to the same file system locations. For either of these cases, no files on
-	 * disk under the linked resource are actually moved. With the <code>SHALLOW</code> flag,
-	 * moving of linked resources into anything other than a project is not permitted. The
-	 * <code>SHALLOW</code> update flag is ignored when moving non- linked resources.
-	 * </p>
-	 * <p>
-	 * Update flags other than <code>FORCE</code>, <code>KEEP_HISTORY</code>and
-	 * <code>SHALLOW</code> are ignored.
-	 * </p>
-	 * <p>
-	 * This method changes resources; these changes will be reported in a subsequent resource change
-	 * event that will include an indication that the resource has been removed from its parent and
-	 * that a corresponding resource has been added to its new parent. Additional information
-	 * provided with resource delta shows that these additions and removals are related.
-	 * </p>
-	 * <p>
-	 * This method is long-running; progress and cancellation are provided by the given progress
-	 * monitor.
-	 * </p>
-	 * 
-	 * @param destination
-	 *            the destination path
-	 * @param updateFlags
-	 *            bit-wise or of update flag constants (<code>FORCE</code>,
-	 *            <code>KEEP_HISTORY</code> and <code>SHALLOW</code>)
-	 * @param monitor
-	 *            a progress monitor, or <code>null</code> if progress reporting is not desired
-	 * @exception CoreException
-	 *                if this resource could not be moved. Reasons include:
-	 *                <ul>
-	 *                <li> This resource does not exist.</li>
-	 *                <li> This resource or one of its descendents is not local.</li>
-	 *                <li> The source or destination is the workspace root.</li>
-	 *                <li> The source is a project but the destination is not.</li>
-	 *                <li> The destination is a project but the source is not.</li>
-	 *                <li> The resource corresponding to the parent destination path does not exist.</li>
-	 *                <li> The resource corresponding to the parent destination path is a closed
-	 *                project.</li>
-	 *                <li> The source is a linked resource, but the destination is not a project and
-	 *                <code>SHALLOW</code> is specified.</li>
-	 *                <li> A resource at destination path does exist.</li>
-	 *                <li> A resource of a different type exists at the destination path.</li>
-	 *                <li> This resource or one of its descendents is out of sync with the local
-	 *                file system and <code>force</code> is <code>false</code>.</li>
-	 *                <li> The workspace and the local file system are out of sync at the
-	 *                destination resource or one of its descendents.</li>
-	 *                <li> The source resource is a file and the destination path specifies a
-	 *                project.</li>
-	 *                <li> The location of the source resource on disk is the same or a prefix of
-	 *                the location of the destination resource on disk.</li>
-	 *                <li> Resource changes are disallowed during certain types of resource change
-	 *                event notification. See <code>IVirtualResourceChangeEvent</code> for more details.</li>
-	 *                </ul>
-	 * @exception OperationCanceledException
-	 *                if the operation is canceled. Cancelation can occur even if no progress
-	 *                monitor is provided.
-	 * @see IVirtualResourceDelta#getFlags()
-	 * @see #FORCE
-	 * @see #KEEP_HISTORY
-	 * @see #SHALLOW
-	 * @see IVirtualResourceRuleFactory#moveRule(IVirtualResource, IVirtualResource)
-	 * @since 2.0
-	 */
-	public void move(IPath destination, int updateFlags, IProgressMonitor monitor) throws CoreException; 
-
-	/**
-	 * Sets or unsets this resource as read-only in the file system.
-	 * 
-	 * @param readOnly
-	 *            <code>true</code> to set it to read-only, <code>false</code> to unset
-	 * @deprecated use <tt>IVirtualResource#setResourceAttributes(ResourceAttributes)</tt>
-	 */
-	public void setReadOnly(boolean readOnly);
  
 }
