finished, ready to merge into HEAD
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CVSAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CVSAction.java
index 3f6b7a3..cd285ae 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CVSAction.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CVSAction.java
@@ -12,6 +12,7 @@
 
 import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
 
@@ -422,10 +423,11 @@
 	/**
 	 * A helper prompt condition for prompting for CVS dirty state.
 	 */
-	public static IPromptCondition getOverwriteLocalChangesPrompt(final List dirtyResources) {
+	public static IPromptCondition getOverwriteLocalChangesPrompt(final IResource[] dirtyResources) {
 		return new IPromptCondition() {
+			List resources = Arrays.asList(dirtyResources);
 			public boolean needsPrompt(IResource resource) {
-				return dirtyResources.contains(resource);
+				return resources.contains(resource);
 			}
 			public String promptMessage(IResource resource) {
 				return Policy.bind("ReplaceWithAction.localChanges", resource.getName());//$NON-NLS-1$
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/ReplaceWithRemoteAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/ReplaceWithRemoteAction.java
index 825d8f0..230f658 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/ReplaceWithRemoteAction.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/ReplaceWithRemoteAction.java
@@ -11,7 +11,6 @@
 package org.eclipse.team.internal.ccvs.ui.actions;
  
 import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
 import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.List;
@@ -25,10 +24,10 @@
 import org.eclipse.team.internal.ccvs.core.CVSException;
 import org.eclipse.team.internal.ccvs.core.CVSTeamProvider;
 import org.eclipse.team.internal.ccvs.core.ICVSResource;
-import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot;
 import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo;
 import org.eclipse.team.internal.ccvs.ui.Policy;
-import org.eclipse.team.internal.ui.PromptingDialog;
+import org.eclipse.team.internal.core.InfiniteSubProgressMonitor;
+import org.eclipse.team.internal.ui.IPromptCondition;
 import org.eclipse.ui.actions.WorkspaceModifyOperation;
 
 public class ReplaceWithRemoteAction extends WorkspaceAction {
@@ -37,21 +36,11 @@
 		run(new WorkspaceModifyOperation() {
 			public void execute(IProgressMonitor monitor) throws InterruptedException, InvocationTargetException {
 				try {
-					
-					IResource resources[] = checkOverwriteOfDirtyResources(getSelectedResources());
-					
-					// Do the replace
-					Hashtable table = getProviderMapping(resources);
-					Set keySet = table.keySet();
-					monitor.beginTask(null, keySet.size() * 1000); //$NON-NLS-1$
-					monitor.setTaskName(Policy.bind("ReplaceWithRemoteAction.replacing")); //$NON-NLS-1$
-					Iterator iterator = keySet.iterator();
-					while (iterator.hasNext()) {
-						IProgressMonitor subMonitor = new SubProgressMonitor(monitor, 1000);
-						CVSTeamProvider provider = (CVSTeamProvider)iterator.next();
-						List list = (List)table.get(provider);
-						IResource[] providerResources = (IResource[])list.toArray(new IResource[list.size()]);
-						provider.get(providerResources, IResource.DEPTH_INFINITE, subMonitor);
+					monitor = Policy.monitorFor(monitor);
+					monitor.beginTask(null, 100);					
+					IResource resources[] = checkOverwriteOfDirtyResources(getSelectedResources(), new InfiniteSubProgressMonitor(monitor, 20));
+					if(resources.length > 0) {
+						performReplace(resources, Policy.subMonitorFor(monitor, 80));
 					}
 				} catch (TeamException e) {
 					throw new InvocationTargetException(e);
@@ -59,34 +48,32 @@
 					monitor.done();
 				}
 			}
-
-			
 		}, true /* cancelable */, PROGRESS_DIALOG);
 	}
 	
-	private IResource[] checkOverwriteOfDirtyResources(IResource[] resources, IProgressMonitor monitor) throws CVSException, InterruptedException {
-		List dirtyResources = new ArrayList();
-		IResource[] selectedResources = getSelectedResources();
-		
+	private void performReplace(IResource[] resources, IProgressMonitor monitor) throws TeamException {
 		try {
-			monitor = Policy.monitorFor(monitor);
-			monitor.beginTask(null, selectedResources.length * 1000);
-			for (int i = 0; i < selectedResources.length; i++) {
-				IResource resource = selectedResources[i];
-				ICVSResource cvsResource = CVSWorkspaceRoot.getCVSResourceFor(resource);
-				if(cvsResource.isModified(Policy.subMonitorFor(monitor, 1000))) {
-					dirtyResources.add(resource);
-				}			
+			Hashtable table = getProviderMapping(resources);
+			Set keySet = table.keySet();
+			monitor.beginTask(null, keySet.size() * 10); //$NON-NLS-1$
+			monitor.setTaskName(Policy.bind("ReplaceWithRemoteAction.replacing")); //$NON-NLS-1$
+			Iterator iterator = keySet.iterator();
+			while (iterator.hasNext()) {
+				IProgressMonitor subMonitor = new SubProgressMonitor(monitor, 10);
+				CVSTeamProvider provider = (CVSTeamProvider)iterator.next();
+				List list = (List)table.get(provider);
+				IResource[] providerResources = (IResource[])list.toArray(new IResource[list.size()]);
+				provider.get(providerResources, IResource.DEPTH_INFINITE, subMonitor);
 			}
 		} finally {
-			monitor.done();		
+			monitor.done();
 		}
-		
-		PromptingDialog dialog = new PromptingDialog(getShell(), selectedResources, 
-				getOverwriteLocalChangesPrompt(dirtyResources), Policy.bind("ReplaceWithAction.confirmOverwrite"));//$NON-NLS-1$
-		return dialog.promptForMultiple();
 	}
 	
+	protected IPromptCondition getPromptCondition(IResource[] dirtyResources) {
+		return getOverwriteLocalChangesPrompt(dirtyResources);
+	}	
+	
 	/**
 	 * @see org.eclipse.team.internal.ccvs.ui.actions.CVSAction#getErrorTitle()
 	 */
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/ReplaceWithTagAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/ReplaceWithTagAction.java
index 9aa1f68..89107d2 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/ReplaceWithTagAction.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/ReplaceWithTagAction.java
@@ -50,10 +50,16 @@
 		// Show a busy cursor while display the tag selection dialog
 		run(new IRunnableWithProgress() {
 			public void run(IProgressMonitor monitor) throws InterruptedException, InvocationTargetException {
-				PromptingDialog prompt = new PromptingDialog(getShell(), getSelectedResources(), 
-																  getOverwriteLocalChangesPrompt(), 
-																  Policy.bind("ReplaceWithAction.confirmOverwrite"));//$NON-NLS-1$
-				final IResource[] resources = prompt.promptForMultiple();
+				
+				IResource[] resources;
+				try {
+					resources =
+						checkOverwriteOfDirtyResources(
+							getSelectedResources(),
+							null /* no progress just a busy cursor for now */);
+				} catch (CVSException e) {
+					throw new InvocationTargetException(e);
+				} 
 				if(resources.length == 0) {
 					// nothing to do
 					return;
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/WorkspaceAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/WorkspaceAction.java
index 46767f1..809a193 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/WorkspaceAction.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/WorkspaceAction.java
@@ -46,6 +46,7 @@
 import org.eclipse.team.internal.ccvs.core.syncinfo.FolderSyncInfo;
 import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo;
 import org.eclipse.team.internal.ccvs.ui.Policy;
+import org.eclipse.team.internal.ui.PromptingDialog;
 
 /**
  * This class represents an action performed on a local CVS workspace
@@ -522,4 +523,28 @@
 			return Policy.bind("ReplaceWithLatestAction.multipleTags"); //$NON-NLS-1$ 
 		}
 	}
+
+	protected IResource[] checkOverwriteOfDirtyResources(IResource[] resources, IProgressMonitor monitor) throws CVSException, InterruptedException {
+		List dirtyResources = new ArrayList();
+		IResource[] selectedResources = getSelectedResources();
+		
+		try {
+			monitor = Policy.monitorFor(monitor);
+			monitor.beginTask(null, selectedResources.length * 100);
+			monitor.setTaskName(Policy.bind("ReplaceWithAction.calculatingDirtyResources")); //$NON-NLS-1$
+			for (int i = 0; i < selectedResources.length; i++) {
+				IResource resource = selectedResources[i];
+				ICVSResource cvsResource = CVSWorkspaceRoot.getCVSResourceFor(resource);
+				if(cvsResource.isModified(Policy.subMonitorFor(monitor, 100))) {
+					dirtyResources.add(resource);
+				}			
+			}
+		} finally {
+			monitor.done();		
+		}
+		
+		PromptingDialog dialog = new PromptingDialog(getShell(), selectedResources, 
+				getOverwriteLocalChangesPrompt((IResource[]) dirtyResources.toArray(new IResource[dirtyResources.size()])), Policy.bind("ReplaceWithAction.confirmOverwrite"));//$NON-NLS-1$
+		return dialog.promptForMultiple();
+	}
 }
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/messages.properties b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/messages.properties
index 35acdf3..f399527 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/messages.properties
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/messages.properties
@@ -438,6 +438,7 @@
 
 ReplaceWithAction.confirmOverwrite=Confirm Overwrite
 ReplaceWithAction.localChanges={0} has local changes which you are about to overwrite. Do you wish to overwrite?
+ReplaceWithAction.calculatingDirtyResources=Finding outgoing changes...
 
 ReplaceWithLatestAction.multipleTags=&Latest from Repository
 ReplaceWithLatestAction.multipleVersions=&Versions from Repository
diff --git a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/ui/CVSUITestCase.java b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/ui/CVSUITestCase.java
index db00ef6..02c9098 100644
--- a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/ui/CVSUITestCase.java
+++ b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/ui/CVSUITestCase.java
@@ -164,7 +164,7 @@
 	 */
 	protected void actionReplaceWithRemote(IResource[] resources) {
 		ReplaceWithRemoteAction action = new ReplaceWithRemoteAction() {
-			protected IPromptCondition getPromptCondition() {
+			protected IPromptCondition getPromptCondition(IResource[] resources) {
 				return new DummyPromptCondition();
 			}
 		};
@@ -215,7 +215,7 @@
 			protected String promptForTag(ICVSFolder folder) {
 				return name;
 			}
-			protected IPromptCondition getPromptCondition() {
+			protected IPromptCondition getPromptCondition(IResource[] resources) {
 				return new DummyPromptCondition();
 			}
 		};