*** empty log message ***
diff --git a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/PersistantResourceVariantByteStore.java b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/PersistantResourceVariantByteStore.java
index 318a41a..ff4af89 100644
--- a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/PersistantResourceVariantByteStore.java
+++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/PersistantResourceVariantByteStore.java
@@ -15,6 +15,7 @@
 
 import org.eclipse.core.resources.*;
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.QualifiedName;
 import org.eclipse.team.core.TeamException;
 import org.eclipse.team.internal.core.Assert;
@@ -157,4 +158,16 @@
 			throw TeamException.asTeamException(e);
 		}
 	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.team.core.variants.ResourceVariantByteStore#run(org.eclipse.core.resources.IWorkspaceRunnable, org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	public void run(IResource root, IWorkspaceRunnable runnable, IProgressMonitor monitor)
+			throws TeamException {
+		try {
+			ResourcesPlugin.getWorkspace().run(runnable, root, 0, monitor);
+		} catch (CoreException e) {
+			throw TeamException.asTeamException(e);
+		}
+	}
 }
diff --git a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/ResourceVariantByteStore.java b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/ResourceVariantByteStore.java
index 495fcee..7caf8f0 100644
--- a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/ResourceVariantByteStore.java
+++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/ResourceVariantByteStore.java
@@ -11,6 +11,10 @@
 package org.eclipse.team.core.variants;
 
 import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
 import org.eclipse.team.core.TeamException;
 
 /**
@@ -110,4 +114,23 @@
 		}
 		return true;
 	}
+
+	/**
+	 * Run the given action which may contain multiple modfications
+	 * to the byte store. By default, the action is run. Subclasses
+	 * may override to obtain scheduling rules or batch deltas (if
+	 * the byte store modifies workspace resources).
+	 * @param root the root resource for all modifications
+	 * @param action the action to perform
+	 * @param monitor a progress monitor.
+	 * @exception CoreException if the operation failed.
+	 * @exception OperationCanceledException if the operation is canceled. 
+	 */
+	public void run(IResource root, IWorkspaceRunnable runnable, IProgressMonitor monitor) throws TeamException {
+		try {
+			runnable.run(monitor);
+		} catch (CoreException e) {
+			throw TeamException.asTeamException(e);
+		}
+	}
 }
diff --git a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/ResourceVariantTree.java b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/ResourceVariantTree.java
index 619de1a..8a496e5 100644
--- a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/ResourceVariantTree.java
+++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/ResourceVariantTree.java
@@ -11,6 +11,9 @@
 package org.eclipse.team.core.variants;
 
 import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.team.core.TeamException;
 
 /**
@@ -93,4 +96,19 @@
 		if (remote == null) return null;
 		return remote.asBytes();
 	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.team.core.variants.AbstractResourceVariantTree#collectChanges(org.eclipse.core.resources.IResource, org.eclipse.team.core.variants.IResourceVariant, int, org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	protected IResource[] collectChanges(final IResource local,
+			final IResourceVariant remote, final int depth, IProgressMonitor monitor)
+			throws TeamException {
+		final IResource[][] resources = new IResource[][] { null };
+		getByteStore().run(local, new IWorkspaceRunnable() {
+			public void run(IProgressMonitor monitor) throws CoreException {
+				resources[0] = ResourceVariantTree.super.collectChanges(local, remote, depth, monitor);
+			}
+		}, monitor);
+		return resources[0];
+	}
 }
diff --git a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/ThreeWayRemoteTree.java b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/ThreeWayRemoteTree.java
index 35d7508..fafe387 100644
--- a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/ThreeWayRemoteTree.java
+++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/ThreeWayRemoteTree.java
@@ -11,6 +11,9 @@
 package org.eclipse.team.core.variants;
 
 import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.team.core.TeamException;
 
 /**
@@ -64,6 +67,12 @@
 		}
 	}
 	
+	/**
+	 * Create a remote resource variant tree that stores and obtains
+	 * it's bytes from the remote slot of the synchronizer of the
+	 * given subscriber
+	 * @param subscriber a three-way subscriber
+	 */
 	public ThreeWayRemoteTree(ThreeWaySubscriber subscriber) {
 		super(new RemoteResourceVariantByteStore(subscriber.getSynchronizer()));
 		this.subscriber = subscriber;
@@ -83,7 +92,26 @@
 		return getSubscriber().getResourceVariant(resource, getByteStore().getBytes(resource));
 	}
 
+	/**
+	 * Return the subscriber associated with this resource variant tree.
+	 * @return the subscriber associated with this resource variant tree
+	 */
 	protected ThreeWaySubscriber getSubscriber() {
 		return subscriber;
 	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.team.core.variants.AbstractResourceVariantTree#collectChanges(org.eclipse.core.resources.IResource, org.eclipse.team.core.variants.IResourceVariant, int, org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	protected IResource[] collectChanges(final IResource local,
+			final IResourceVariant remote, final int depth, IProgressMonitor monitor)
+			throws TeamException {
+		final IResource[][] resources = new IResource[][] { null };
+		getSubscriber().getSynchronizer().run(local, new IWorkspaceRunnable() {
+			public void run(IProgressMonitor monitor) throws CoreException {
+				resources[0] = ThreeWayRemoteTree.super.collectChanges(local, remote, depth, monitor);
+			}
+		}, monitor);
+		return resources[0];
+	}
 }
diff --git a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/ThreeWaySynchronizer.java b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/ThreeWaySynchronizer.java
index 55b5c06..62ecdb9 100644
--- a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/ThreeWaySynchronizer.java
+++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/ThreeWaySynchronizer.java
@@ -376,12 +376,12 @@
 	 * @param monitor a progress monitor
 	 * @throws TeamException
 	 */
-	public void run(ISchedulingRule resourceRule, IWorkspaceRunnable runnable, IProgressMonitor monitor) throws TeamException {
+	public void run(IResource resourceRule, IWorkspaceRunnable runnable, IProgressMonitor monitor) throws TeamException {
 		monitor = Policy.monitorFor(monitor);
 		monitor.beginTask(null, 100);
 		ISchedulingRule rule = beginBatching(resourceRule, Policy.subMonitorFor(monitor, 10));
 		try {
-			runnable.run(Policy.subMonitorFor(monitor, 80));
+			cache.run(resourceRule, runnable, Policy.subMonitorFor(monitor, 80));
 		} catch (CoreException e) {
 			throw TeamException.asTeamException(e);
 		} finally {
diff --git a/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/DescendantResourceVariantByteStore.java b/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/DescendantResourceVariantByteStore.java
index 77cb91d..bfeeb42 100644
--- a/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/DescendantResourceVariantByteStore.java
+++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/DescendantResourceVariantByteStore.java
@@ -14,6 +14,8 @@
 import java.util.Set;
 
 import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.team.core.TeamException;
 import org.eclipse.team.core.variants.*;
 
@@ -171,4 +173,11 @@
 		}
 		return (IResource[]) members.toArray(new IResource[members.size()]);
 	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.team.core.variants.ResourceVariantByteStore#run(org.eclipse.core.resources.IResource, org.eclipse.core.resources.IWorkspaceRunnable, org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	public void run(IResource root, IWorkspaceRunnable runnable, IProgressMonitor monitor) throws TeamException {
+		remoteStore.run(root, runnable, monitor);
+	}
 }