diff --git a/bundles/org.eclipse.core.resources/.project b/bundles/org.eclipse.core.resources/.project
index 26047c9..fb58441 100644
--- a/bundles/org.eclipse.core.resources/.project
+++ b/bundles/org.eclipse.core.resources/.project
@@ -14,39 +14,6 @@
 			<arguments>
 			</arguments>
 		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
-			<arguments>
-				<dictionary>
-					<key>!{tool_args}</key>
-					<value>-DbuildType=${build_type}</value>
-				</dictionary>
-				<dictionary>
-					<key>!{tool_loc}</key>
-					<value>${workspace_loc:/org.eclipse.core.resources/scripts/buildExtraJAR.xml}</value>
-				</dictionary>
-				<dictionary>
-					<key>!{tool_dir}</key>
-					<value></value>
-				</dictionary>
-				<dictionary>
-					<key>!{tool_refresh}</key>
-					<value>${none}</value>
-				</dictionary>
-				<dictionary>
-					<key>!{tool_name}</key>
-					<value>org.eclipse.core.resources extra builder</value>
-				</dictionary>
-				<dictionary>
-					<key>!{tool_type}</key>
-					<value>org.eclipse.ui.externaltools.type.ant</value>
-				</dictionary>
-				<dictionary>
-					<key>!{tool_show_log}</key>
-					<value>true</value>
-				</dictionary>
-			</arguments>
-		</buildCommand>
 	</buildSpec>
 	<natures>
 		<nature>org.eclipse.jdt.core.javanature</nature>
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/FileSystemResourceManager.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/FileSystemResourceManager.java
index 3ccc741..7177ae9 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/FileSystemResourceManager.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/FileSystemResourceManager.java
@@ -239,6 +239,8 @@
 	}
 }
 public IPath locationFor(IResource target) {
+	//note: this method is a critical performance path,
+	//code may be inlined to prevent method calls
 	switch (target.getType()) {
 		case IResource.ROOT :
 			return Platform.getLocation();
@@ -250,7 +252,22 @@
 			}
 			return getProjectDefaultLocation(project);
 		default:
-			//first get the location of the project (without the project name)
+			//check if the resource is mounted
+			IPath targetPath = target.getFullPath();
+			int numSegments = targetPath.segmentCount();
+			IResource mounted = target;
+			if (numSegments > 2) {
+				//parent could be a mounted resource
+				mounted = workspace.getRoot().getFolder(
+					targetPath.removeLastSegments(numSegments-2));
+			}
+			ResourceInfo mountedInfo = ((Resource)mounted).getResourceInfo(true, false);
+			if (mountedInfo != null && mountedInfo.isSet(M_MOUNTED)) {
+				String location = (String)mountedInfo.getSessionProperty(K_MOUNT_LOCATION);
+				return new Path(location).append(targetPath.removeFirstSegments(2));
+			}
+				
+			//not a mounted resource -- get location of project
 			description = ((Project)target.getProject()).internalGetDescription();
 			if (description != null && description.getLocation() != null) {
 				return description.getLocation().append(target.getProjectRelativePath());
@@ -259,6 +276,13 @@
 			}
 	}
 }
+public void mount(Folder target, IPath localLocation) {
+	//resource already exists when mounting -- just need to update sync info
+	long lastModified = CoreFileSystemLibrary.getLastModified(localLocation.toFile().getAbsolutePath());
+	ResourceInfo info = ((Resource) target).getResourceInfo(false, true);
+	updateLocalSync(info, lastModified, false);
+}
+
 public void move(IResource target, IPath destination, boolean keepHistory, IProgressMonitor monitor) throws CoreException {
 	monitor = Policy.monitorFor(monitor);
 	try {
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/UnifiedTree.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/UnifiedTree.java
index 2945d18..afa4f92 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/UnifiedTree.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/UnifiedTree.java
@@ -80,59 +80,72 @@
 	IResource parent = node.getResource();
 
 	/* is there a possibility to have children? */
-	if (parent.getType() == IResource.FILE && node.isFile())
+	int parentType = parent.getType();
+	if (parentType == IResource.FILE && node.isFile())
 		return;
 
 	/* get the list of resources in the file system */
 	String parentLocalLocation = node.getLocalLocation();
 	Object[] list = getLocalList(node, parentLocalLocation);
-	int index = 0;
+	int localIndex = 0;
 
 	/* get the list of resources in the workspace */
-	if (node.existsInWorkspace() && (parent.getType() == IResource.FOLDER || parent.getType() == IResource.PROJECT)) {
+	if (node.existsInWorkspace() && (parentType == IResource.FOLDER || parentType == IResource.PROJECT)) {
 		IResource target = null;
-		boolean next = true;
 		UnifiedTreeNode child = null;
 		IResource[] members = ((IContainer) parent).members(IContainer.INCLUDE_TEAM_PRIVATE_MEMBERS);
-		int i = 0;
-		while (true) {
-			if (next) {
-				if (i >= members.length)
-					break;
-				target = members[i++];
-			}
+		int workspaceIndex = 0;
+		//iterate simultaneously over file system and workspace members
+		while (workspaceIndex < members.length) {
+			target = members[workspaceIndex];
 			String name = target.getName();
-			String localName = (list != null && index < list.length) ? (String) list[index] : null;
+			String localName = (list != null && localIndex < list.length) ? (String) list[localIndex] : null;
 			int comp = localName != null ? name.compareTo(localName) : -1;
-			if (comp == 0) {
+			//special handling for mounted resources
+			if (parentType == IResource.PROJECT && target.isMounted()) {
+				child = createChildForMountedResource(target);
+				workspaceIndex++;
+				//if there is a matching local file, skip it - it will be blocked by the mounted resource
+				if (comp == 0)
+					localIndex++;
+			} else if (comp == 0) {
 				// resource exists in workspace and file system
 				String localLocation = createChildLocation(parentLocalLocation, localName);
 				long stat = CoreFileSystemLibrary.getStat(localLocation);
 				child = createNode(target, stat, localLocation, localName, true);
-				index++;
-				next = true;
+				localIndex++;
+				workspaceIndex++;
 			} else
 				if (comp > 0) {
 					// resource exists only in file system
 					child = createChildNodeFromFileSystem(node, parentLocalLocation, localName);
-					index++;
-					next = false;
+					localIndex++;
 				} else {
 					// resource exists only in the workspace
 					child = createNode(target, 0, null, null, true);
-					next = true;
+					workspaceIndex++;
 				}
 			addChildToTree(node, child);
 		}
 	}
 
 	/* process any remaining resource from the file system */
-	addChildrenFromFileSystem(node, parentLocalLocation, list, index);
+	addChildrenFromFileSystem(node, parentLocalLocation, list, localIndex);
 
 	/* if we added children, add the childMarker separator */
 	if (node.getFirstChild() != null)
 		addChildrenMarker();
 }
+/**
+ * Creates a tree node for a resource that is mounted in a different file system location.
+ */
+protected UnifiedTreeNode createChildForMountedResource(IResource target) {
+	IPath location = target.getLocation();
+	String locationString = location.toOSString();
+	String localName = location.lastSegment();
+	long stat = CoreFileSystemLibrary.getStat(locationString);
+	return new UnifiedTreeNode(this, target, stat, locationString, localName, true);
+}
 protected void addChildrenFromFileSystem(UnifiedTreeNode node, String parentLocalLocation, Object[] list, int index) throws CoreException {
 	if (list == null)
 		return;
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Folder.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Folder.java
index 7404193..1ccc22a 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Folder.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Folder.java
@@ -10,12 +10,10 @@
  ******************************************************************************/
 package org.eclipse.core.internal.resources;
 
-import org.eclipse.core.resources.*;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.internal.localstore.CoreFileSystemLibrary;
 import org.eclipse.core.internal.utils.Policy;
+import org.eclipse.core.resources.*;
+import org.eclipse.core.runtime.*;
 
 public class Folder extends Container implements IFolder {
 protected Folder(IPath path, Workspace container) {
@@ -159,4 +157,63 @@
 	}
 }
 
+/**
+ * @see org.eclipse.core.resources.IFolder#mount(IPath, int, IProgressMonitor)
+ */
+public void mount(IPath localLocation, int updateFlags, IProgressMonitor monitor) throws CoreException {
+	monitor = Policy.monitorFor(monitor);
+	try {
+		String message = Policy.bind("resources.mounting", getFullPath().toString()); //$NON-NLS-1$
+		monitor.beginTask(message, Policy.totalWork);
+		checkValidPath(path, FOLDER);
+		try {
+			workspace.prepareOperation();
+			assertMountRequirements(localLocation);
+			workspace.beginOperation(true);
+			ResourceInfo info = workspace.createResource(this, false);
+			info.setSessionProperty(K_MOUNT_LOCATION, localLocation.toString());
+			info.set(M_MOUNTED);
+			getLocalManager().mount(this, localLocation);
+			monitor.worked(Policy.opWork * 10 / 100);
+			refreshLocal(DEPTH_INFINITE, Policy.subMonitorFor(monitor, Policy.opWork * 90 / 100));
+		} catch (OperationCanceledException e) {
+			workspace.getWorkManager().operationCanceled();
+			throw e;
+		} finally {
+			workspace.endOperation(true, Policy.subMonitorFor(monitor, Policy.buildWork));
+		}
+	} finally {
+		monitor.done();
+	}
+}
+
+/**
+ * @see org.eclipse.core.resources.IFolder#unmount(int, IProgressMonitor)
+ */
+public void unmount(int updateFlags, IProgressMonitor monitor) throws CoreException {
+	monitor = Policy.monitorFor(monitor);
+	try {
+		String message = Policy.bind("resources.unmounting", getFullPath().toString()); //$NON-NLS-1$
+		monitor.beginTask(message, Policy.totalWork);
+		try {
+			workspace.prepareOperation();
+			ResourceInfo info = getResourceInfo(true, false);
+			checkExists(getFlags(info), true);
+			//check if mounted
+			if (!info.isSet(M_MOUNTED)) {
+				String msg = Policy.bind("resources.notMounted", getFullPath().toString());//$NON-NLS-1$
+				throw new ResourceException(IResourceStatus.RESOURCE_NOT_MOUNTED, getFullPath(), msg, null);
+			}
+			workspace.beginOperation(true);
+			deleteResource(true, null);
+		} catch (OperationCanceledException e) {
+			workspace.getWorkManager().operationCanceled();
+			throw e;
+		} finally {
+			workspace.endOperation(true, Policy.subMonitorFor(monitor, Policy.buildWork));
+		}
+	} finally {
+		monitor.done();
+	}
+}
 }
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ICoreConstants.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ICoreConstants.java
index c64d337..c6a040c 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ICoreConstants.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ICoreConstants.java
@@ -15,9 +15,11 @@
 
 public interface ICoreConstants {
 	
-	// Standard resource SessionProperties
+	// Standard resource properties
 	/** map of builders to their last built state. */
 	public static final QualifiedName K_BUILD_MAP = new QualifiedName(ResourcesPlugin.PI_RESOURCES, "BuildMap"); //$NON-NLS-1$
+	/** local file system location for mounted resources */
+	public static final QualifiedName K_MOUNT_LOCATION = new QualifiedName(ResourcesPlugin.PI_RESOURCES, "MountLocation"); //$NON-NLS-1$
 
 	// resource info constants
 	static final long I_UNKNOWN_SYNC_INFO = -2;
@@ -43,6 +45,11 @@
 	 * @since 2.0
 	 */
 	static final int M_TEAM_PRIVATE_MEMBER = 0x8000;
+	/** 
+	 * Marks this resource as a mounted resource.
+	 * @since 2.1
+	 */
+	static final int M_MOUNTED = 0x10000;
 	static final int NULL_FLAG = -1;
 
 	// Internal status codes	
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Resource.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Resource.java
index 9f8a21e..c24c5e3 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Resource.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/Resource.java
@@ -12,6 +12,7 @@
 
 import java.net.MalformedURLException;
 import java.net.URL;
+
 import org.eclipse.core.internal.localstore.*;
 import org.eclipse.core.internal.properties.PropertyManager;
 import org.eclipse.core.internal.utils.Assert;
@@ -78,6 +79,27 @@
 		Assert.isTrue(false, status.getChildren()[0].getMessage());
 	}
 }
+protected void assertMountRequirements(IPath localLocation) throws CoreException {
+	checkDoesNotExist(getFlags(getResourceInfo(false, false)), true);
+	Container parent = (Container) getParent();
+	if (parent == null || parent.getType() != IResource.PROJECT) {
+		String msg = Policy.bind("resources.mountNonProject", getFullPath().toString());//$NON-NLS-1$
+		Assert.isLegal(false, msg);
+	}
+	parent.checkAccessible(getFlags(parent.getResourceInfo(false, false)));
+	java.io.File localFile = localLocation.toFile();
+	if (!localFile.exists()) {
+		String msg = Policy.bind("resources.mountDoesNotExist", getFullPath().toString());//$NON-NLS-1$
+		throw new ResourceException(IResourceStatus.NOT_FOUND_LOCAL, getFullPath(), msg, null);
+	}
+	//resource type and file system type must match
+	if ((getType() == IResource.FOLDER) != localFile.isDirectory()) {
+		String msg = Policy.bind("resources.mountWrongType", getFullPath().toString());//$NON-NLS-1$
+		throw new ResourceException(IResourceStatus.WRONG_TYPE_LOCAL, getFullPath(), msg, null);
+	}
+	//TODO:The corresponding location in the local file system is already 
+	//associated with a resource in this workspace.</li>
+}
 protected void assertMoveRequirements(IPath destination, int destinationType) throws CoreException {
 	IStatus status = checkMoveRequirements(destination, destinationType);
 	if (!status.isOK()) {
@@ -764,6 +786,13 @@
 		return flags != NULL_FLAG && ResourceInfo.isSet(flags, M_LOCAL_EXISTS);
 }
 /**
+ * @see org.eclipse.core.resources.IResource#isMounted()
+ */
+public boolean isMounted() {
+	ResourceInfo info = getResourceInfo(false, false);
+	return info != null && info.isSet(M_MOUNTED);
+}
+/**
  * @see IResource
  */
 public boolean isPhantom() {
@@ -1185,7 +1214,4 @@
 		}
 	}
 }
-
-
-
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/IFile.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/IFile.java
index beb92a0..6d43bf8 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/IFile.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/IFile.java
@@ -437,6 +437,54 @@
 public boolean isReadOnly();
 
 /**
+ * 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.  This resource must not already exist; the file
+ * specified by the given local location must already exist.  This handle's parent
+ * resource must be a project.
+ * <p>
+ * There are currently no update flags applicable for this operation.
+ * </p>
+ * <p>
+ * This method synchronizes this resource with the local file system at the given
+ * location.
+ * </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 updateFlags bit-wise or of update flag constants
+ *   (none are currently applicable)
+ * @param localLocation a file system path where the file should be mounted
+ * @param monitor a progress monitor, or <code>null</code> if progress
+ *    reporting and cancellation are 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 closed project.</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 (as opposed to a file).</li>
+ * <li> The corresponding location in the local file system is already 
+ * 	associated with a resource in this workspace.</li>
+ * <li> Resource changes are disallowed during certain types of resource change 
+ *       event notification.  See IResourceChangeEvent for more details.</li>
+ * </ul>
+ * @see #unmount
+ * @since 2.1
+ */
+public void mount(IPath localLocation, int updateFlags, IProgressMonitor monitor) throws CoreException;
+/**
  * Moves this resource to be at the given location.
  * <p>
  * This is a convenience method, fully equivalent to:
@@ -631,6 +679,42 @@
  * @since 2.0
  */
 public void setContents(InputStream source, int updateFlags, IProgressMonitor monitor) throws CoreException;
+/**
+ * Removes this mounted file from the workspace, but leaves the 
+ * contents in the file system intact.  This operation is only allowed
+ * on files that have been mounted with the <code>mount</code>
+ * method.
+ * <p>
+ * Unmounting a resource also deletes its session and persistent 
+ * properties and markers.
+ * </p>
+ * <p>
+ * Unmounting a resource which has sync information converts the resource 
+ * to a phantom and retains the sync information for future use.
+ * </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 updateFlags bit-wise or of update flag constants 
+ *   (none are currently applicable)
+ * @param monitor a progress monitor, or <code>null</code> if progress
+ *    reporting and cancellation are not desired
+ * @exception CoreException if this method fails. Reasons include:
+ * <ul>
+ * <li> This resource does not exist.</li>
+ * <li> Resource changes are disallowed during certain types of resource change 
+ *       event notification. See IResourceChangeEvent for more details.</li>
+ * </ul>
+ * @see #mount
+ * @since 2.1
+ */
+public void unmount(int updateFlags, IProgressMonitor monitor) throws CoreException;
 
 /**
  * Sets the contents of this file to the bytes in the given file state.
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/IFolder.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/IFolder.java
index 2999ec3..0df5caa 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/IFolder.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/IFolder.java
@@ -200,6 +200,53 @@
  * @see #getFile
  */
 public IFolder getFolder(String name);
+/**
+ * Creates a new folder resource as a member of this handle's parent resource.
+ * The folder's contents will be located in the directory specified by the given
+ * file system path.
+ * <p>
+ * There are currently no update flags applicable for this operation.
+ * </p>
+ * <p>
+ * This method synchronizes this resource with the local file system at the given
+ * location.
+ * </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 updateFlags bit-wise or of update flag constants
+ *   (none are currently applicable)
+ * @param localLocation a file system path where the folder should be mounted
+ * @param monitor a progress monitor, or <code>null</code> if progress
+ *    reporting and cancellation are 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 not an open project</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 does not exist.</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 already 
+ * 	associated with a resource in this workspace.</li>
+ * <li> Resource changes are disallowed during certain types of resource change 
+ *       event notification.  See IResourceChangeEvent for more details.</li>
+ * </ul>
+ * @see #unmount
+ * @since 2.1
+ */
+public void mount(IPath localLocation, int updateFlags, IProgressMonitor monitor) throws CoreException;
 
 /**
  * Moves this resource so that it is located at the given path.  
@@ -247,4 +294,42 @@
  * @see IResource#move(IPath,int,IProgressMonitor)
  */
 public void move(IPath destination, boolean force, boolean keepHistory, IProgressMonitor monitor) throws CoreException;
+/**
+ * Removes this mounted folder from the workspace, but leaves the 
+ * contents in the file system intact.  This operation is only allowed
+ * on folders that have been mounted with the <code>mount</code>
+ * method.
+ * <p>
+ * Unmounting a resource also deletes its session and persistent 
+ * properties and markers.
+ * </p>
+ * <p>
+ * Unmounting a resource which has sync information converts the resource 
+ * to a phantom and retains the sync information for future use.
+ * </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 updateFlags bit-wise or of update flag constants 
+ *   (none are currently applicable)
+ * @param monitor a progress monitor, or <code>null</code> if progress
+ *    reporting and cancellation are not desired
+ * @exception CoreException if this method fails. Reasons include:
+ * <ul>
+ * <li> This resource does not exist.</li>
+ * <li> Resource changes are disallowed during certain types of resource change 
+ *       event notification. See IResourceChangeEvent for more details.</li>
+ * <li> This resource is not a mounted folder.</li>
+ * </ul>
+ * @see #mount
+ * @see IResource#isMounted
+ * @since 2.1
+ */
+public void unmount(int updateFlags, IProgressMonitor monitor) throws CoreException;
 }
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/IResource.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/IResource.java
index ce2ec72..dd26f45 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/IResource.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/IResource.java
@@ -329,46 +329,6 @@
  *    reporting and cancellation are not desired
  */
 public void clearHistory(IProgressMonitor monitor) throws CoreException;
-
-/**
- * Makes a copy of this project using the given project description.
- * <p>
- * This is a convenience method, fully equivalent to:
- * <pre>
- *   copy(description, (force ? FORCE : IResource.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 description the destination project description
- * @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 and cancellation are 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> This resource is not a project.</li>
- * <li> The project described by the given description already exists.</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 IResourceChangeEvent for more details.</li>
- * </ul>
- */
-public void copy(IProjectDescription description, boolean force, IProgressMonitor monitor) throws CoreException;
-
 /**
  * Makes a copy of this resource at the given path. 
  * <p>
@@ -412,69 +372,6 @@
  * </ul>
  */
 public void copy(IPath destination, boolean force, IProgressMonitor monitor) throws CoreException;
-
-/**
- * Makes a copy of this project using the given project description. 
- * The project's descendents are copied as well. The description 
- * specifies the name, location and attributes of the new 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>
- * 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>
- * Update flags other than <code>FORCE</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>
- * This operation is long-running; progress and cancellation are provided
- * by the given progress monitor. 
- * </p>
- *
- * @param description the destination project description
- * @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 and cancellation are 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> This resource is not a project.</li>
- * <li> The project described by the given description already exists.</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> Resource changes are disallowed during certain types of resource change 
- *       event notification. See IResourceChangeEvent for more details.</li>
- * </ul>
- * @since 2.0
- */
-public void copy(IProjectDescription description, int updateFlags, IProgressMonitor monitor) throws CoreException;
-
 /**
  * Makes a copy of this resource at the given path. The resource's
  * descendents are copied as well. 
@@ -557,6 +454,113 @@
  * @since 2.0
  */
 public void copy(IPath destination, int updateFlags, IProgressMonitor monitor) throws CoreException;
+/**
+ * Makes a copy of this project using the given project description.
+ * <p>
+ * This is a convenience method, fully equivalent to:
+ * <pre>
+ *   copy(description, (force ? FORCE : IResource.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 description the destination project description
+ * @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 and cancellation are 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> This resource is not a project.</li>
+ * <li> The project described by the given description already exists.</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 IResourceChangeEvent for more details.</li>
+ * </ul>
+ */
+public void copy(IProjectDescription description, boolean force, IProgressMonitor monitor) throws CoreException;
+
+
+
+
+
+
+/**
+ * Makes a copy of this project using the given project description. 
+ * The project's descendents are copied as well. The description 
+ * specifies the name, location and attributes of the new 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>
+ * 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>
+ * Update flags other than <code>FORCE</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>
+ * This operation is long-running; progress and cancellation are provided
+ * by the given progress monitor. 
+ * </p>
+ *
+ * @param description the destination project description
+ * @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 and cancellation are 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> This resource is not a project.</li>
+ * <li> The project described by the given description already exists.</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> Resource changes are disallowed during certain types of resource change 
+ *       event notification. See IResourceChangeEvent for more details.</li>
+ * </ul>
+ * @since 2.0
+ */
+public void copy(IProjectDescription description, int updateFlags, IProgressMonitor monitor) throws CoreException;
+
+
 
 /**
  * Creates and returns the marker with the specified type on this resource.
@@ -1101,6 +1105,16 @@
  */
 public boolean isAccessible();
 /**
+ * Returns whether this resource subtree is marked as derived. Returns
+ * <code>false</code> if this resource does not exist.
+ *
+ * @return <code>true</code> if this resource is marked as derived, and
+ *   <code>false</code> otherwise
+ * @see #setDerived
+ * @since 2.0
+ */
+public boolean isDerived();
+/**
  * Returns whether this resource and its members (to the 
  * specified depth) are expected to have their contents (and properties)
  * available locally.  Returns <code>false</code> in all other cases,
@@ -1120,6 +1134,19 @@
  */
 public boolean isLocal(int depth);
 /**
+ * Returns <code>true</code> if this resource has been mounted 
+ * in a location outside of the project's content area.  Returns <code>false</code> 
+ * in all other cases, including the case where this resource does not exist.
+ * The workspace root and projects are never mounted.
+ * 
+ * @return <code>true</code> if this resource is mounted, and 
+ *   <code>false</code> otherwise
+ *
+ * @see IFile#mount
+ * @see IFolder#mount
+ */
+public boolean isMounted();
+/**
  * Returns whether this resource is a phantom resource.
  * <p>
  * The workspace uses phantom resources to remember outgoing deletions and
@@ -1186,54 +1213,16 @@
  * @since 2.0
  */
 public boolean isSynchronized(int depth);
-
-
 /**
- * Renames or relocates this project so that it is the project specified by the given project 
- * description.
- * <p>
- * This is a convenience method, fully equivalent to:
- * <pre>
- *   move(description, (keepHistory ? KEEP_HISTORY : IResource.NONE) | (force ? FORCE : IResource.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 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>
+ * Returns whether this resource is a team private member of its parent container.
+ * Returns <code>false</code> if this resource does not exist.
  *
- * @param description the destination project description
- * @param force a flag controlling whether resources that are not
- *    in sync with the local file system will be tolerated
- * @param keepHistory a flag indicating whether or not to keep
- *    local history for files
- * @param monitor a progress monitor, or <code>null</code> if progress
- *    reporting and cancellation are 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> This resource is not a project.</li>
- * <li> The project at the destination already exists.</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 IResourceChangeEvent for more details.</li>
- * </ul>
- * @see IResourceDelta#getFlags
+ * @return <code>true</code> if this resource is a team private member, and
+ *   <code>false</code> otherwise
+ * @see #setTeamPrivateMember
+ * @since 2.0
  */
-public void move(IProjectDescription description, boolean force, boolean keepHistory, IProgressMonitor monitor) throws CoreException;
-
+public boolean isTeamPrivateMember();
 /**
  * Moves this resource so that it is located at the given path.  
  * <p>
@@ -1283,99 +1272,6 @@
  * @see IResourceDelta#getFlags
  */
 public void move(IPath destination, boolean force, IProgressMonitor monitor) throws CoreException;
-
-/**
- * Renames or relocates this project so that it is the project specified by the given
- * project description.  The description specifies the name, location and attributes 
- * of the new project. After successful completion, the old project and 
- * any direct or indirect members will no longer exist; but corresponding 
- * new resources will now exist at the project.
- * <p>
- * When a resource moves, its session and persistent properties move
- * with it. Likewise for all the other attributes of the resource including
- * markers.
- * </p>
- * <p>
- * When this project's location is the default location, then the directories
- * and files on disk are moved to be in
- * the location specified by the given description. If the given description
- * specifies the default location for the project, the directories and files
- * are moved to the default location. In all other cases the directories and
- * files on disk are left untouched. If the name in the given description is
- * the same as this project's name and the location is different, then the 
- * project contents will be moved to the new location. All other parts of the
- * given description are ignored.
- * </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 interested 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>
- * Update flags other than <code>FORCE</code> and <code>KEEP_HISTORY</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 description the destination project description
- * @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 and cancellation are 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> This resource is not a project.</li>
- * <li> The project at the destination already exists.</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> Resource changes are disallowed during certain types of resource change 
- *       event notification. See IResourceChangeEvent for more details.</li>
- * </ul>
- * @see IResourceDelta#getFlags
- * @see #FORCE
- * @see #KEEP_HISTORY
- * @since 2.0
- */
-public void move(IProjectDescription description, int updateFlags, 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.
@@ -1480,6 +1376,147 @@
  * @since 2.0
  */
 public void move(IPath destination, int updateFlags, IProgressMonitor monitor) throws CoreException;
+/**
+ * Renames or relocates this project so that it is the project specified by the given project 
+ * description.
+ * <p>
+ * This is a convenience method, fully equivalent to:
+ * <pre>
+ *   move(description, (keepHistory ? KEEP_HISTORY : IResource.NONE) | (force ? FORCE : IResource.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 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 description the destination project description
+ * @param force a flag controlling whether resources that are not
+ *    in sync with the local file system will be tolerated
+ * @param keepHistory a flag indicating whether or not to keep
+ *    local history for files
+ * @param monitor a progress monitor, or <code>null</code> if progress
+ *    reporting and cancellation are 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> This resource is not a project.</li>
+ * <li> The project at the destination already exists.</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 IResourceChangeEvent for more details.</li>
+ * </ul>
+ * @see IResourceDelta#getFlags
+ */
+public void move(IProjectDescription description, boolean force, boolean keepHistory, IProgressMonitor monitor) throws CoreException;
+
+
+
+/**
+ * Renames or relocates this project so that it is the project specified by the given
+ * project description.  The description specifies the name, location and attributes 
+ * of the new project. After successful completion, the old project and 
+ * any direct or indirect members will no longer exist; but corresponding 
+ * new resources will now exist at the project.
+ * <p>
+ * When a resource moves, its session and persistent properties move
+ * with it. Likewise for all the other attributes of the resource including
+ * markers.
+ * </p>
+ * <p>
+ * When this project's location is the default location, then the directories
+ * and files on disk are moved to be in
+ * the location specified by the given description. If the given description
+ * specifies the default location for the project, the directories and files
+ * are moved to the default location. In all other cases the directories and
+ * files on disk are left untouched. If the name in the given description is
+ * the same as this project's name and the location is different, then the 
+ * project contents will be moved to the new location. All other parts of the
+ * given description are ignored.
+ * </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 interested 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>
+ * Update flags other than <code>FORCE</code> and <code>KEEP_HISTORY</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 description the destination project description
+ * @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 and cancellation are 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> This resource is not a project.</li>
+ * <li> The project at the destination already exists.</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> Resource changes are disallowed during certain types of resource change 
+ *       event notification. See IResourceChangeEvent for more details.</li>
+ * </ul>
+ * @see IResourceDelta#getFlags
+ * @see #FORCE
+ * @see #KEEP_HISTORY
+ * @since 2.0
+ */
+public void move(IProjectDescription description, int updateFlags, IProgressMonitor monitor) throws CoreException;
+
+
 
 /**
  * Refreshes the resource hierarchy from this resource and its 
@@ -1517,6 +1554,52 @@
  */
 public void refreshLocal(int depth, IProgressMonitor monitor) throws CoreException;
 /**
+ * Sets whether this resource subtree is marked as derived.
+ * <p>
+ * A <b>derived</b> resource is a regular file or folder that is
+ * created in the course of translating, compiling, copying, or otherwise 
+ * processing other files. Derived resources are not original data, and can be
+ * recreated from other resources. It is commonplace to exclude derived 
+ * resources from version and configuration management because they would
+ * otherwise clutter the team repository with version of these ever-changing
+ * files as each user regenerates them.
+ * </p>
+ * <p>
+ * If a resource or any of its ancestors is marked as derived, a team 
+ * provider should assume that the resource is not under version and
+ * configuration management <it>by default</it>. That is, the resource
+ * should only be stored in a team repository if the user explicitly indicates
+ * that this resource is worth saving.
+ * </p>
+ * <p>
+ * Newly-created resources are not marked as derived; rather, the mark must be
+ * set explicitly using <code>setDerived(true)</code>. Derived marks are maintained
+ * in the in-memory resource tree, and are discarded when the resources is deleted.
+ * Derived marks are saved to disk when a project is closed, or when the workspace
+ * is saved.
+ * </p>
+ * <p>
+ * Projects and the workspace root are never considered derived; attempts to
+ * mark them as derived are ignored.
+ * </p>
+ * <p>
+ * This operation does <b>not</b> result in a resource change event, and does not
+ * trigger auto-builds.
+ * </p>
+ * 
+ * @param isDerived <code>true</code> if this resource is to be marked
+ *   as derived, and <code>false</code> otherwise
+ * @exception CoreException if this method fails. Reasons include:
+ * <ul>
+ * <li> This resource does not exist.</li>
+ * <li> Resource changes are disallowed during certain types of resource change 
+ *       event notification. See IResourceChangeEvent for more details.</li>
+ * </ul>
+ * @see #isDerived
+ * @since 2.0
+ */
+public void setDerived(boolean isDerived) throws CoreException;
+/**
  * Set whether or not this resource and its members (to the 
  * specified depth) are expected to have their contents (and properties)
  * available locally.  The workspace root and projects are always local and 
@@ -1615,102 +1698,6 @@
  */
 public void setSessionProperty(QualifiedName key, Object value) throws CoreException;
 /**
- * Marks this resource as having changed even though its content
- * may not have changed. This method can be used to trigger 
- * the rebuilding of resources/structures derived from this resource.
- * Touching the workspace root has no effect.
- * </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 monitor a progress monitor, or <code>null</code> if progress
- *    reporting and cancellation are not desired
- * @exception CoreException if this method fails. Reasons include:
- * <ul>
- * <li> This resource does not exist.</li>
- * <li> This resource is not local.</li>
- * <li> Resource changes are disallowed during certain types of resource change 
- *       event notification. See IResourceChangeEvent for more details.</li>
- * </ul>
- */ 
-public void touch(IProgressMonitor monitor) throws CoreException;
-
-/**
- * Returns whether this resource subtree is marked as derived. Returns
- * <code>false</code> if this resource does not exist.
- *
- * @return <code>true</code> if this resource is marked as derived, and
- *   <code>false</code> otherwise
- * @see #setDerived
- * @since 2.0
- */
-public boolean isDerived();
-
-/**
- * Sets whether this resource subtree is marked as derived.
- * <p>
- * A <b>derived</b> resource is a regular file or folder that is
- * created in the course of translating, compiling, copying, or otherwise 
- * processing other files. Derived resources are not original data, and can be
- * recreated from other resources. It is commonplace to exclude derived 
- * resources from version and configuration management because they would
- * otherwise clutter the team repository with version of these ever-changing
- * files as each user regenerates them.
- * </p>
- * <p>
- * If a resource or any of its ancestors is marked as derived, a team 
- * provider should assume that the resource is not under version and
- * configuration management <it>by default</it>. That is, the resource
- * should only be stored in a team repository if the user explicitly indicates
- * that this resource is worth saving.
- * </p>
- * <p>
- * Newly-created resources are not marked as derived; rather, the mark must be
- * set explicitly using <code>setDerived(true)</code>. Derived marks are maintained
- * in the in-memory resource tree, and are discarded when the resources is deleted.
- * Derived marks are saved to disk when a project is closed, or when the workspace
- * is saved.
- * </p>
- * <p>
- * Projects and the workspace root are never considered derived; attempts to
- * mark them as derived are ignored.
- * </p>
- * <p>
- * This operation does <b>not</b> result in a resource change event, and does not
- * trigger auto-builds.
- * </p>
- * 
- * @param isDerived <code>true</code> if this resource is to be marked
- *   as derived, and <code>false</code> otherwise
- * @exception CoreException if this method fails. Reasons include:
- * <ul>
- * <li> This resource does not exist.</li>
- * <li> Resource changes are disallowed during certain types of resource change 
- *       event notification. See IResourceChangeEvent for more details.</li>
- * </ul>
- * @see #isDerived
- * @since 2.0
- */
-public void setDerived(boolean isDerived) throws CoreException;
-
-/**
- * Returns whether this resource is a team private member of its parent container.
- * Returns <code>false</code> if this resource does not exist.
- *
- * @return <code>true</code> if this resource is a team private member, and
- *   <code>false</code> otherwise
- * @see #setTeamPrivateMember
- * @since 2.0
- */
-public boolean isTeamPrivateMember();
-
-/**
  * Sets whether this resource subtree is a team private member of its parent container.
  * <p>
  * A <b>team private member</b> resource is a special file or folder created by a team
@@ -1746,5 +1733,30 @@
  * @since 2.0
  */
 public void setTeamPrivateMember(boolean isTeamPrivate) throws CoreException;
-
+/**
+ * Marks this resource as having changed even though its content
+ * may not have changed. This method can be used to trigger 
+ * the rebuilding of resources/structures derived from this resource.
+ * Touching the workspace root has no effect.
+ * </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 monitor a progress monitor, or <code>null</code> if progress
+ *    reporting and cancellation are not desired
+ * @exception CoreException if this method fails. Reasons include:
+ * <ul>
+ * <li> This resource does not exist.</li>
+ * <li> This resource is not local.</li>
+ * <li> Resource changes are disallowed during certain types of resource change 
+ *       event notification. See IResourceChangeEvent for more details.</li>
+ * </ul>
+ */ 
+public void touch(IProgressMonitor monitor) throws CoreException;
 }
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/IResourceStatus.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/IResourceStatus.java
index c7cb34f..718386f 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/IResourceStatus.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/resources/IResourceStatus.java
@@ -123,6 +123,13 @@
  	 */
 	public static final int CASE_VARIANT_EXISTS = 275;
 
+	/** Status code constant (value 276) indicating a file exists in the
+	 * file system but is not of the expected type (file instead of directory,
+	 * or vice-versa).
+ 	 * Severity: error. Category: workspace.
+ 	 */
+	public static final int WRONG_TYPE_LOCAL = 276;
+
 	// Workspace constants [300-398]
 	// Information Only [300-332]
 
@@ -184,7 +191,13 @@
  	 * Severity: error. Category: workspace.
  	 */
 	public static final int MARKER_NOT_FOUND = 376;
-		
+
+	/** Status code constant (value 377) indicating a resource is 
+	 * unexpectedly not mounted.
+ 	 * Severity: error. Category: workspace.
+ 	 */
+	public static final int RESOURCE_NOT_MOUNTED = 377;
+
 	// Internal constants [500-598]
 	// Information Only [500-532]
 
