diff --git a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/CVSClientException.java b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/CVSClientException.java
new file mode 100644
index 0000000..b8bd874
--- /dev/null
+++ b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/CVSClientException.java
@@ -0,0 +1,15 @@
+package org.eclipse.team.tests.ccvs.core;
+/*
+ * (c) Copyright IBM Corp. 2000, 2002.
+ * All Rights Reserved.
+ */
+import org.eclipse.team.internal.ccvs.core.CVSException;
+
+public class CVSClientException extends CVSException {
+	
+	public CVSClientException(String message) {
+		super(message);
+	}
+
+}
+
diff --git a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/CVSTestSetup.java b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/CVSTestSetup.java
index cb6de75..6db1032 100644
--- a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/CVSTestSetup.java
+++ b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/CVSTestSetup.java
@@ -19,11 +19,10 @@
 import org.eclipse.team.internal.ccvs.core.connection.CVSRepositoryLocation;
 
 public class CVSTestSetup extends TestSetup {
-	public static String REPOSITORY_LOCATION;
-	public static boolean INITIALIZE_REPO;
+	public static final String REPOSITORY_LOCATION;
+	public static final boolean INITIALIZE_REPO;
 	public static final boolean DEBUG;
 	public static final String RSH;
-
 	
 	public static CVSRepositoryLocation repository;
 	
@@ -88,8 +87,6 @@
 	public void setUp() throws CVSException {
 		if (repository == null)
 			repository = setupRepository(REPOSITORY_LOCATION);
-		if (!DEBUG)
-			CVSProviderPlugin.getProvider().setPrintStream(new PrintStream(new NullOutputStream()));
 	}
 
 	protected CVSRepositoryLocation setupRepository(String location) throws CVSException {
diff --git a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/CommandLineCVSClient.java b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/CommandLineCVSClient.java
new file mode 100644
index 0000000..db621ca
--- /dev/null
+++ b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/CommandLineCVSClient.java
@@ -0,0 +1,106 @@
+package org.eclipse.team.tests.ccvs.core;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.PrintStream;
+
+import junit.framework.Assert;
+
+import org.eclipse.team.internal.ccvs.core.CVSException;
+
+public class CommandLineCVSClient {
+	private static final String cvsExecutable =
+		System.getProperty("eclipse.cvs.command");
+
+	public static void execute(
+		String repositoryLocation, File localRoot, String command,
+		String[] globalOptions, String[] localOptions,
+		String[] arguments) throws CVSException {
+		// test arguments
+		Assert.assertNotNull(repositoryLocation);
+		Assert.assertNotNull(localRoot);
+		Assert.assertNotNull(command);
+		Assert.assertNotNull(globalOptions);
+		Assert.assertNotNull(localOptions);
+		Assert.assertNotNull(arguments);
+		Assert.assertTrue(localRoot.exists());
+
+		// build command line
+		StringBuffer commandLineBuf = new StringBuffer(cvsExecutable);
+		commandLineBuf.append(" -d \"");
+		commandLineBuf.append(repositoryLocation);
+		commandLineBuf.append('"');
+		appendStrings(commandLineBuf, globalOptions);
+		commandLineBuf.append(' ');
+		commandLineBuf.append(command);
+		appendStrings(commandLineBuf, localOptions);
+		appendStrings(commandLineBuf, arguments);
+		
+		// execute command
+		try {
+			PrintStream debugStream = CVSTestSetup.DEBUG ? System.out : null;
+			String commandLine = commandLineBuf.toString();
+			
+			if (debugStream != null) {
+				// while debugging, dump CVS command line client results to stdout
+				// prefix distinguishes between message source stream
+				debugStream.println();
+				debugStream.println("CMD> " + commandLine);
+				debugStream.println("DIR> " + localRoot.toString());
+			}
+			Process cvsProcess = Runtime.getRuntime().exec(commandLine, null, localRoot);
+			// stream output must be dumped to avoid blocking the process or causing a deadlock
+			startBackgroundPipeThread(cvsProcess.getErrorStream(), debugStream, "ERR> ");
+			startBackgroundPipeThread(cvsProcess.getInputStream(), debugStream, "MSG> ");
+			int returnCode = cvsProcess.waitFor();
+			
+			if (debugStream != null) {
+				debugStream.println("RESULT> " + returnCode);
+			}
+			if (returnCode != 0) {
+				throw new CVSClientException("Command line client returned non-zero code: " + returnCode);
+			}
+		} catch (IOException e) {
+			throw new CVSClientException("IOException while executing command line client: " + e);
+		} catch (InterruptedException e) {
+			throw new CVSClientException("InterruptedException while executing command line client: " + e);
+		}
+	}
+		
+	private static void appendStrings(StringBuffer commandLine, String[] strings) {	
+		for (int i = 0; i < strings.length; i++) {
+			String string = strings[i];
+			if (string != null && string.length() != 0) {
+				commandLine.append(" \"");
+				commandLine.append(string);
+				commandLine.append('"');
+			}
+		}
+	}
+	
+	private static void startBackgroundPipeThread(final InputStream is, final PrintStream os,
+		final String prefix) {
+		new Thread() {
+			public void run() {
+				BufferedReader reader = null;
+				try {
+					try {
+						reader = new BufferedReader(new InputStreamReader(is));
+						for (;;) {
+							String line = reader.readLine();
+							if (line == null) break;
+							if (os != null) os.println(prefix + line);
+						}
+					} finally {
+						if (reader != null) reader.close();
+					}
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}.start();
+	}
+}
diff --git a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/EclipseCVSClient.java b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/EclipseCVSClient.java
new file mode 100644
index 0000000..9c6fd69
--- /dev/null
+++ b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/EclipseCVSClient.java
@@ -0,0 +1,98 @@
+package org.eclipse.team.tests.ccvs.core;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import junit.framework.Assert;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.team.ccvs.core.CVSStatus;
+import org.eclipse.team.ccvs.core.ICVSFolder;
+import org.eclipse.team.ccvs.core.ICVSRepositoryLocation;
+import org.eclipse.team.internal.ccvs.core.CVSException;
+import org.eclipse.team.internal.ccvs.core.client.Command;
+import org.eclipse.team.internal.ccvs.core.client.Session;
+import org.eclipse.team.internal.ccvs.core.client.Command.GlobalOption;
+import org.eclipse.team.internal.ccvs.core.client.Command.LocalOption;
+
+public class EclipseCVSClient {
+	private static final HashMap commandPool = new HashMap();
+	static {
+		commandPool.put("update", Command.UPDATE);
+		commandPool.put("co", Command.CHECKOUT);
+		commandPool.put("ci", Command.COMMIT);
+		commandPool.put("import", Command.IMPORT);
+		commandPool.put("add", Command.ADD);
+		commandPool.put("remove", Command.REMOVE);
+		commandPool.put("status", Command.STATUS);
+		commandPool.put("log", Command.LOG);
+		commandPool.put("tag", Command.TAG);
+		commandPool.put("rtag", Command.RTAG);
+		commandPool.put("admin", Command.ADMIN);
+		commandPool.put("diff", Command.DIFF);
+	}
+	
+	public static void execute(
+		ICVSRepositoryLocation cvsRepositoryLocation, ICVSFolder cvsLocalRoot,
+		String command, String[] globalOptions, String[] localOptions,
+		String[] arguments) throws CVSException {
+		// test arguments
+		Assert.assertNotNull(cvsRepositoryLocation);
+		Assert.assertNotNull(cvsLocalRoot);
+		Assert.assertNotNull(command);
+		Assert.assertNotNull(globalOptions);
+		Assert.assertNotNull(localOptions);
+		Assert.assertNotNull(arguments);
+		Assert.assertTrue(cvsLocalRoot.exists());
+
+		// get command instance
+		Command cvsCommand = (Command) commandPool.get(command);
+			
+		// get global options
+		List globals = new ArrayList();
+		for (int i = 0; i < globalOptions.length; i++) {
+			globals.add(new CustomGlobalOption(globalOptions[i]));
+		}
+		GlobalOption[] cvsGlobalOptions = (GlobalOption[]) globals.toArray(new GlobalOption[globals.size()]);
+		
+		// get local options
+		List locals = new ArrayList();
+		for (int i = 0; i < localOptions.length; i++) {
+			String option = localOptions[i];
+			String argument = null;
+			if ((i < localOptions.length - 1) && (localOptions[i + 1].charAt(0) != '-')) {
+				argument = localOptions[++i];
+			}
+			locals.add(new CustomLocalOption(option, argument));
+		}
+		LocalOption[] cvsLocalOptions = (LocalOption[]) locals.toArray(new LocalOption[locals.size()]);
+		
+		// execute command
+		IProgressMonitor monitor = new NullProgressMonitor();
+		Session session = new Session(cvsRepositoryLocation, cvsLocalRoot);
+		try {
+			session.open(monitor);
+			IStatus status = cvsCommand.execute(session,
+				cvsGlobalOptions, cvsLocalOptions, arguments, null, monitor);
+			if (status.getCode() == CVSStatus.SERVER_ERROR) {
+				throw new CVSClientException("Eclipse client returned non-ok status: " + status);
+			}
+		} finally {
+			session.close();
+		}
+	}
+
+	private static class CustomGlobalOption extends GlobalOption {
+		public CustomGlobalOption(String option) {
+			super(option);
+		}
+	}
+
+	private static class CustomLocalOption extends LocalOption {
+		public CustomLocalOption(String option, String arg) {
+			super(option, arg);
+		}
+	}
+}
diff --git a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/EclipseTest.java b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/EclipseTest.java
index f8b3480..e401c4b 100644
--- a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/EclipseTest.java
+++ b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/EclipseTest.java
@@ -260,9 +260,6 @@
 	protected void assertEquals(IProject project1, IProject project2) throws CoreException, TeamException, IOException {
 		assertEquals(project1, project2, false, false);
 	}
-	protected void assertEquals(String message, IProject project1, IProject project2) throws CoreException, TeamException, IOException {
-		assertEquals(project1, project2, false, false);
-	}
 	
 	protected void assertEquals(IProject project1, IProject project2, boolean includeTimestamps, boolean includeTags) throws CoreException, TeamException, IOException {
 		assertEquals(getProvider(project1), getProvider(project2), includeTimestamps, includeTags);
diff --git a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/JUnitTestCase.java b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/JUnitTestCase.java
index 13c6b80..f6c8733 100644
--- a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/JUnitTestCase.java
+++ b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/JUnitTestCase.java
@@ -4,38 +4,28 @@
  * All Rights Reserved.
  */
 import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileReader;
-import java.io.FileWriter;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.io.InputStreamReader;
 import java.io.PrintStream;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 
 import junit.awtui.TestRunner;
 import junit.framework.TestCase;
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
 import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.Path;
-import org.eclipse.team.ccvs.core.CVSProviderPlugin;
-import org.eclipse.team.ccvs.core.CVSStatus;
-import org.eclipse.team.ccvs.core.ICVSFolder;
 import org.eclipse.team.ccvs.core.ICVSRepositoryLocation;
-import org.eclipse.team.ccvs.core.ICVSResource;
 import org.eclipse.team.internal.ccvs.core.CVSException;
-import org.eclipse.team.internal.ccvs.core.client.Command;
-import org.eclipse.team.internal.ccvs.core.client.Session;
-import org.eclipse.team.internal.ccvs.core.client.Command.GlobalOption;
-import org.eclipse.team.internal.ccvs.core.client.Command.LocalOption;
-import org.eclipse.team.internal.ccvs.core.connection.CVSRepositoryLocation;
-import org.eclipse.team.internal.ccvs.core.connection.CVSServerException;
 import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot;
-import org.eclipse.team.internal.ccvs.core.util.FileUtil;
-import org.eclipse.team.internal.ccvs.core.util.Util;
 
 /**
  * Base-class to the low level-testcases for the Session.
@@ -43,198 +33,41 @@
  * Especally data for a default-connection to the server is stored.
  */
 public abstract class JUnitTestCase extends TestCase {
-	
 	protected static final int RANDOM_CONTENT_SIZE = 10000;
 	protected static final boolean NEWLINE_TEST = false;
 	protected static final String PLATFORM_NEWLINE = System.getProperty("line.separator");
-	protected static final File workspaceRoot = ResourcesPlugin.getWorkspace().getRoot().getLocation().toFile();
+	protected static final IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
 	
 	public static final String[] EMPTY_ARGS = new String[0];
-	
-	// Predefined parameters for calles of the client
-	protected final String[] globalOptions;
-	protected final IProgressMonitor monitor;
-	protected final String[] arguments;
-	protected static final String REPOSITORY_NAME = CVSTestSetup.REPOSITORY_LOCATION;
 
-	static boolean propertiesSet = false;
-
-	private static final HashMap commandPool = new HashMap();
-	static {
-		commandPool.put("update", Command.UPDATE);
-		commandPool.put("co", Command.CHECKOUT);
-		commandPool.put("ci", Command.COMMIT);
-		commandPool.put("import", Command.IMPORT);
-		commandPool.put("add", Command.ADD);
-		commandPool.put("remove", Command.REMOVE);
-		commandPool.put("status", Command.STATUS);
-		commandPool.put("log", Command.LOG);
-		commandPool.put("tag", Command.TAG);
-		commandPool.put("rtag", Command.RTAG);
-		commandPool.put("admin", Command.ADMIN);
-		commandPool.put("diff", Command.DIFF);
-	}
-	
-	/**
-	 * Convinience method for:<br>
-	 * Session.execute(request,globalOptions,localOptions,arguments,Session.getManagedFolder(root),monitor,messageOut)
-	 */	
-	public static void execute(String request, 
-						String[] globalOptions, 
-						String[] localOptions, 
-						String[] arguments,
-						File root,
-						IProgressMonitor monitor, 
-						PrintStream messageOut) 
-						throws CVSException {
-		if (!CVSTestSetup.DEBUG)
-			messageOut = new PrintStream(new NullOutputStream());
-		
-		List globals = new ArrayList();
-		for (int i=0;i<globalOptions.length;i++) {
-			if (globalOptions[i].equals("-d")) {
-				i++;
-				continue;
-			}
-			globals.add(new CustomGlobalOption(globalOptions[i]));
-		}
-		List locals = new ArrayList();
-		for (int i=0;i<localOptions.length;i++) {
-			if ((i < localOptions.length - 1) && (localOptions[i + 1].charAt(0) != '-')) {
-				locals.add(new CustomLocalOption(localOptions[i], localOptions[i + 1]));
-				i++;
-			} else {
-				locals.add(new CustomLocalOption(localOptions[i], null));
-			}
-		}
-		Session s = new Session(getRepository(globalOptions, CVSWorkspaceRoot.getCVSFolderFor(root)), CVSWorkspaceRoot.getCVSFolderFor(root));
-		s.open(monitor);
-		try {
-			IStatus status = ((Command)commandPool.get(request)).execute(s,
-				(GlobalOption[]) globals.toArray(new GlobalOption[globals.size()]),
-				(LocalOption[]) locals.toArray(new LocalOption[locals.size()]),
-				arguments,
-				null,
-				monitor);
-			if (status.getCode() == CVSStatus.SERVER_ERROR) {
-				throw new CVSServerException(status);
-			}
-		} finally {
-			s.close();
-		}
-	}
-	
-	public static class CustomGlobalOption extends GlobalOption {
-		public CustomGlobalOption(String option) {
-			super(option);
-		}
-	}
-	public static class CustomLocalOption extends LocalOption {
-		public CustomLocalOption(String option, String arg) {
-			super(option, arg);
-		}
-	}
-	/**
-	 * This give you a new repo either from the global "-d" option
-	 * or form the root-property in the folder.
-	 * 
-	 * This has to be rewritten in a nicer style.
-	 */
-	private static CVSRepositoryLocation getRepository(String[] globalOptions, 
-										ICVSFolder mFolder) 
-										throws CVSException {
-		
-		String repoName = null;
-		
-		// look if the repo is specified in the global Options
-		// this delets the option as well which is not so beatyful, but
-		// we have got a copy and we do not want this option to appear
-		// any more
-		repoName = Util.getOption(globalOptions, "-d", true);
-		
-		// look if we have got an root-entrie in the root-folder
-		if (repoName == null && mFolder.exists() && mFolder.isCVSFolder()) {
-			repoName = mFolder.getFolderSyncInfo().getRoot();
-		}
-		
-		if (repoName == null) {
-			throw new CVSException("CVSROOT is not specified");
-		}
-		
-		return CVSRepositoryLocation.fromString(repoName);
-	}
-	
-	/**
-	 * Get a File relative to the working directory.
-	 */
-	protected static File getFile(String relativePath) {
-		// We need to get the cononical file in case relativePath contains a dot indicating the root directory
-		try {
-			return new File(workspaceRoot, relativePath).getCanonicalFile();
-		} catch (IOException e) {
-			fail(e.getMessage());
-			return null;
-		}
-	}
-	
-	/**
-	 * Get the IO File for the given CVS resource
-	 */
-	protected static File getFile(ICVSResource mResource) {
-		return new File(((LocalResource)mResource).getPath());
-	}
-	
-	/**
-	 * Get a CVSFolder relative to the working directory.
-	 */
-	protected static ICVSFolder getManagedFolder(String relativePath) {
-		try {
-			return CVSWorkspaceRoot.getCVSFolderFor(getFile(relativePath));
-		} catch (CVSException e) {
-			fail(e.getMessage());
-			return null;
-		}
-	}
-	
 	/**
 	 * Init the options and arguments to standard-values
 	 */
 	public JUnitTestCase(String name) {
 		super(name);
-		
-		monitor = new NullProgressMonitor();
-		globalOptions = new String[]{"-d",REPOSITORY_NAME};
-		arguments = new String[]{"proj1"};
 	}
 
 	/**
 	 * Delete a project/resource form the standard cvs-server
 	 */
-	protected void magicDeleteProject(String project) throws CVSException {
-		CVSRepositoryLocation location = CVSRepositoryLocation.fromString(REPOSITORY_NAME);
-		String host = location.getHost();
-		String repoRoot = location.getRootDirectory();
-		magicDeleteProject(location, project);
+	protected void magicDeleteRemote(String remoteName) throws CVSException {
+		magicDeleteRemote(CVSTestSetup.repository, remoteName);
 	}
 
 	/**
-	 * Delete a project/resource form the standard cvs-server
+	 * Delete a project/resource form the specified cvs-server
 	 */
-	protected static void magicDeleteProject(ICVSRepositoryLocation location, String project) throws CVSException {
-		
-		String commandLine;
-		Process process;
-		
-		commandLine = new String(CVSTestSetup.RSH + " " + location.getHost() + " -l " + location.getUsername() + " rm -rf " + new Path(location.getRootDirectory()).append(project).toString());
-
+	protected static void magicDeleteRemote(ICVSRepositoryLocation location, String remoteName)
+		throws CVSException {
+		String commandLine = new String(CVSTestSetup.RSH + " " + location.getHost() +
+			" -l " + location.getUsername() + " rm -rf " +
+			new Path(location.getRootDirectory()).append(remoteName).toString());
 		try {
-			process = Runtime.getRuntime().exec(commandLine);
+			Process process = Runtime.getRuntime().exec(commandLine);
 			process.waitFor();
-			
 			if (process.exitValue() != 0) {
 				// throw new CVSException("Return Code of magicDeleteProject :" + process.exitValue());
 			}
-			
 		} catch (IOException e) {
 			throw new CVSException("IOException in magicDeleteProject");
 		} catch (InterruptedException e) {
@@ -243,42 +76,38 @@
 	}
 
 	/**
-	 * Set the project on the standard cvs-server up so that it contains the resources
-	 * in createResources. The files have random content.
+	 * Sends the project to the standard cvs-server so that it contains the resources
+	 * described in createResources.  The files have random content.
+	 *
+	 * @param projectName the name of the project to import
+	 * @param createResources e.g. new String[]{"a.txt","f1/b.txt","f1/c.txt","f2/d.txt"}
 	 */
-	public void magicSetUpRepo(String project, String[] createResources) throws CVSException {
-		CVSRepositoryLocation location = CVSRepositoryLocation.fromString(REPOSITORY_NAME);
-		magicSetUpRepo(workspaceRoot, location ,project, createResources);
+	protected void magicSetUpRepo(String projectName, String[] createResources)
+		throws  IOException, CoreException, CVSException {
+		magicSetUpRepo(CVSTestSetup.repository, projectName, createResources);
 	}
 	
 	/**
-	 * Set the project on the standard cvs-server up so that it contains the resources
-	 * in createResources. The files have random content.
+	 * Sends the project to the specified cvs-server so that it contains the resources
+	 * described in createResources.  The files have random content.
 	 * 
-	 * @param root a folder to place files temporaryly
-	 * @param host e.g. dev.eclipse.org:2401
-	 * @param repoRoot e.g. /home/cvs
-	 * @param repoName e.g. :pserver:anonymous@dev.eclipse.org:2401:/home/eclipse
-	 * @param project e.g. org.eclipse.swt
+	 * @param location the CVS repository location
+	 * @param projectName the name of the project to import
 	 * @param createResources e.g. new String[]{"a.txt","f1/b.txt","f1/c.txt","f2/d.txt"}
 	 */
-	private static void magicSetUpRepo(File root, ICVSRepositoryLocation location, String project, String[] createResources) throws CVSException {
+	protected static void magicSetUpRepo(ICVSRepositoryLocation location, String projectName,
+		String[] createResources) throws IOException, CoreException, CVSException {
+		IProject projectRoot = workspaceRoot.getProject(projectName + "-setup-tmp");
+		mkdirs(projectRoot);
+		createRandomFile(projectRoot, createResources);
+		magicDeleteRemote(location, projectName);
 		
-		File workFolder;
-		
-		workFolder = new File(root, project + "tmpXXXtmp");
-		
-		createRandomFile(workFolder, createResources);
-		
-		magicDeleteProject(location, project);
-		
-		String[] gOptions = new String[]{"-d", location.getLocation()};
 		String[] lOptions = new String[]{"-m","msg"};
-		String[] args = new String[]{project,"a","b"};
-		
-		execute("import",gOptions,lOptions,args,workFolder,new NullProgressMonitor(),System.err);
-		
-		FileUtil.deepDelete(workFolder);
+		String[] args = new String[]{projectName,"a","b"};
+	
+		EclipseCVSClient.execute(location, CVSWorkspaceRoot.getCVSFolderFor(projectRoot),
+			"import", EMPTY_ARGS, lOptions, args);
+		projectRoot.delete(false /*force*/, null);
 	}
 	
 	/**
@@ -310,69 +139,64 @@
 			
 	}
 	
-	protected static void assertSynchronizerEmpty() {
-		assertTrue(CVSProviderPlugin.getSynchronizer().isEmpty());
-	}
-	
 	/**
-	 * Write String[] to file as lines
+	 * Write text lines to file from an array of strings.
 	 */
-	protected static void writeToFile(File file, String[] content)
-		throws IOException {
-		
-		BufferedWriter fileWriter;
-		
-		fileWriter = new BufferedWriter(new FileWriter(file));
-		for (int i = 0; i<content.length; i++) {
-			fileWriter.write(content[i]);
-			fileWriter.newLine();
+	protected static void writeToFile(IFile file, String[] contents)
+		throws IOException, CoreException {
+		ByteArrayOutputStream bos = new ByteArrayOutputStream();
+		PrintStream os = new PrintStream(bos);
+		try {
+			for (int i = 0; i < contents.length; i++) {
+				os.println(contents[i]);
+			}
+			ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
+			if (file.exists()) {
+				file.setContents(bis, false /*force*/, true /*keepHistory*/, null);
+			} else {
+				mkdirs(file.getParent());
+				file.create(bis, false /*force*/, null);
+			}
+		} finally {
+			os.close();
 		}
-		fileWriter.close();
 	}
 	
 	/**
-	 * load file in lines to String[]
+	 * Read text lines from file into an array of strings.
 	 */
-	protected static String[] readFromFile(File file)
-		throws IOException {
-
-		BufferedReader fileReader;
+	protected static String[] readFromFile(IFile file)
+		throws IOException, CoreException {
+		if (! file.exists()) return null;
+		BufferedReader reader = new BufferedReader(new InputStreamReader(file.getContents()));
 		List fileContentStore = new ArrayList();
-		String line;
-		
-		if (!file.exists()) {
-			return null;
+		try {
+			String line;
+			while ((line = reader.readLine()) != null) {
+				fileContentStore.add(line);
+			}			
+		} finally {
+			reader.close();
 		}
-		
-		fileReader = new BufferedReader(new FileReader(file));
-		while ((line = fileReader.readLine()) != null) {
-			fileContentStore.add(line);
-		}
-		fileReader.close();
-			
 		return (String[]) fileContentStore.toArray(new String[fileContentStore.size()]);
 	}
 
 	/**
-	 * Append a String to an file (acctally to both of the files, that are going
-	 * to have the same content)
-	 * If the file is empty we create a new file with the content txt.
+	 * Append text files to file from an array of strings, create new file if it
+	 * does not exist yet.
 	 */
-	protected void appendToFile(File file, String txt) throws IOException {	
-		String[] content;
-		String[] newContent;
-		
-		content = readFromFile(file);
-		
-		if (content == null) {
-			content = new String[0];
+	protected static void appendToFile(IFile file, String[] contents)
+		throws IOException, CoreException {
+		String[] oldContents = readFromFile(file);
+		String[] newContents;
+		if (contents != null) {
+			newContents = contents;
+		} else {
+			newContents = new String[oldContents.length + contents.length];
+			System.arraycopy(oldContents, 0, newContents, 0, oldContents.length);
+			System.arraycopy(contents, 0, newContents, oldContents.length, contents.length);
 		}
-		
-		newContent = new String[content.length + 1];
-		System.arraycopy(content,0,newContent,0,content.length);
-		newContent[content.length] = txt;
-		
-		writeToFile(file,newContent);
+		writeToFile(file, newContents);
 	}
 	
 	/**
@@ -424,26 +248,43 @@
 	}
 	
 	/**
-	 * Creates the file with random contend, and all the folders on the
-	 * way to there
+	 * Creates a folder (and its parents if needed).
 	 */
-	private static void createRandomFile(File file) throws CVSException {
-		try {
-			file.getParentFile().mkdirs();
-			writeToFile(file,new String[]{createRandomContent()});
-		} catch (IOException e) {
-			throw new CVSException(0,0,"IOException in test-setup",e);
-		}		
+	protected static void mkdirs(IContainer container) throws CoreException {
+		if (container.getType() == IResource.PROJECT) {
+			IProject project = (IProject) container;
+			if (! project.exists()) {
+				project.create(null);
+			}
+			project.open(null);
+		} else if (container.getType() == IResource.FOLDER) {
+			IFolder folder = (IFolder) container;
+			if (! folder.exists()) {
+				mkdirs(folder.getParent());
+				folder.create(false /*force*/, true /*local*/, null);
+			}
+		}
+	}
+
+	/**
+	 * Creates the file with random content, and all the folders on the
+	 * way to there.
+	 */
+	private static void createRandomFile(IFile file)
+		throws IOException, CoreException {
+		mkdirs(file.getParent());
+		writeToFile(file, new String[] { createRandomContent() });
 	}
 		
 	/**
 	 * Build the given fileStructure, all files are going to have
-	 * sample content, all folders on the way are created
+	 * sample content, all folders on the way are created.
 	 */
-	protected static void createRandomFile(File root, String[] fileNameArray) 
-														throws CVSException {
-		for (int i=0; i<fileNameArray.length; i++) {
-			createRandomFile(new File(root, fileNameArray[i]));
+	protected static void createRandomFile(IContainer parent, String[] fileNameArray) 
+		throws IOException, CoreException {
+		for (int i = 0; i < fileNameArray.length; i++) {
+			IFile file = parent.getFile(new Path(fileNameArray[i]));
+			createRandomFile(file);
 		}
 	}
 
@@ -463,37 +304,9 @@
 	 * It initialises some required parameter and runs the testcase.
 	 */
 	protected static void run(Class test) {
-		System.setProperty("eclipse.cvs.standalone","true");
+		// XXX is this property used anywhere?
+		System.setProperty("eclipse.cvs.standalone", "true");
 		TestRunner.run(test);
 	}
-
-	/**
-	 * This delte does a deepDelete for an ICVSResource and deletes all
-	 * the cached information for the resource and all its children as
-	 * well.
-	 * At some point this should be integrated into the LocalResource ...
-	 */
-	public static void delete(ICVSResource resource) throws CVSException {
-		
-		// Deleting a file is an add-on that we need for the same-result
-		// enviorment
-		if (!resource.isFolder()) {
-			resource.delete();
-			CVSProviderPlugin.getSynchronizer().reload(((LocalResource)resource.getParent()).getLocalFile(), new NullProgressMonitor());
-			return;
-		}
-		
-		ICVSFolder folder = (ICVSFolder) resource;
-		
-		if (!folder.isCVSFolder()) {		
-			ICVSFolder[] folders = folder.getFolders();
-			for (int i = 0; i < folders.length; i++) {
-				delete(folders[i]);
-			}
-		}
-		
-		folder.delete();
-		CVSProviderPlugin.getSynchronizer().reload(((LocalResource)folder).getLocalFile(), new NullProgressMonitor());
-	}	
 }
 
diff --git a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/NullOutputStream.java b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/NullOutputStream.java
deleted file mode 100644
index 6419fb0..0000000
--- a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/NullOutputStream.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.eclipse.team.tests.ccvs.core;
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */
-import java.io.IOException;
-import java.io.OutputStream;
-
-/**
- * @version 	1.0
- * @author 	${user}
- */
-public class NullOutputStream extends OutputStream {
-
-	/**
-	 * Constructor for NullOutputStream.
-	 */
-	public NullOutputStream() {
-		super();
-	}
-
-	/*
-	 * @see OutputStream#write(int)
-	 */
-	public void write(int arg0) throws IOException {
-	}
-
-}
diff --git a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/BasicTest.java b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/BasicTest.java
index 7e6a159..0320588 100644
--- a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/BasicTest.java
+++ b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/BasicTest.java
@@ -8,18 +8,16 @@
 
 import junit.framework.Test;
 import junit.framework.TestSuite;
-import org.eclipse.team.internal.ccvs.core.CVSException;
 import org.eclipse.team.tests.ccvs.core.JUnitTestCase;
 
 public class BasicTest extends JUnitTestCase {
-	
 	SameResultEnv env1;
 	SameResultEnv env2;
 	
 	public BasicTest(String arg) {
 		super(arg);
-		env1 = new SameResultEnv(arg,getFile("checkout1"));
-		env2 = new SameResultEnv(arg,getFile("checkout2"));
+		env1 = new SameResultEnv(arg + "-checkout1");
+		env2 = new SameResultEnv(arg + "-checkout2");
 	}
 	
 	public BasicTest() {
@@ -33,7 +31,7 @@
 	public static Test suite() {
 		TestSuite suite = new TestSuite(BasicTest.class);
 		return new CompatibleTestSetup(suite);
-		//return new CompatibleTestSetup(new BasicTest("testRTag"));
+		//return new CompatibleTestSetup(new BasicTest("testDate"));
 	}
 	public void setUp() throws Exception {
 		env1.setUp();
@@ -44,10 +42,9 @@
 		env2.deleteFile("proj2");
 	}
 	
-	public void tearDown() throws CVSException {
+	public void tearDown() throws Exception {
 		env1.tearDown();
 		env2.tearDown();
-		assertSynchronizerEmpty();
 	}
 	
 	public void testAdd() throws Exception {
@@ -130,7 +127,7 @@
 		
 		// change the file "proj1/folder1/c.txt" in env1 check it in
 		// on the server
-		env1.appendToFile("proj2/f1/c.txt","AppendIt");
+		env1.appendToFile("proj2/f1/c.txt", new String[] { "AppendIt" });
 		env1.execute("ci",new String[]{"-m","TestMessage"},new String[]{"proj2"},"");
 		
 		// assure that the file is different in env1 and env2
@@ -167,7 +164,7 @@
 		
 		env1.deleteFile("proj2/a.txt");
 		env1.deleteFile("proj2/f1/c.txt");
-		env1.appendToFile("proj2/f1/b.txt","AppendIt");
+		env1.appendToFile("proj2/f1/b.txt",new String[] { "AppendIt" });
 
 		env1.execute("status",EMPTY_ARGS,new String[]{"proj2"});
 		env1.execute("status",EMPTY_ARGS,new String[0],"proj2");
@@ -186,7 +183,7 @@
 		
 		env1.deleteFile("proj2/a.txt");
 		env1.deleteFile("proj2/f1/c.txt");
-		env1.appendToFile("proj2/f1/b.txt","AppendIt");
+		env1.appendToFile("proj2/f1/b.txt",new String[] { "AppendIt" });
 
 		env1.execute("log",EMPTY_ARGS,new String[]{"proj2"});
 		env1.execute("log",EMPTY_ARGS,new String[0],"proj2");
@@ -205,7 +202,7 @@
 		
 		env1.deleteFile("proj2/a.txt");
 		env1.deleteFile("proj2/f1/c.txt");
-		env1.appendToFile("proj2/f1/b.txt","AppendIt");
+		env1.appendToFile("proj2/f1/b.txt",new String[] { "AppendIt" });
 
 		env1.execute("tag",new String[]{"-b"},new String[]{"tag2","proj2"});
 
@@ -215,7 +212,7 @@
 		
 		// Try an commit and an add in the two different streams
 		env1.execute("co",new String[]{"-r","tag1"},new String[]{"proj2"});
-		env1.appendToFile("proj2/f1/b.txt","AppendItTwo");
+		env1.appendToFile("proj2/f1/b.txt", new String[] { "AppendItTwo" });
 		env1.createRandomFile("proj2/d.txt");
 		env1.execute("add",new String[0],new String[]{"d.txt"},"proj2");
 		env1.execute("ci",new String[]{"-m","branch"},new String[]{"proj2"});
@@ -223,7 +220,7 @@
 		env1.execute("co",new String[]{"-r","tag1"},new String[]{"proj2"});
 
 		env2.execute("co",new String[]{"-r","tag2"},new String[]{"proj2"});
-		env2.appendToFile("proj2/f1/b.txt","AppendItThree");
+		env2.appendToFile("proj2/f1/b.txt", new String[] { "AppendItThree" });
 		env2.createRandomFile("proj2/d.txt");
 		env2.execute("add",new String[0],new String[]{"d.txt"},"proj2");
 		env2.execute("ci",new String[]{"-m","branch"},new String[]{"proj2"});	
@@ -235,7 +232,7 @@
 		// Try to branch of a workspace with local changes
 		env1.execute("co",EMPTY_ARGS,new String[]{"proj2"});
 		JUnitTestCase.waitMsec(1500);
-		env1.appendToFile("proj2/f1/b.txt","AppendIt");
+		env1.appendToFile("proj2/f1/b.txt",new String[] { "AppendIt" });
 		env1.execute("tag",new String[]{"-b"},new String[]{"branch-with-changes","proj2"});
 		env1.execute("update",new String[]{"-r", "branch-with-changes"},new String[]{"proj2"});
 	}
@@ -247,7 +244,7 @@
 		
 		env1.deleteFile("proj2/a.txt");
 		env1.deleteFile("proj2/f1/c.txt");
-		env1.appendToFile("proj2/f1/b.txt","AppendIt");
+		env1.appendToFile("proj2/f1/b.txt",new String[] { "AppendIt" });
 
 		env1.execute("tag",EMPTY_ARGS,new String[]{"tag2","proj2"});
 		env1.execute("tag",EMPTY_ARGS,new String[]{"tag2"},"proj2");
@@ -347,8 +344,8 @@
 		
 		env1.setIgnoreExceptions(true);
 		
-		env1.appendToFile("proj2/f1/c.txt","AppendIt2");
-		env1.appendToFile("proj2/f1/b.txt","AppendIt");
+		env1.appendToFile("proj2/f1/c.txt",new String[] {"AppendIt2" });
+		env1.appendToFile("proj2/f1/b.txt",new String[] { "AppendIt" });
 		
 		env1.execute("diff",EMPTY_ARGS,new String[]{"proj2"});
 		env1.execute("diff",EMPTY_ARGS,new String[0],"proj2");
@@ -365,7 +362,7 @@
 	public void testReadOnly() throws Exception {			
 		env1.execute("co",new String[]{"-r"},EMPTY_ARGS,new String[]{"proj2"},"");
 		env1.execute("update",new String[0],EMPTY_ARGS,new String[]{"proj2"},"");
-		env1.deleteFile(".");
+		env1.deleteFile("");
 		env1.writeToFile("tmp.txt",new String[0]);
 		env1.deleteFile("tmp.txt");	
 		env1.execute("co",EMPTY_ARGS,new String[]{"proj2"},"");
@@ -437,14 +434,14 @@
 
 		waitMsec(1100);
 	
-		env1.appendToFile("proj2/a.txt","AppendIt");
+		env1.appendToFile("proj2/a.txt",new String[] { "AppendIt" });
 		env1.execute("ci",new String[]{"-m","msg"},new String[]{"proj2"});
 		firstChange = GregorianCalendar.getInstance().getTime();
 
 		waitMsec(1100);
 			
-		env1.appendToFile("proj2/a.txt","AppendIt2");
-		env1.appendToFile("proj2/f1/b.txt","AppendIt2");
+		env1.appendToFile("proj2/a.txt",new String[] { "AppendIt2" });
+		env1.appendToFile("proj2/f1/b.txt",new String[] { "AppendIt2" });
 		env1.execute("ci",new String[]{"-m","msg"},new String[]{"proj2"});
 		secondChange = GregorianCalendar.getInstance().getTime();
 
@@ -475,12 +472,12 @@
 		
 		// We get try to merge changes from different dates
 		env1.execute("co",new String[0],new String[]{"proj2"});
-		env1.appendToFile("proj2/a.txt","This is the world ...");
+		env1.appendToFile("proj2/a.txt", new String[] { "This is the world ..." });
 		env1.execute("update",new String[]{"-D",toGMTString(beforeChange)},new String[]{"proj2"});
-		env1.appendToFile("proj2/a.txt","... witch constantly changes");
+		env1.appendToFile("proj2/a.txt", new String[] {"... which constantly changes" });
 		env1.execute("update",new String[]{"-A"},new String[]{"proj2"});
 		// Change something to be able to commit
-		env1.appendToFile("proj2/a.txt","... and the changes are aproved"); 
+		env1.appendToFile("proj2/a.txt", new String[] { "... and the changes are approved" });
 		env1.execute("ci",new String[]{"-m","msg"},new String[]{"proj2"});
 		
 	}
diff --git a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/CompatibleTestSetup.java b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/CompatibleTestSetup.java
index ffac0a0..c5e9916 100644
--- a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/CompatibleTestSetup.java
+++ b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/CompatibleTestSetup.java
@@ -14,13 +14,16 @@
  * @author 	${user}
  */
 public class CompatibleTestSetup extends CVSTestSetup {
-
-	public static final String REFERENCE_CLIENT_REPOSITORY=System.getProperty("eclipse.cvs.repository1");
-	public static final String ECLIPSE_CLIENT_REPOSITORY=System.getProperty("eclipse.cvs.repository2");
-	
+	public static final String ECLIPSE_REPOSITORY_LOCATION;
+	public static final String REFERENCE_REPOSITORY_LOCATION;
 	public static CVSRepositoryLocation referenceClientRepository;
 	public static CVSRepositoryLocation eclipseClientRepository;
 	
+	static {
+		REFERENCE_REPOSITORY_LOCATION = System.getProperty("eclipse.cvs.repository1");
+		ECLIPSE_REPOSITORY_LOCATION = System.getProperty("eclipse.cvs.repository2");
+	}	
+	
 	/**
 	 * Constructor for CompatibleTestSetup.
 	 */
@@ -34,10 +37,12 @@
 	public void setUp() throws CVSException {
 		CVSProviderPlugin.getPlugin().setPruneEmptyDirectories(false);
 		CVSProviderPlugin.getPlugin().setFetchAbsentDirectories(false);
-		if ((referenceClientRepository != null) && (eclipseClientRepository != null))
-			return;
-		referenceClientRepository = setupRepository(REFERENCE_CLIENT_REPOSITORY);
-		eclipseClientRepository = setupRepository(ECLIPSE_CLIENT_REPOSITORY);
+
+		// setup the repositories
+		if (referenceClientRepository == null)
+			referenceClientRepository = setupRepository(REFERENCE_REPOSITORY_LOCATION);
+		if (eclipseClientRepository == null)
+			eclipseClientRepository = setupRepository(ECLIPSE_REPOSITORY_LOCATION);
 	}
 	
 	public void tearDown() throws CVSException {
diff --git a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/ConflictTest.java b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/ConflictTest.java
index e45529e..1957df2 100644
--- a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/ConflictTest.java
+++ b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/ConflictTest.java
@@ -5,12 +5,9 @@
  */
 import junit.framework.Test;
 import junit.framework.TestSuite;
-import org.eclipse.team.internal.ccvs.core.CVSException;
-import org.eclipse.team.internal.ccvs.core.connection.CVSServerException;
 import org.eclipse.team.tests.ccvs.core.JUnitTestCase;
 
 public class ConflictTest extends JUnitTestCase {
-
 	SameResultEnv env1;
 	SameResultEnv env2;
 	
@@ -20,8 +17,8 @@
 	
 	public ConflictTest(String arg) {
 		super(arg);
-		env1 = new SameResultEnv(arg, getFile("checkout1"));
-		env2 = new SameResultEnv(arg, getFile("checkout2"));
+		env1 = new SameResultEnv(arg + "checkout1");
+		env2 = new SameResultEnv(arg + "checkout2");
 	}
 
 	public void setUp() throws Exception {
@@ -33,7 +30,7 @@
 		env2.deleteFile("proj2");
 	}
 	
-	public void tearDown() throws CVSException {
+	public void tearDown() throws Exception {
 		env1.tearDown();
 		env2.tearDown();
 	}
@@ -50,8 +47,8 @@
 		env2.execute("co",EMPTY_ARGS,new String[]{"proj2"},"");
 		
 		// change the file in both directories in a different way
-		env1.appendToFile("proj2/f1/c.txt","AppendIt This");
-		env2.appendToFile("proj2/f1/c.txt","AppendIt That");
+		env1.appendToFile("proj2/f1/c.txt", new String[] { "AppendIt This" });
+		env2.appendToFile("proj2/f1/c.txt", new String[] { "AppendIt That" });
 		
 		// commit changes of the first
 		env1.execute("ci",new String[]{"-m","TestMessage"},new String[]{"proj2"},"");
@@ -68,7 +65,7 @@
 		
 		// Make a change to the file in order to let the cvs-client know
 		// that we solved the confilict
-		env2.appendToFile("proj2/f1/c.txt","That's allright");		
+		env2.appendToFile("proj2/f1/c.txt", new String[] { "That's allright" });
 		env2.execute("ci",new String[]{"-m","TestMessage"},new String[]{"proj2"},"");
 	}
 }
\ No newline at end of file
diff --git a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/ModuleTest.java b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/ModuleTest.java
index feaa6b6..fd9080c 100644
--- a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/ModuleTest.java
+++ b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/ModuleTest.java
@@ -3,20 +3,18 @@
  * (c) Copyright IBM Corp. 2000, 2002.
  * All Rights Reserved.
  */
-import junit.awtui.TestRunner;
 import junit.framework.Test;
 import junit.framework.TestSuite;
 import org.eclipse.team.tests.ccvs.core.JUnitTestCase;
 
 public class ModuleTest extends JUnitTestCase {
-	
 	SameResultEnv env1;
 	SameResultEnv env2;
 	
 	public ModuleTest(String arg) {
 		super(arg);
-		env1 = new SameResultEnv(arg,getFile("checkout1"));
-		env2 = new SameResultEnv(arg,getFile("checkout2"));
+		env1 = new SameResultEnv(arg + "checkout1");
+		env2 = new SameResultEnv(arg + "checkout2");
 	}
 
 	public static void main(String[] args) {	
@@ -59,7 +57,7 @@
 	public void testSimpleModule() throws Exception {
 		setUpModuleFile(new String[]{"mod1 proj2"});
 		env1.execute("co",EMPTY_ARGS,new String[]{"mod1"});
-		env1.appendToFile("mod1/a.txt","Append");
+		env1.appendToFile("mod1/a.txt", new String[] { "Append" });
 		env1.execute("ci",new String[]{"-m","m"},new String[]{"mod1"});
 		env1.execute("update",EMPTY_ARGS,new String[]{"mod1"});
 	}
@@ -70,7 +68,7 @@
 										"mod1f &mod1-f1 &mod1-f2"});
 		
 		env1.execute("co",EMPTY_ARGS,new String[]{"mod1f"});
-		env1.appendToFile("mod1f/mod1-f1/b.txt","Append");
+		env1.appendToFile("mod1f/mod1-f1/b.txt", new String[] { "Append" });
 		env1.execute("ci",new String[]{"-m","m"},new String[]{"mod1f"});
 		env1.execute("update",EMPTY_ARGS,new String[]{"mod1f"});
 	}
@@ -82,7 +80,7 @@
 										"mod1f -a mod1-f1 mod1-f2"});
 		
 		env1.execute("co",EMPTY_ARGS,new String[]{"mod1f"});
-		env1.appendToFile("mod1-f1/b.txt","Append");
+		env1.appendToFile("mod1-f1/b.txt", new String[] { "Append" });
 		env1.execute("ci",new String[]{"-m","m"},new String[]{"mod1-f1","mod1-f2"});
 		env1.execute("update",EMPTY_ARGS,new String[]{"mod1-f1","mod1-f2"});
 	}
diff --git a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/ReferenceClient.java b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/ReferenceClient.java
deleted file mode 100644
index d3268bf..0000000
--- a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/ReferenceClient.java
+++ /dev/null
@@ -1,203 +0,0 @@
-package org.eclipse.team.tests.ccvs.core.compatible;
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.PrintStream;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.team.ccvs.core.*;
-import org.eclipse.team.ccvs.core.ICVSFolder;
-import org.eclipse.team.internal.ccvs.core.CVSException;
-import org.eclipse.team.internal.ccvs.core.client.Session;
-import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot;
-import org.eclipse.team.internal.ccvs.core.util.SyncFileUtil;
-
-/**
- * This class is responsible for executing cvs commands using
- * a reference CVS command line client.
- */
-public class ReferenceClient {
-	
-	public static final String cvsLocation = System.getProperty("eclipse.cvs.command");
-	/**
-	 * Puts opetions into one String seperated by
-	 * space.
-	 * starts and ends with a space.
-	 */
-	private static String flatenOptions(String[] options) {
-		
-		StringBuffer result = new StringBuffer(" ");
-		String quote;
-		
-		for (int i=0; i<options.length; i++) {
-			
-			if (options[i].indexOf(" ")==-1) {
-				quote = "";
-			} else {
-				quote = "\"";
-			}
-			result.append(quote);
-			result.append(options[i]);
-			result.append(quote);
-			result.append(' ');
-		}
-			
-		return result.toString();
-	}
-	
-	public static void execute(String request, 
-						String[] globalOptions, 
-						String[] localOptions, 
-						String[] arguments,
-						File ioRoot,
-						IProgressMonitor monitor, 
-						PrintStream messageOut) 
-						throws CVSException {
-
-		Runtime runtime;
-		Process process;
-		BufferedReader stdIn;
-		BufferedReader errIn;
-		ICVSFolder mRoot;
-		
-		String global;
-		String local;
-		String arg;
-		String commandLine;
-
-		globalOptions = (String[]) globalOptions.clone();
-		mRoot = CVSWorkspaceRoot.getCVSFolderFor(ioRoot);
-		
-		runtime = Runtime.getRuntime();
-		global = flatenOptions(globalOptions);
-		local = flatenOptions(localOptions);
-		arg = flatenOptions(arguments);
-		
-		commandLine = cvsLocation + " ";
-		commandLine = commandLine + global;
-		commandLine = commandLine + request + " ";
-		commandLine = commandLine + local;
-		commandLine = commandLine + arg;
-		
-		// System.out.println(ioRoot.getPath() + "> " + commandLine);
-		
-		try {
-			process = runtime.exec(commandLine, null, ioRoot);
-		} catch (IOException e) {
-			throw new CVSException("IOException while executing ReferenceClient",e);
-		}
-		
-		stdIn = new BufferedReader(new InputStreamReader(process.getInputStream()));
-		new ContiniousPipe(stdIn, messageOut, "M ");
-
-		errIn = new BufferedReader(new InputStreamReader(process.getErrorStream()));
-		new ContiniousPipe(errIn, messageOut, "E ");
-
-		try {
-			process.waitFor();
-		} catch (InterruptedException e) {
-			throw new CVSException("InterruptedException while executing ReferenceClient",e);
-		}
-		
-		if (process.exitValue() != 0) {
-			throw new ReferenceException("Return Code of CVS reference client: " + 
-									process.exitValue() + "\nwhile executing: " + 
-									commandLine);
-		}	
-		
-		SyncFileUtil.mergeEntriesLogFiles(ioRoot);
-		
-	}
-	
-	/**
-	 * 
-	 * returns ":pserver:username@host:/cvs/root"
-	 *         when you insert ":pserver:username:password@host:/cvs/root"
-	 */
-	public static String removePassword(String repoName) {
-		
-		int atPlace = -1;
-		int colonPlace = -1;
-		int colonCount = 0;
-		String currentChar; 
-		
-		for (int i=0; i<repoName.length(); i++) {
-			
-			currentChar = repoName.substring(i,i+1);
-			
-			if (currentChar.equals(":")) {
-				colonCount++;
-				
-				if (colonCount == 3) {
-					colonPlace = i;
-				}
-			}
-			
-			if (currentChar.equals("@")) {
-				if (colonPlace == -1) {
-					
-					// If the @ comes before the third colon, then 
-					// we do not have a password and return with the
-					// same string
-					return repoName;
-				} else {
-					atPlace = i;
-				}
-				
-			}
-		}
-		
-		if (atPlace == -1) {
-			return repoName;
-		}
-		
-		return repoName.substring(0,colonPlace) + repoName.substring(atPlace);
-	}
-}
-
-/**
- * This class does continiously pipe from a bufferdReader
- * to a printStream. It does stop as soon, as the bufferdReader is
- * closed an therefore an IOException is thrown or the pipe returns null.
- * 
- * It does close the BufferedReader on it's own (to be sure that it got
- * everything)
- */
-class ContiniousPipe implements Runnable {
-	
-	BufferedReader in;
-	PrintStream out;
-	String prefix;
-	
-	ContiniousPipe(BufferedReader in, PrintStream out, String prefix) {
-		this.in = in;
-		this.out = out;
-		this.prefix = prefix;
-		(new Thread(this)).start();
-	}
-	
-	public void run() {
-		
-		String line;
-		
-		try {
-			while ((line=in.readLine()) != null) {
-				out.println(prefix + line);
-			}
-		} catch (IOException e) {
-			// Should not happen, as the PrintStream does not throw IOExceptions
-			// at all an in is a stream from a process
-		} finally {
-			
-			try {
-				in.close();
-			} catch (IOException e) {}
-			
-		}
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/ReferenceException.java b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/ReferenceException.java
deleted file mode 100644
index 2f5678b..0000000
--- a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/ReferenceException.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.eclipse.team.tests.ccvs.core.compatible;
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */
-import org.eclipse.team.internal.ccvs.core.CVSException;
-
-public class ReferenceException extends CVSException {
-	
-	public ReferenceException(String message) {
-		super(message);
-	}
-
-}
-
diff --git a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/SameResultEnv.java b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/SameResultEnv.java
index 975c9ad..4b06d1c 100644
--- a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/SameResultEnv.java
+++ b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/SameResultEnv.java
@@ -4,29 +4,33 @@
  * All Rights Reserved.
  */
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.PrintStream;
 import java.text.ParseException;
+import java.util.StringTokenizer;
 
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.team.ccvs.core.*;
-import org.eclipse.team.ccvs.core.CVSProviderPlugin;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.team.ccvs.core.ICVSFile;
 import org.eclipse.team.ccvs.core.ICVSFolder;
 import org.eclipse.team.ccvs.core.ICVSResource;
 import org.eclipse.team.internal.ccvs.core.CVSException;
-import org.eclipse.team.internal.ccvs.core.client.Session;
-import org.eclipse.team.internal.ccvs.core.connection.CVSRepositoryLocation;
-import org.eclipse.team.internal.ccvs.core.connection.CVSServerException;
 import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot;
-import org.eclipse.team.internal.ccvs.core.resources.ICVSFile;
-import org.eclipse.team.internal.ccvs.core.resources.LocalResource;
+import org.eclipse.team.internal.ccvs.core.resources.EclipseSynchronizer;
 import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo;
 import org.eclipse.team.internal.ccvs.core.util.EntryFileDateFormat;
 import org.eclipse.team.internal.ccvs.core.util.Util;
+import org.eclipse.team.tests.ccvs.core.CVSClientException;
+import org.eclipse.team.tests.ccvs.core.CommandLineCVSClient;
+import org.eclipse.team.tests.ccvs.core.EclipseCVSClient;
 import org.eclipse.team.tests.ccvs.core.JUnitTestCase;
-import org.eclipse.team.tests.ccvs.core.NullOutputStream;
 
 
 /**
@@ -42,57 +46,125 @@
  * two (or more) different enviorments to test certain things.
  */
 public final class SameResultEnv extends JUnitTestCase {
-	
-	public static final String REFERENCE_CLIENT_WORKSPACE="reference";
-	public static final String ECLIPSE_CLIENT_WORKSPACE="eclipse";
-	
-	private File workspace;
-	private File referenceClientRoot;
-	private File eclipseClientRoot;
-	private boolean ignoreExceptions=false;
-	private boolean expectExceptions=false;
-	
-	private CVSRepositoryLocation referenceClientRepository;
-	private CVSRepositoryLocation eclipseClientRepository;
-		
-	public SameResultEnv(String arg, File workspace) {
+	private IProject referenceProject;
+	private ICVSFolder referenceRoot;
+	private IProject eclipseProject;
+	private ICVSFolder eclipseRoot;
+
+	private boolean ignoreExceptions;
+
+	public SameResultEnv(String arg) {
 		super(arg);
-		this.workspace = workspace;
-		referenceClientRoot = new File(workspace, REFERENCE_CLIENT_WORKSPACE);
-		eclipseClientRoot = new File(workspace, ECLIPSE_CLIENT_WORKSPACE);
-		
-		try {
-			deleteFile(".");
-		} catch (CVSException e) {
-			fail();
-		}
 	}
 	
 	/**
 	 * Always to be called in the setUp of the testCase that wants to 
 	 * use the same-result Enviorment.
 	 */
-	public void setUp() throws CVSException {
+	public void setUp() throws Exception {
+		super.setUp();
+		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+		// setup reference client test project
+		referenceProject = root.getProject(getName() + "-reference");
+		referenceProject.delete(true /*deleteContent*/, true /*force*/, null);
+		mkdirs(referenceProject);
+		referenceRoot = CVSWorkspaceRoot.getCVSFolderFor(referenceProject);
+		
+		// setup eclipse client test project
+		eclipseProject = root.getProject(getName() + "-eclipse");
+		eclipseProject.delete(true /*deleteContent*/, true /*force*/, null);
+		mkdirs(eclipseProject);
+		eclipseRoot = CVSWorkspaceRoot.getCVSFolderFor(eclipseProject);
+
 		// By default, exceptions are not ignored.
 		// Specific test cases can choose to ignore exceptions
 		ignoreExceptions = false;
-		mkdirs(".");
 	}
 	
 	/**
 	 * Always to be called in the tearDown of the testCase that wants to 
 	 * use the same-result Enviorment.
 	 */
-	public void tearDown() throws CVSException {
-		deleteFile("");
+	public void tearDown() throws Exception {
+		// we deliberately don't clean up test projects to simplify debugging
+		super.tearDown();
 	}
 	
 	/**
+	 * Helper method.
+	 * Calls execute(command, EMPTY_ARGS, localOptions, arguments, pathRelativeToRoot)
+	 */				
+	public void execute(String command, String[] localOptions, String[] arguments, String pathRelativeToRoot)
+		throws CVSException {
+		execute(command, EMPTY_ARGS, localOptions, arguments, pathRelativeToRoot);
+	}
+
+	/**
+	 * Helper method.
+	 * Calls execute(command, EMPTY_ARGS, localOptions, arguments, "")
+	 */				
+	public void execute(String command, String[] localOptions, String[] arguments)
+		throws CVSException {
+		execute(command, EMPTY_ARGS, localOptions, arguments, "");
+	}
+
+	/**
+	 * Runs a command twice, once in the reference environments, once
+	 * in the eclipse environment.  Compares the resulting resources
+	 * on disk, but not console output.
+	 */
+	public void execute(String command,
+		String[] globalOptions, String[] localOptions, String[] arguments,
+		String pathRelativeToRoot) throws CVSException {
+		
+		// run with reference client
+		boolean referenceClientException = false;
+		try {
+			File localRoot = referenceProject.getLocation().toFile();
+			if (pathRelativeToRoot.length() != 0) {
+				localRoot = new File(localRoot, pathRelativeToRoot);
+			}
+			CommandLineCVSClient.execute(
+				CompatibleTestSetup.referenceClientRepository.getLocation(),
+				localRoot, command, globalOptions, localOptions, arguments);
+		} catch (CVSClientException e) {
+			if (! ignoreExceptions) throw e;
+			referenceClientException = true;
+		} finally {
+			try {
+				referenceProject.refreshLocal(IResource.DEPTH_INFINITE, null);
+				EclipseSynchronizer.getInstance().flushAll(referenceProject, false); // remove me once refresh local fixed
+			} catch (CoreException e) {
+				fail("CoreException during refreshLocal: " + e.getMessage());
+			}
+		}
+		
+		// run with Eclipse client
+		boolean eclipseClientException = false;
+		try {
+			ICVSFolder localRoot = eclipseRoot;
+			IPath path = new Path(pathRelativeToRoot);
+			while (path.segmentCount() != 0) {
+				localRoot = localRoot.getFolder(path.segment(0));
+				path = path.removeFirstSegments(1);
+			}
+			EclipseCVSClient.execute(
+				CompatibleTestSetup.eclipseClientRepository, localRoot,
+				command, globalOptions, localOptions, arguments);
+		} catch (CVSClientException e) {
+			if (! ignoreExceptions) throw e;
+			eclipseClientException = true;
+		}
+		assertEquals(referenceClientException, eclipseClientException);
+		assertConsistent();
+	}	
+
+	/**
 	 * Deletes files on the both of the cvs-servers.
 	 */
-	public void magicDeleteRemote(String project) throws CVSException {
-		magicDeleteProject(CompatibleTestSetup.referenceClientRepository,project);
-		magicDeleteProject(CompatibleTestSetup.eclipseClientRepository,project);		
+	public void magicDeleteRemote(String remoteName) throws CVSException {
+		super.magicDeleteRemote(CompatibleTestSetup.referenceClientRepository, remoteName);
+		super.magicDeleteRemote(CompatibleTestSetup.eclipseClientRepository, remoteName);		
 	}
 	
 	/**
@@ -104,180 +176,48 @@
 	 *     b.txt
 	 *     c.txt
 	 */
-	public void magicSetUpRepo(String project) throws CVSException {
-		magicSetUpRepo(project,new String[]{"a.txt","f1/b.txt","f1/c.txt"});
+	public void magicSetUpRepo(String projectName)
+		throws IOException, CoreException, CVSException {
+		magicSetUpRepo(projectName, new String[]{"a.txt","f1/b.txt","f1/c.txt"});
 	}
 	
 	/**
 	 * Set up both of the repos on the cvs-server(s) with a filestructre
 	 * resulting for your input in the parameter createResources.
 	 */
-	public void magicSetUpRepo(String project,String[] createResources) throws CVSException {
+	public void magicSetUpRepo(String projectName, String[] createResources)
+		throws IOException, CoreException, CVSException {
+		magicDeleteRemote(projectName);
+
+		IProject projectRoot = workspaceRoot.getProject(projectName + "-setup-tmp");
+		mkdirs(projectRoot);
+		createRandomFile(projectRoot, createResources);
 		
-		// This will trigger asynchronizer reload
-		// deleteFile(project);
-		magicDeleteRemote(project);
-		
-		createRandomFile(createResources, project);
-		execute("import",new String[]{"-m","msg"},new String[]{project,"a","b"},project);
-		
-		deleteFile(".");
-		mkdirs(".");
-	}
+		String[] lOptions = new String[]{"-m","msg"};
+		String[] args = new String[]{projectName,"a","b"};
 	
-	/**
-	 * Give null this gives an empty string-array back, otherwise
-	 * the parameter.
-	 */
-	private static String[] notNull(String[] arg) {
-		if (arg == null) {
-			return new String[0];
-		} else {
-			return arg;
-		}
+		magicDeleteRemote(CompatibleTestSetup.referenceClientRepository, projectName);
+		EclipseCVSClient.execute(CompatibleTestSetup.referenceClientRepository, CVSWorkspaceRoot.getCVSFolderFor(projectRoot),
+			"import", EMPTY_ARGS, lOptions, args);
+			
+		magicDeleteRemote(CompatibleTestSetup.eclipseClientRepository, projectName);
+		EclipseCVSClient.execute(CompatibleTestSetup.eclipseClientRepository, CVSWorkspaceRoot.getCVSFolderFor(projectRoot),
+			"import", EMPTY_ARGS, lOptions, args);
+
+		projectRoot.delete(false /*force*/, null);
 	}
 
 	/**
-	 * Convienience Method, does the same like:<br>
-	 * execute(request,null,localOptions,arguments,rootExtention) 
-	 */				
-	public void execute(String request, 
-						String[] localOptions, 
-						String[] arguments,
-						String rootExtention) 
-						throws CVSException {
-		
-		execute(request,new String[0],localOptions,arguments,rootExtention);
-	}
-
-	/**
-	 * Convienience Method, does the same like:<br>
-	 * execute(request,null,localOptions,arguments,null) 
-	 */		
-	public void execute(String request, 
-						String[] localOptions, 
-						String[] arguments) 
-						throws CVSException {
-
-		execute(request,new String[0],localOptions,arguments,"");
-	}
-	
-	/**
-	 * Run a command in the two folders of this enviorment. In one folder the
-	 * reference-client runs in the the other the eclipse-client. After that
-	 * the results on disc are compared (the output of the clients is not
-	 * considert for the comparison)
-	 */
-	public void execute(String request, 
-						String[] globalOptions, 
-						String[] localOptions, 
-						String[] arguments,
-						String rootExtention) 
-						throws CVSException {
-		
-		globalOptions = notNull(globalOptions);
-		
-		String[] gOptions1 = new String[globalOptions.length + 2];
-		String[] gOptions2 = new String[globalOptions.length + 2];
-		
-		System.arraycopy(globalOptions,0,gOptions1,0,globalOptions.length);
-		System.arraycopy(globalOptions,0,gOptions2,0,globalOptions.length);
-		
-		gOptions1[globalOptions.length] = gOptions2[globalOptions.length] = "-d";
-		gOptions1[globalOptions.length + 1] = CompatibleTestSetup.REFERENCE_CLIENT_REPOSITORY;
-		gOptions2[globalOptions.length + 1] = CompatibleTestSetup.ECLIPSE_CLIENT_REPOSITORY;
-
-		execute(request,gOptions1,gOptions2,localOptions,arguments,rootExtention);
-	}
-	
-	/**
-	 * Acctally run the command in both folders. See doc above.
-	 */
-	private void execute(String request, 
-						String[] globalOptions1, 
-						String[] globalOptions2, 
-						String[] localOptions, 
-						String[] arguments,
-						String rootExtention) 
-						throws CVSException {
-		
-		assertNotNull(request);
-		assertNotNull(globalOptions1);
-		assertNotNull(globalOptions);
-		
-		boolean referenceClientException = false;
-		boolean eclipseClientException = false;
-		
-		localOptions = notNull(localOptions);
-		arguments = notNull(arguments);
-		if (rootExtention == null || rootExtention.equals(".")) {
-			rootExtention = "";
-		}
-		
-		try {
-			ReferenceClient.execute(request, 
-									globalOptions1, 
-									localOptions, 
-									arguments,
-									new File(referenceClientRoot,rootExtention),
-									new NullProgressMonitor(), 
-									new PrintStream(new NullOutputStream()));
-		} catch (ReferenceException e) {
-			referenceClientException = true;			
-			if (!ignoreExceptions) {
-				throw e;
-			}
-		}
-		
-		try {
-			execute(request, 
-					globalOptions2, 
-					localOptions, 
-					arguments,
-					new File(eclipseClientRoot,rootExtention),
-					new NullProgressMonitor(), 
-					new PrintStream(new NullOutputStream()));
-		} catch (CVSServerException e) {
-			eclipseClientException = true;
-			if (!ignoreExceptions) {
-				throw e;
-			}
-		}
-		if(ignoreExceptions) {
-			assertEquals(referenceClientException == true, eclipseClientException == true);
-		}
-		assertConsistent();
-	}
-
-	/**
-	 * Checks whether the two directories inside the environment
-	 * are equal and therefore the state valid.
-	 */
-	public void assertConsistent() throws CVSException {
-		ICVSFolder referenceFolder = Session.getManagedFolder(referenceClientRoot);
-		ICVSFolder eclipseFolder = Session.getManagedFolder(eclipseClientRoot);
-		CVSProviderPlugin.getSynchronizer().reload(((LocalResource)referenceFolder).getLocalFile(), new NullProgressMonitor());
-		CVSProviderPlugin.getSynchronizer().reload(((LocalResource)eclipseFolder).getLocalFile(), new NullProgressMonitor());
-		assertEquals(referenceFolder,eclipseFolder);
-	}
-	
-	/**
 	 * Create a file with random-content in both, the reference client and 
 	 * the eclipse-client.
 	 * 
 	 * @param relativeFileName is the relative path as allways in the 
 	           class used for access
 	 */
-	public void createRandomFile(String relativeFileName) throws CVSException {
-		
-		String randomContent;
-		
-		randomContent = createRandomContent();
-		try {
-			writeToFile(relativeFileName,new String[]{randomContent});
-		} catch (IOException e) {
-			throw new CVSException("IOException while creating random content",e);
-		}
+	public void createRandomFile(String relativeFileName)
+		throws IOException, CoreException {
+		String[] contents = new String[] { createRandomContent() };
+		writeToFile(relativeFileName, contents);
 	}
 
 	/**
@@ -285,18 +225,15 @@
 	 * 
 	 * @see SameResultEnv#createRandomFile(String)
 	 */
-	public void createRandomFile(String[] relativeFileNames, String rootExtention) throws CVSException {
-		
-		if (rootExtention == null || rootExtention.equals(".")) {
-			rootExtention = "";
+	public void createRandomFile(String[] relativeFileNames,
+		String pathRelativeToRoot) throws CoreException, IOException {
+		if (pathRelativeToRoot == null) {
+			pathRelativeToRoot = "";
+		} else if (! pathRelativeToRoot.endsWith("/")) {
+			pathRelativeToRoot += "/";
 		}
-		
-		if (!rootExtention.equals("") && !rootExtention.startsWith("/")) {
-			rootExtention = rootExtention + "/";
-		}
-		
-		for (int i=0; i<relativeFileNames.length; i++) {
-			createRandomFile(rootExtention + relativeFileNames[i]);
+		for (int i = 0; i < relativeFileNames.length; i++) {
+			createRandomFile(pathRelativeToRoot + relativeFileNames[i]);
 		}
 	}
 	
@@ -304,91 +241,82 @@
 	 * Read from the file (check that we have acctually got the same
 	 * content in both versions
 	 */
-	public String[] readFromFile(String relativeFileName) throws IOException {
-		
-		String[] content1;
-		String[] content2;
-		
-		content1 = super.readFromFile(new File(referenceClientRoot,relativeFileName));
-		content2 = super.readFromFile(new File(eclipseClientRoot,relativeFileName));
-		
+	public String[] readFromFile(String relativeFileName)
+		throws IOException, CoreException {
+		IFile referenceFile = referenceProject.getFile(relativeFileName);
+		String[] content1 = super.readFromFile(referenceFile);
+		IFile eclipseFile = eclipseProject.getFile(relativeFileName);
+		String[] content2 = super.readFromFile(eclipseFile);
 		assertEqualsArrays(content1,content2);
-		
 		return content1;
 	}
 	
 	/**
-	 * Delete files from both of the directories
+	 * Delete a file / folder from both directories.
 	 */
-	public void deleteFile(String relativeFileName) throws CVSException {
-		
-		if (".".equals(relativeFileName)) {
-			relativeFileName = "";
-		}
-		
-		File file1 = new File(referenceClientRoot, relativeFileName);
-		File file2 = new File(eclipseClientRoot, relativeFileName);
-		
-		assertEquals(file1.exists(),file2.exists());
-		
-		if (!file1.exists()) {
-			return;
-		}
-		
-		// Call the "clean-up-delete" that cares about deleting the
-		// cache
-		if (file1.isDirectory()) {
-			delete(Session.getManagedFolder(file1));
-			delete(Session.getManagedFolder(file2));
+	public void deleteFile(String relativeFileName) throws CoreException {
+		IResource referenceFile, eclipseFile;
+		if (relativeFileName.length() != 0) {
+			referenceFile = referenceProject.findMember(relativeFileName);
+			eclipseFile = eclipseProject.findMember(relativeFileName);
 		} else {
-			delete(Session.getManagedFile(file1));
-			delete(Session.getManagedFile(file2));
+			referenceFile = referenceProject;
+			eclipseFile = eclipseProject;
 		}
+		assertEquals(referenceFile != null, eclipseFile != null);
+		if (referenceFile == null) return;
+		assertEquals(referenceFile.exists(), eclipseFile.exists());
+		referenceFile.delete(true, null);
+		eclipseFile.delete(true, null);
 	}
 	
 	/**
-	 * Create a folder and all the subfolders 
-	 * in both of the directories
+	 * Creates a folder (and its parents if needed) in both environments.
 	 */
-	public void mkdirs(String folderName) {	
-		(new File(referenceClientRoot,folderName)).mkdirs();
-		(new File(eclipseClientRoot,folderName)).mkdirs();
+	public void mkdirs(String relativeFolderName) throws CoreException {
+		IFolder referenceFolder = referenceProject.getFolder(relativeFolderName);
+		IFolder eclipseFolder = eclipseProject.getFolder(relativeFolderName);
+		assertEquals(referenceFolder.exists(), eclipseFolder.exists());
+		mkdirs(referenceFolder);
+		mkdirs(eclipseFolder);
 	}
 	
 	/**
 	 * Append a String to an file (acctally to both of the files, that are going
 	 * to have the same content)
 	 */
-	public void appendToFile(String relativeFileName, String txt) throws IOException {	
-		File file1 = new File(referenceClientRoot,relativeFileName);
-		File file2 = new File(eclipseClientRoot,relativeFileName);
-
+	public void appendToFile(String relativeFileName, String[] contents)
+		throws IOException, CoreException {
 		// Wait a second so that the timestamp will change for sure
-		waitMsec(2000);
-		
-		appendToFile(file1,txt);
-		appendToFile(file2,txt);
+		waitMsec(1500);
+
+		IFile referenceFile = referenceProject.getFile(relativeFileName);
+		appendToFile(referenceFile, contents);
+		IFile eclipseFile = eclipseProject.getFile(relativeFileName);
+		appendToFile(eclipseFile, contents);		
 	}
 	
 	/**
 	 * Write to the file (acctally to both of the files, that are going
 	 * to have the same content)
-	 * Does create the underlying folder if they do not exist (the version
-	 * of JUnitTest does currently not)
 	 */
-	public void writeToFile(String relativeFileName, String[] content) throws IOException {	
-		
-		File file1 = new File(referenceClientRoot,relativeFileName);
-		File file2 = new File(eclipseClientRoot,relativeFileName);
-		
-		file1.getParentFile().mkdirs();
-		file2.getParentFile().mkdirs();
-
-		writeToFile(file1,content);
-		writeToFile(file2,content);
+	public void writeToFile(String relativeFileName, String[] contents)
+		throws IOException, CoreException {
+		IFile referenceFile = referenceProject.getFile(relativeFileName);
+		writeToFile(referenceFile, contents);
+		IFile eclipseFile = eclipseProject.getFile(relativeFileName);
+		writeToFile(eclipseFile, contents);
 	}		
 
 	/**
+	 * Checks whether the two directories inside the environment
+	 * are equal and therefore the state valid.
+	 */
+	public void assertConsistent() throws CVSException {
+		assertEquals(referenceRoot, eclipseRoot);
+	}	
+
+	/**
 	 * Deep compare of two ManagedResources (most likly folders).
 	 * Passwords are ignored.
 	 * 
@@ -421,12 +349,12 @@
 	private static void assertEquals(ICVSFile mFile1, ICVSFile mFile2) throws CVSException {
 		
 		// Check the permissions on disk
-		assertEquals(getFile(mFile1).canWrite(), getFile(mFile2).canWrite());
+		assertEquals(mFile1.isReadOnly(), mFile2.isReadOnly());
 					
 		// Compare the content of the files
 		try {
-			InputStream in1 = new FileInputStream(getFile(mFile1)); 
-			InputStream in2 = new FileInputStream(getFile(mFile2)); 
+			InputStream in1 = mFile1.getInputStream();
+			InputStream in2 = mFile2.getInputStream();
 			byte[] buffer1 = new byte[(int)mFile1.getSize()];
 			byte[] buffer2 = new byte[(int)mFile2.getSize()];
 			// This is not the right way to do it, because the Stream
@@ -502,8 +430,8 @@
 		assertEquals(mFolder1.isCVSFolder(),mFolder2.isCVSFolder());
 		
 		if (mFolder1.isCVSFolder()) {
-			String root1 = Util.removePassword(mFolder1.getFolderSyncInfo().getRoot());
-			String root2 = Util.removePassword(mFolder2.getFolderSyncInfo().getRoot());
+			String root1 = removePassword(mFolder1.getFolderSyncInfo().getRoot());
+			String root2 = removePassword(mFolder2.getFolderSyncInfo().getRoot());
 			root1 = root1.substring(0,root1.lastIndexOf("@"));
 			root2 = root2.substring(0,root2.lastIndexOf("@"));
 			assertEquals(root1,root2);
@@ -556,4 +484,24 @@
 	public void setIgnoreExceptions(boolean ignoreExceptions) {
 		this.ignoreExceptions = ignoreExceptions;
 	}
+	
+	/**
+	 * returns ":pserver:nkrambro@fiji:/home/nkrambro/repo"
+	 *         when you insert ":pserver:nkrambro:password@fiji:/home/nkrambro/repo"
+	 */
+	public static String removePassword(String root) {
+		StringTokenizer tok = new StringTokenizer(root, ":@", true);
+		StringBuffer filteredRoot = new StringBuffer();
+		int colonCounter = 3;
+		while (tok.hasMoreTokens()) {
+			String token = tok.nextToken();
+			if ("@".equals(token)) colonCounter = -1;
+			if (":".equals(token)) {
+				if (--colonCounter == 0) continue; // skip colon
+			}
+			if (colonCounter == 0) continue; // skip password
+			filteredRoot.append(token);
+		}
+		return filteredRoot.toString();
+	}
 }
\ No newline at end of file
diff --git a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/cvsresources/AllTests.java b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/cvsresources/AllTests.java
index 19c7aca..973a03d 100644
--- a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/cvsresources/AllTests.java
+++ b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/cvsresources/AllTests.java
@@ -18,11 +18,7 @@
 	
 	public static Test suite() {	
 		TestSuite suite = new TestSuite();
-		
-		suite.addTest(LocalFileTest.suite());
-		suite.addTest(LocalFolderTest.suite());
 		suite.addTest(ResourceSyncInfoTest.suite());
-		suite.addTest(SynchronizerTest.suite());
     	return suite; 	
 	}	
 	
diff --git a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/cvsresources/LocalFileTest.java b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/cvsresources/LocalFileTest.java
deleted file mode 100644
index a48ebbf..0000000
--- a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/cvsresources/LocalFileTest.java
+++ /dev/null
@@ -1,221 +0,0 @@
-package org.eclipse.team.tests.ccvs.core.cvsresources;
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.InputStream;
-import java.io.PipedInputStream;
-import java.io.PipedOutputStream;
-
-import junit.awtui.TestRunner;
-import junit.framework.Test;
-import junit.framework.TestSuite;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.team.ccvs.core.*;
-import org.eclipse.team.ccvs.core.CVSProviderPlugin;
-import org.eclipse.team.ccvs.core.ICVSFolder;
-import org.eclipse.team.internal.ccvs.core.CVSException;
-import org.eclipse.team.internal.ccvs.core.resources.ICVSFile;
-import org.eclipse.team.internal.ccvs.core.resources.LocalResource;
-import org.eclipse.team.internal.ccvs.core.syncinfo.FolderSyncInfo;
-import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo;
-import org.eclipse.team.tests.ccvs.core.JUnitTestCase;
-
-
-public class LocalFileTest extends JUnitTestCase {
-	
-	ICVSFile file1;
-	ICVSFile file1a;
-	ICVSFile file2;
-	ICVSFolder folder1;
-	
-	ResourceSyncInfo fileInfo1;
-	
-	File ioFile;
-	
-	
-	public LocalFileTest(String arg) {
-		super(arg);
-	}
-	
-	public static void main(String[] args) {
-		TestRunner.run(LocalFileTest.class);
-	}
-
-
-	public void setUp() throws CVSException {
-		
-		String tmpEntryLine1;
-
-
-		String root = ":server:user:pwd@test:/home";
-		String repo = "repository";		
-		folder1 = getManagedFolder("proj1");
-		folder1.mkdir();
-		folder1.setFolderSyncInfo(new FolderSyncInfo(repo,root,null,false));
-		
-		file1 = folder1.getFile("file1.txt");
-		file1a = folder1.getFile("file1.txt");
-		file2 = folder1.getFile("file2.txt");
-		
-		tmpEntryLine1 = "/.vcm_meta/1.1/Thu Sep 27 18:00:16 2001/-kb/TmyTag";
-		fileInfo1 = new ResourceSyncInfo(tmpEntryLine1,null,null);
-		
-		ioFile = getFile("proj1/file1.txt");
-		
-	}
-	
-	public void tearDown() throws CVSException {
-		folder1.delete();
-		CVSProviderPlugin.getSynchronizer().reload(((LocalResource)folder1).getLocalFile(), new NullProgressMonitor());
-		assertSynchronizerEmpty();			
-		assertTrue(!folder1.exists());
-	}
-
-	public static Test suite() {		
-		TestSuite suite = new TestSuite(LocalFileTest.class);
-    	return suite; 	
-	}
-	
-	public void testFileInfo() throws CVSException {
-		
-		String entryLine1;
-		String entryLine2;
-		String entryLine3;
-		boolean fail=false;
-	
-		entryLine1 = "/.vcm_meta/1.1/27 Sep 2001 18:00:16/-kb/TmyTag";
-		entryLine2 = "/file1.txt/1.1/27 Sep 2001 18:00:16/-kb/TmyTag";
-		entryLine3 = "/file1.txt/1.2/27 Sep 2001 18:00:16/-kb/TmyTag";
-
-		ResourceSyncInfo fileInfo1 = new ResourceSyncInfo(entryLine1,null,null);
-		ResourceSyncInfo fileInfo2 = new ResourceSyncInfo(entryLine2,null,null);
-		ResourceSyncInfo fileInfo3 = new ResourceSyncInfo(entryLine3,null,null);
-
-		file1.setSyncInfo(fileInfo2);
-		
-		assertEquals(file1a.getSyncInfo(),fileInfo2);
-	
-		file1a.setSyncInfo(fileInfo3);
-		
-		assertEquals(file1.getSyncInfo(),fileInfo3);
-	}
-	
-//	public void testSendReceive() throws Exception {
-//		
-//		String sendTxt;
-//		String expectTxt;
-//		InputStream in;
-//
-//		sendTxt = "This is my text";
-//		expectTxt = sendTxt.length() + "\n" + sendTxt;
-//		
-//		byte[] result = new byte[sendTxt.length()];
-//		
-//		PipedInputStream pIn;
-//		PipedOutputStream pOut;
-//		
-//		pIn = new PipedInputStream();
-//		pOut = new PipedOutputStream(pIn);
-//		
-//		in = new BufferedInputStream(pIn,sendTxt.length());
-//		
-//		pOut.write(sendTxt.getBytes());
-//		file1.receiveFrom(in,sendTxt.length(),false,false, new NullProgressMonitor());
-//		in.close();
-//		pOut.close();
-//		
-//		result = new byte[expectTxt.length()];
-//		pIn = new PipedInputStream();
-//		pOut = new PipedOutputStream(pIn);
-//		
-//		in = new BufferedInputStream(pIn,sendTxt.length());
-//		file1.sendTo(pOut,false, new NullProgressMonitor());
-//		in.read(result);
-//		in.close();
-//		pOut.close();
-//		
-//		assertEquals(new String(result),expectTxt);	
-//	}
-	
-	public void testTimestamp() throws Exception {
-		
-		String timeStamp;
-		
-		ioFile.createNewFile();
-		timeStamp = "Tue Oct 30 14:38:16 2001";
-		
-		file1.setTimeStamp(timeStamp);
-		assertEquals(timeStamp, file1a.getTimeStamp());
-		
-	}
-	
-	public void testIsDirty() throws Exception {
-		
-		String timeStamp;
-		String entryLine;
-		ResourceSyncInfo fileInfo;
-		
-		ioFile.createNewFile();
-		timeStamp = "Tue Oct 30 14:38:16 2001";
-		entryLine = "/file1.txt/1.1/Tue Oct 30 14:38:16 2001/-kb/TmyTag";
-		
-		file1.setTimeStamp(timeStamp);
-		timeStamp = file1.getTimeStamp();
-		
-		fileInfo = new ResourceSyncInfo(entryLine,null,timeStamp);
-		
-		file1.setSyncInfo(fileInfo);
-		
-		assertEquals(false, file1.isDirty());
-		
-		// touch the file
-		writeToFile(ioFile,readFromFile(ioFile));
-		
-		assertEquals(true, file1.isDirty());
-
-		file1.setTimeStamp(timeStamp);
-
-		assertEquals(false, file1.isDirty());	
-	}
-		
-	// ---------------- Here the resource-tests start ---------------
-	
-	public void testExists() throws Exception {
-		
-		file1.delete();
-		assertEquals(false, file1.exists());
-		writeToFile(ioFile,new String[0]);
-		assertEquals(true, file1.exists());
-		
-	}
-	
-	public void testGetName() {
-		assertEquals("file1.txt", file1.getName());	
-	}
-	
-	public void testGetParent() {
-		assertEquals(folder1,file1.getParent());	
-	}
-	
-	public void testGetRelativePath() throws CVSException {
-		assertEquals("file1.txt", file1.getRelativePath(folder1));
-	}
-	
-	public void testIsFolder() {
-		assertEquals(false, file1.isFolder());
-	}		
-
-	public void testIsManaged() throws CVSException {
-		
-		ResourceSyncInfo fileInfo2 = new ResourceSyncInfo("/file1.txt/1.1/27 Sep 2001 18:00:16/-kb/TmyTag",null,null);
-		
-		assertEquals(false, file1.isManaged());
-		file1.setSyncInfo(fileInfo2);
-		assertEquals(true, file1.isManaged());
-		
-	}
-}
-
diff --git a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/cvsresources/LocalFolderTest.java b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/cvsresources/LocalFolderTest.java
deleted file mode 100644
index 1c767ad..0000000
--- a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/cvsresources/LocalFolderTest.java
+++ /dev/null
@@ -1,447 +0,0 @@
-package org.eclipse.team.tests.ccvs.core.cvsresources;
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */
-import java.io.File;
-import java.io.IOException;
-
-import junit.awtui.TestRunner;
-import junit.framework.Test;
-import junit.framework.TestSuite;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.team.ccvs.core.*;
-import org.eclipse.team.ccvs.core.CVSProviderPlugin;
-import org.eclipse.team.ccvs.core.ICVSFolder;
-import org.eclipse.team.ccvs.core.ICVSResource;
-import org.eclipse.team.internal.ccvs.core.CVSException;
-import org.eclipse.team.internal.ccvs.core.resources.ICVSFile;
-import org.eclipse.team.internal.ccvs.core.resources.LocalResource;
-import org.eclipse.team.internal.ccvs.core.syncinfo.FolderSyncInfo;
-import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo;
-import org.eclipse.team.tests.ccvs.core.JUnitTestCase;
-
-public class LocalFolderTest extends JUnitTestCase {
-
-	ICVSFile file1;
-	ICVSFile file1a;
-	ICVSFile file2;
-
-	ICVSFolder folder1;
-	ICVSFolder folder1a;
-	ICVSFolder folder2;
-	
-	String entryLine1;
-	String entryLine2;
-	String entryLineExtra1;
-	String entryLineExtra2;
-	String entryLineExtra3;
-	
-	String root;
-	String repo;
-	String root2;
-	String repo2;
-	
-	ResourceSyncInfo fileInfo1;
-
-	FolderSyncInfo folderInfo1;
-	FolderSyncInfo folderInfo2;
-	
-	File ioFile1;
-	
-	public LocalFolderTest(String arg) {
-		super(arg);
-	}
-	
-	public static void main(String[] args) {
-		TestRunner.run(LocalFolderTest.class);
-	}
-
-	/**
-	 * Leaves this file-structure:
-	 * 
-	 * test (folder1, folder1a)
-	 *   proj1 (folder2, ioFolder2) *** Does not exist ***
-	 *   file1.txt (file1, file1a)
-	 *   file2.txt (file2) *** Does not exist ***
-	 */
-	public void setUp() throws CVSException, IOException {
-				
-		folder1 = getManagedFolder("test");
-		folder1a = getManagedFolder("test");
-		folder2 = folder1.getFolder("proj1");
-		folder1.mkdir();
-		assertTrue(folder1.exists());
-		
-		file1 = folder1.getFile("file1.txt");
-		file1a = folder1.getFile("file1.txt");
-		file2 = folder1.getFile("file2.txt");
-		
-		root = ":server:user:pwd@test:/home";
-		repo = "repository";
-		root2 = ":method:user:pwd@test2:/home/myFolder/repo";
-		repo2 = "proj1/subdir";
-		
-		folderInfo1 = new FolderSyncInfo(repo,root,null,false);
-		folderInfo2 = new FolderSyncInfo(repo2,root2,null,true);
-		
-		entryLine1 = "/.vcm_meta/1.1/27 Sep 2001 18:00:16/-kb/TmyTag";
-		entryLine2 = "/file3.txt/1.1/27 Sep 2001 18:00:16/-kb/TmyTag";
-		entryLineExtra1 = "/file1.txt/1.1/27 Sep 2001 18:00:16/-kb/TmyTag";
-		entryLineExtra2 = "/file1.txt/1.2/27 Sep 2001 18:00:16/-kb/TmyTag";
-		entryLineExtra3 = "/file2.txt/1.2/27 Sep 2001 18:00:16/-kb/TmyTag";
-		
-		folder1.setFolderSyncInfo(folderInfo1);
-		
-		fileInfo1 = new ResourceSyncInfo(entryLineExtra1,null,null);
-		file1.setSyncInfo(fileInfo1);
-		
-		ioFile1 = getFile("test/file1.txt");
-		ioFile1.createNewFile();
-		
-	}
-	
-	public void tearDown() throws CVSException {
-		folder1.delete();
-		CVSProviderPlugin.getSynchronizer().reload(((LocalResource)folder1).getLocalFile(), new NullProgressMonitor());
-		assertSynchronizerEmpty();
-		assertTrue(!folder1.exists());
-	}
-
-	public static Test suite() {		
-		TestSuite suite = new TestSuite(LocalFolderTest.class);
-    	return suite; 	
-	}
-	
-	public void testGetFolders() throws CVSException {
-		
-		// tests setFolderSyncInfo and getFolderSyncInfo as well
-		
-		boolean fail = false;
-		ICVSFolder folder3;
-		ICVSFolder tmpFolder;
-		ICVSFolder[] resultFolders;
-		
-		folder3 = folder1.getFolder("folder3");
-		folder3.mkdir();
-		
-		resultFolders = folder2.getFolders();
-		assertEquals(0, resultFolders.length);
-		
-		// For the moment we assume, that seting a folderInfo
-		// does not create the folder automatically but you
-		// have to create it with mkdir.
-		try {
-			folder2.setFolderSyncInfo(folderInfo1);
-			fail();
-		} catch (Exception e) {			
-		}		
-				
-		resultFolders = folder1.getFolders();
-		assertEquals(1, resultFolders.length);
-		
-		folder2.mkdir();
-		
-		resultFolders = folder1.getFolders();
-		assertEquals(2, resultFolders.length);
-		
-		folder2.delete();
-
-		resultFolders = folder1.getFolders();
-		assertEquals(1, resultFolders.length);
-		
-		folder2.mkdir();
-		folder2.setFolderSyncInfo(folderInfo1);	
-		
-		resultFolders = folder1.getFolders();
-		assertEquals(2, resultFolders.length);
-		
-		folder2.delete();
-		
-		resultFolders = folder1.getFolders();
-		assertEquals(2, resultFolders.length);
-		
-		tmpFolder = folder1.getFolder("proj1");
-		assertEquals(false,tmpFolder.exists());
-		assertEquals(true,tmpFolder.isManaged());				
-	}
-	
-	public void testGetFiles() throws Exception {
-		// tests setFolderSyncInfo and getFolderSyncInfo as well
-		
-		boolean fail = false;
-		ICVSFile[] resultFiles;
-		ICVSFile file3;
-		File ioFile3;
-		ResourceSyncInfo fileInfo2;
-		
-		file3 = folder1.getFile("file3.txt");
-		ioFile3 = getFile("test/file3.txt");
-		
-		// From here we check if the filelist does include files,
-		// that are added locally but not as entries (and exclude them
-		// again when we delete them)
-		resultFiles = folder1.getFiles();
-		assertEquals(1, resultFiles.length);
-		
-		ioFile3.createNewFile();
-		
-		resultFiles = folder1.getFiles();
-		assertEquals(2, resultFiles.length);
-		
-		ioFile3.delete();
-
-		resultFiles = folder1.getFiles();
-		assertEquals(1, resultFiles.length);
-		
-		// Here is tested if we get files that do not exist locally but 
-		// in the entries
-		
-		// first we try a fileinfo with the wrong name
-		try {
-			file3.setSyncInfo(fileInfo1);
-		} catch (Throwable e) {fail = true;}		
-		assertTrue(fail);
-		fail = false;
-		
-		fileInfo2 = new ResourceSyncInfo(entryLine2,null,null);
-		
-		file3.setSyncInfo(fileInfo2);
-
-		resultFiles = folder1.getFiles();
-		assertEquals(2, resultFiles.length);
-		assertEquals(false,file3.exists());
-		assertEquals(true,file3.isManaged());
-		
-		file3.unmanage();
-		
-		resultFiles = folder1.getFiles();
-		assertEquals(1, resultFiles.length);
-		assertEquals(false,file3.exists());
-		assertEquals(false,file3.isManaged());
-	}
-	
-	public void testGetChild() throws CVSException {
-
-		try {
-			folder1.getChild("proj1");
-			assertTrue(false);
-		} catch (CVSException e) {}		
-		
-		try {
-			folder1.getChild("file2.txt");
-			assertTrue(false);
-		} catch (CVSException e) {}		
-		
-		folder2.mkdir();
-		
-		assertEquals(true, folder1.getChild("proj1").isFolder());
-		assertEquals("proj1", folder1.getChild("proj1").getName());
-		assertEquals(false, folder1.getChild("file1.txt").isFolder());
-		
-	}
-	
-	// ---------------- Here the resource-tests start ---------------
-	
-	public void testExists() throws Exception {
-		assertEquals(false, folder2.exists());
-		folder2.mkdir();
-		assertEquals(true, folder2.exists());
-		folder2.delete();
-		assertEquals(false, folder2.exists());
-	}
-	
-	public void testGetName() throws CVSException {
-		assertEquals("proj1", folder2.getName());	
-		folder2.mkdir();
-		assertEquals("proj1", folder2.getName());	
-	}
-	
-	public void testGetParent() {
-		assertEquals(folder1,folder2.getParent());
-	}
-
-	public void testGetRelativePath() throws CVSException {
-		ICVSFolder subFolder1;
-		ICVSFolder subFolder2;
-		ICVSFolder subFolder3;
-		String sep =  "/";
-		
-		boolean fail = false;
-		
-		subFolder1 = folder1.getFolder("proj1");
-		subFolder2 = subFolder1.getFolder("proj2");
-		subFolder3 = subFolder2.getFolder("proj3");
-
-		assertEquals("proj1", folder2.getRelativePath(folder1));		
-		assertEquals("testGetRelativeLocation.1","proj1", subFolder1.getRelativePath(folder1));
-		assertEquals("testGetRelativeLocation.2","proj1" + sep + "proj2" + sep + "proj3", subFolder3.getRelativePath(folder1));
-		assertEquals("testGetRelativeLocation.3","proj2", subFolder2.getRelativePath(subFolder1));
-		assertEquals("testGetRelativeLocation.3a","", subFolder2.getRelativePath(subFolder2));
-		
-		try {
-			subFolder1.getRelativePath(subFolder2);
-		} catch (CVSException e) {fail = true;}
-		assertTrue("testGetRelativeLocation.4",fail);	
-		fail = false;		
-		
-		subFolder1.delete();
-	}
-
-	public void testIsFolder() {
-		assertEquals(true, folder2.isFolder());
-	}		
-
-	public void testFolderIsManaged() throws CVSException {
-		ICVSFolder folder = getManagedFolder("testIsManaged");
-		folder.mkdir();
-		assertEquals(null, folder.getFolderSyncInfo());
-		
-		FolderSyncInfo info = new FolderSyncInfo("module", ":pserver:user@host:/home", null, false);
-		folder.setFolderSyncInfo(info);
-		assertTrue(folder.isCVSFolder() && !folder.isManaged());
-		assertTrue(folder.getFolderSyncInfo().equals(info));		
-		
-		folder.delete();
-		reload(folder);
-	}
-	
-	public void testFolderInfo() throws CVSException {
-		FolderSyncInfo folderInfo2;
-		FolderSyncInfo folderInfo3;
-		String repo;
-		String root;
-		
-		repo = "proj1/folder1";
-		root = ":pserver:nkram:pwd@fiji:/home/nkrambro/repo";
-		
-		assertEquals(null, folder2.getFolderSyncInfo());
-		assertEquals(false,folder2.isCVSFolder());
-		
-		folder1.setFolderSyncInfo(folderInfo1);
-		folderInfo2 = folder1.getFolderSyncInfo();
-		
-		assertEquals(true,folder1.isCVSFolder());	
-		assertEquals(this.root,folderInfo2.getRoot());
-		assertEquals(this.repo,folderInfo2.getRepository());
-		
-		folder1.unmanage();
-		
-		assertEquals(false,folder1.isCVSFolder());	
-		assertEquals(null,folder1.getFolderSyncInfo());	
-		
-		folderInfo3 = new FolderSyncInfo(repo,root,folderInfo2.getTag(),false);
-
-		folder1.setFolderSyncInfo(folderInfo3);
-		
-		assertEquals(root,folder1.getFolderSyncInfo().getRoot());
-		assertEquals(repo,folder1.getFolderSyncInfo().getRepository());
-		assertEquals("/home/repository",folderInfo2.getRemoteLocation());
-	}
-	
-	public void testsetSyncInfo() throws CVSException {
-		String entry1 = "/file1.txt/a/b/c/";
-		String entry2 = "/file1.txt/b/b/c/";
-		String entry3 = "/file2.txt/b/b/c/";
-		
-		ResourceSyncInfo info1 = new ResourceSyncInfo(entry1,null,null);
-		ResourceSyncInfo info2 = new ResourceSyncInfo(entry2,null,null);
-		ResourceSyncInfo info3 = new ResourceSyncInfo(entry3,null,null);
-
-		ICVSFile file1 = this.file1;
-		ICVSFile file2 = folder1.getFile("file2.txt");
-		
-		assertEquals(1,folder1.getFiles().length);
-		file1.setSyncInfo(info1);
-		assertEquals(1,folder1.getFiles().length);
-		file1.setSyncInfo(info2);
-		assertEquals(1,folder1.getFiles().length);
-		file2.setSyncInfo(info3);
-		assertEquals(2,folder1.getFiles().length);
-		
-		assertEquals(entry2,file1.getSyncInfo().getEntryLine(true));
-		assertEquals(entry3,file2.getSyncInfo().getEntryLine(true));
-		
-		// The two files in the getFiles are acctually the files
-		// we put in there
-		assertTrue( ( folder1.getFiles()[0].equals(file1) ||
-			      folder1.getFiles()[0].equals(file2)) &&
-			    ( folder1.getFiles()[1].equals(file1) ||
-			      folder1.getFiles()[1].equals(file2)));
-	}
-	
-	public void testSimpleGetFiles() throws CVSException {
-		// When a file is added to the entries it should be in the list
-		// of files afterwards ... this should be one of the current problems
-		file2.setSyncInfo(new ResourceSyncInfo(entryLineExtra3,null,null));
-		assertEquals(2,folder1.getFiles().length);
-		file2.unmanage();
-		assertEquals(1,folder1.getFiles().length);
-	}
-	
-	public void testSimpleResourceSyncInfo() throws Exception {
-		
-		assertEquals(file1a.getSyncInfo(), fileInfo1);
-		
-		file1a.setSyncInfo(new ResourceSyncInfo(entryLineExtra2,null,null));
-		
-		assertEquals(file1.getSyncInfo().getEntryLine(true),entryLineExtra2);
-		
-		file1a.setSyncInfo(new ResourceSyncInfo(entryLineExtra1,null,null));
-		
-		assertEquals(file1.getSyncInfo().getEntryLine(true),entryLineExtra1);
-		
-		file1a.setSyncInfo(new ResourceSyncInfo(entryLineExtra2,null,null));
-		
-		assertEquals(file1.getSyncInfo().getEntryLine(true),entryLineExtra2);	
-	}
-	
-	public void testSimpleFolderSyncInfo() throws Exception {
-		folder1.setFolderSyncInfo(folderInfo2);
-		assertEquals(folder1.getFolderSyncInfo().getRepository(),repo2);		
-		assertEquals(folder1.getFolderSyncInfo().getRoot(),root2);		
-		assertEquals(folder1.getFolderSyncInfo().getIsStatic(),true);
-
-		reload(folder1);
-		assertEquals(folder1.getFolderSyncInfo().getRepository(),repo2);		
-		assertEquals(folder1.getFolderSyncInfo().getRoot(),root2);		
-		assertEquals(folder1.getFolderSyncInfo().getIsStatic(),true);	
-
-		folder1.setFolderSyncInfo(folderInfo1);
-		assertEquals(folder1a.getFolderSyncInfo().getRepository(),repo);		
-		assertEquals(folder1a.getFolderSyncInfo().getRoot(),root);	
-		assertEquals(folder1a.getFolderSyncInfo().getIsStatic(),false);		
-	}
-	
-	public void testSyncIsCvsFolder() throws Exception {
-		
-		folder1.delete();
-		reload(folder1);
-		assertEquals(false,folder1.isCVSFolder());
-		
-		folder1.mkdir();
-		assertEquals(false,folder1.isCVSFolder());
-		
-		folder1.setFolderSyncInfo(folderInfo1);
-		assertEquals(true,folder1.isCVSFolder());
-		assertEquals(false,folder1.isManaged());
-		
-		assertEquals(false,folder2.isCVSFolder());
-
-		folder2.mkdir();
-		assertEquals(false,folder2.isCVSFolder());
-		assertEquals(false,folder2.isManaged());
-
-		folder2.setFolderSyncInfo(folderInfo2);
-		assertEquals(true,folder2.isCVSFolder());
-		assertEquals(true,folder2.isManaged());
-	}
-	
-	protected void reload(ICVSResource resource) throws CVSException {
-		CVSProviderPlugin.getSynchronizer().reload(((LocalResource)resource).getLocalFile(), new NullProgressMonitor());
-	}
-	
-	protected void save(ICVSResource resource) throws CVSException {
-		CVSProviderPlugin.getSynchronizer().save(((LocalResource)resource).getLocalFile(), new NullProgressMonitor());
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/cvsresources/SynchronizerTest.java b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/cvsresources/SynchronizerTest.java
deleted file mode 100644
index d71bc8e..0000000
--- a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/cvsresources/SynchronizerTest.java
+++ /dev/null
@@ -1,254 +0,0 @@
-package org.eclipse.team.tests.ccvs.core.cvsresources;
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.team.ccvs.core.*;
-import org.eclipse.team.ccvs.core.CVSProviderPlugin;
-import org.eclipse.team.ccvs.core.CVSTag;
-import org.eclipse.team.ccvs.core.ICVSFolder;
-import org.eclipse.team.ccvs.core.ICVSResource;
-import org.eclipse.team.core.TeamException;
-import org.eclipse.team.internal.ccvs.core.CVSException;
-import org.eclipse.team.internal.ccvs.core.resources.ICVSFile;
-import org.eclipse.team.internal.ccvs.core.resources.LocalFile;
-import org.eclipse.team.internal.ccvs.core.resources.LocalFolder;
-import org.eclipse.team.internal.ccvs.core.resources.LocalResource;
-import org.eclipse.team.internal.ccvs.core.syncinfo.FolderSyncInfo;
-import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo;
-import org.eclipse.team.internal.ccvs.core.util.SyncFileUtil;
-import org.eclipse.team.tests.ccvs.core.CVSTestSetup;
-import org.eclipse.team.tests.ccvs.core.EclipseTest;
-
-public class SynchronizerTest extends EclipseTest {
-
-	public SynchronizerTest() {
-		super();
-	}
-	
-	public SynchronizerTest(String name) {
-		super(name);
-	}
-	
-	public static Test suite() {
-		TestSuite suite = new TestSuite(SynchronizerTest.class);
-		return new CVSTestSetup(suite);
-	}
-	
-	protected File getSyncFile(File parent, String syncFileName) {
-		return new File(SyncFileUtil.getCVSSubdirectory(parent), syncFileName);
-	}
-	
-	protected void appendLineToFile(File file, String line) throws IOException {
-
-		BufferedReader fileReader;
-		List fileContentStore = new ArrayList();
-		
-		if (!file.exists()) {
-			return;
-		}
-		
-		String l;
-		fileReader = new BufferedReader(new FileReader(file));
-		while ((l = fileReader.readLine()) != null) {
-			fileContentStore.add(l);
-		}
-		fileReader.close();			
-
-		String[] content = (String[]) fileContentStore.toArray(new String[fileContentStore.size()]);
-		String[] newContent;
-		
-		newContent = new String[content.length + 1];
-		System.arraycopy(content,0,newContent,0,content.length);
-		newContent[content.length] = line;
-		
-		file.delete();
-				
-		BufferedWriter fileWriter;
-		
-		fileWriter = new BufferedWriter(new FileWriter(file));
-		for (int i = 0; i<newContent.length; i++) {
-			fileWriter.write(newContent[i]);
-			fileWriter.newLine();
-		}
-		fileWriter.close();
-	}
-	
-	public void testFolderSync() throws CoreException, CVSException  {
-		IProject project = getUniqueTestProject("testFolderSync");
-		IResource[] resources = buildResources(project, new String[] {"a.txt", "folder1/", "folder1/b.txt", "folder2/", "folder2/c.txt"}, true);
-		ensureExistsInFileSystem(resources);
-		IFolder folder1 = project.getFolder("folder1");
-		IFolder folder2 = project.getFolder("folder2");
-		File folder1File = folder1.getLocation().toFile();
-		File folder2File = folder2.getLocation().toFile();
-		File projectFile = project.getLocation().toFile();
-		ICVSResource cvsProject = new LocalFolder(projectFile);
-		
-		// 1.
-				
-		try {
-			CVSProviderPlugin.getSynchronizer().setFolderSync(new File("dummy"), new FolderSyncInfo("repo", "root", null, false));
-			fail();
-		} catch(Exception e) {
-		}
-		
-		// 2. 
-		
-		FolderSyncInfo info = new FolderSyncInfo("repo", "root", null, false);
-		CVSProviderPlugin.getSynchronizer().setFolderSync(projectFile, info);
-		assertTrue(CVSProviderPlugin.getSynchronizer().getFolderSync(projectFile).equals(info));
-		assertTrue(CVSProviderPlugin.getSynchronizer().members(projectFile).length == 0);
-		
-		// 3.
-		
-		info = new FolderSyncInfo("repo", "root", new CVSTag("v1", CVSTag.BRANCH), true);
-		CVSProviderPlugin.getSynchronizer().setFolderSync(folder1File, info);
-		assertTrue(CVSProviderPlugin.getSynchronizer().getFolderSync(folder1File).equals(info));
-		assertTrue(CVSProviderPlugin.getSynchronizer().members(projectFile).length == 1);
-						
-		// 4. 
-		
-		CVSProviderPlugin.getSynchronizer().setFolderSync(folder2File, info);
-		assertTrue(CVSProviderPlugin.getSynchronizer().getFolderSync(folder2File).equals(info));
-		assertTrue(CVSProviderPlugin.getSynchronizer().members(projectFile).length == 2);
-	}
-
-	public void testDeleteListener() throws CoreException, CVSException, TeamException {
-		IProject project = createProject("testDeleteListener", new String[] {"a.txt", "folder1/", "folder1/b.txt"});
-		IFolder folder1 = project.getFolder("folder1");
-		IFile file1 = folder1.getFile("b.txt");
-		ICVSFolder cvsFolder = new LocalFolder(folder1.getLocation().toFile());
-		ICVSFolder cvsProject = new LocalFolder(project.getLocation().toFile());
-		ICVSFile cvsfile  = new LocalFile(file1.getLocation().toFile());
-		
-		// 1. delete of a folder deletes sync info deep
-		
-		FolderSyncInfo info = cvsFolder.getFolderSyncInfo();
-		assertTrue(info!=null);
-		
-		folder1.delete(true, new NullProgressMonitor());
-		
-		assertTrue(cvsFolder.getFolderSyncInfo()==null);
-		assertTrue(cvsfile.getSyncInfo()==null);				
-		
-		// 2. rename of a project deletes cached sync info of source project
-		
-		project.move(new Path("movedProject"), true, new NullProgressMonitor());
-		
-		assertTrue(cvsProject.getFolderSyncInfo()==null);
-	}
-	
-	public void testResourceSync() throws CVSException, CoreException, TeamException {
-		IProject project = createProject("testResourceSync", new String[] {"a.txt", "folder1/", "folder1/b.txt"});
-		IFolder folder1 = project.getFolder("folder1");
-		IFile file1 = project.getFile("a.txt");
-		IFile newFile = folder1.getFile("c.txt");
-		IFolder newFolder = project.getFolder("folder2");
-		ICVSFolder cvsFolder = new LocalFolder(folder1.getLocation().toFile());
-		ICVSFolder cvsNewFolder = new LocalFolder(newFolder.getLocation().toFile());
-		ICVSFile cvsFile = new LocalFile(file1.getLocation().toFile());
-		ICVSFile cvsNewFile = new LocalFile(newFile.getLocation().toFile());
-		ICVSFolder cvsProject = new LocalFolder(project.getLocation().toFile());
-		
-		// 1.
-		
-		assertTrue(!cvsProject.isManaged());
-		assertTrue(cvsProject.isCVSFolder());
-		assertTrue(cvsFile.getSyncInfo()!=null);
-		assertTrue(cvsFolder.getSyncInfo()!=null);		
-		
-		assertTrue(cvsNewFile.getSyncInfo()==null);
-		assertTrue(cvsNewFolder.getSyncInfo()==null);
-				
-		// 2.
-		
-		ResourceSyncInfo folderInfo = new ResourceSyncInfo(cvsNewFolder.getName());
-		ResourceSyncInfo fileInfo = new ResourceSyncInfo(cvsNewFile.getName(), "1.1", "timestamp", "-kb", null, null);
-		
-		cvsNewFile.setSyncInfo(fileInfo);
-		cvsNewFolder.setSyncInfo(folderInfo);
-		
-		assertTrue(cvsNewFile.getSyncInfo().equals(fileInfo));
-		assertTrue(cvsNewFolder.getSyncInfo().equals(folderInfo));
-		
-		save(cvsProject);
-		
-		assertTrue(cvsNewFile.getSyncInfo().equals(fileInfo));
-		assertTrue(cvsNewFolder.getSyncInfo().equals(folderInfo));
-	}	
-	
-	public void testReload() throws CVSException, CoreException, TeamException, IOException {
-		IProject project = createProject("testReload", new String[] {"a.txt", "folder1/", "folder1/b.txt", "folder2/", "folder2/folder2a/", "folder2/folder2a/b.txt", "folder3/b.txt"});
-		
-		File projectFile = project.getLocation().toFile();
-		IFile newFile = project.getFile("b.txt");
-		newFile.create(getRandomContents(), true, null);
-		IFolder folder1 = project.getFolder("folder1");
-		IFolder newFolder = project.getFolder("newFolder");
-		newFolder.create(true, true, null);
-		ICVSFolder cvsProject = new LocalFolder(project.getLocation().toFile());
-		ICVSFile cvsNewFile = new LocalFile(newFile.getLocation().toFile());
-		ICVSFolder cvsNewFolder = new LocalFolder(newFolder.getLocation().toFile());
-		ICVSFolder cvsFolder = new LocalFolder(folder1.getLocation().toFile());
-
-		// 1. update entry from outside of synchronizer then reload
-		assertTrue(cvsNewFile.getSyncInfo()==null);
-		assertTrue(cvsNewFolder.getSyncInfo()==null);
-		assertTrue(cvsFolder.getFolderSyncInfo()!=null);
-		
-		ResourceSyncInfo fileInfo = new ResourceSyncInfo("/b.txt/1.1/Thu Aug 30 15:31:40 2001/-kb/", null, null);
-		ResourceSyncInfo folderInfo = new ResourceSyncInfo("newFolder");
-
-		folder1.delete(true, true, null);
-
-		appendLineToFile(getSyncFile(project.getLocation().toFile(), SyncFileUtil.ENTRIES), fileInfo.getEntryLine(true));
-		appendLineToFile(getSyncFile(project.getLocation().toFile(), SyncFileUtil.ENTRIES), folderInfo.getEntryLine(true));
-		
-		reload(cvsProject);
-		
-		assertTrue(cvsNewFile.getSyncInfo().equals(fileInfo));
-		assertTrue(cvsNewFolder.getSyncInfo().equals(folderInfo));		
-		assertTrue(cvsFolder.getFolderSyncInfo()==null);		
-		assertTrue(new LocalFile(new File(folder1.getLocation().toFile(), "b.txt")).getSyncInfo()==null);
-		
-		// 2. delete multiple directory hierarchy and reload should delete everything from cache
-		IFolder folder2 = project.getFolder("folder2");
-		IFolder folder2a = folder2.getFolder("folder2a");
-		ICVSFolder folder2aFile = new LocalFolder(folder2a.getLocation().toFile());
-		ICVSFolder folder2File = new LocalFolder(folder2.getLocation().toFile());
-		
-		folder2File.unmanage();
-		assertTrue(folder2File.exists());
-		assertTrue(folder2File.getSyncInfo()==null);
-		assertTrue(folder2aFile.getSyncInfo()==null);
-		assertTrue(folder2File.getFolderSyncInfo()==null);
-		assertTrue(folder2File.getFolderSyncInfo()==null);
-	}
-	
-	protected void reload(ICVSResource resource) throws CVSException {
-		CVSProviderPlugin.getSynchronizer().reload(((LocalResource)resource).getLocalFile(), new NullProgressMonitor());
-	}
-	
-	protected void save(ICVSResource resource) throws CVSException {
-		CVSProviderPlugin.getSynchronizer().save(((LocalResource)resource).getLocalFile(), new NullProgressMonitor());
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/provider/CommandsTest.java b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/provider/CommandsTest.java
deleted file mode 100644
index 7dc6e1a..0000000
--- a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/provider/CommandsTest.java
+++ /dev/null
@@ -1,515 +0,0 @@
-package org.eclipse.team.tests.ccvs.core.provider;
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */
-import java.io.File;
-import java.util.Calendar;
-import java.util.GregorianCalendar;
-
-import junit.framework.AssertionFailedError;
-import junit.framework.Test;
-import junit.framework.TestSuite;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.team.ccvs.core.*;
-import org.eclipse.team.ccvs.core.CVSProviderPlugin;
-import org.eclipse.team.ccvs.core.ICVSFolder;
-import org.eclipse.team.internal.ccvs.core.CVSException;
-import org.eclipse.team.internal.ccvs.core.client.Session;
-import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot;
-import org.eclipse.team.internal.ccvs.core.util.FileUtil;
-import org.eclipse.team.tests.ccvs.core.CVSTestSetup;
-import org.eclipse.team.tests.ccvs.core.JUnitTestCase;
-
-/**
- * This class tests the basic functionality of the Eclipse CVS client
- * and can be used to test basic sanity.
- * 
- * It does not run against another cvs client.
- */
-public class CommandsTest extends JUnitTestCase {
-
-
-	static final String PLATFORM_NEWLINE = System.getProperty("line.separator");
-		
-	private File ioFolder1;
-	private File ioFolder2;
-	private File ioFolder3;
-	private File ioFolder4;
-	
-	private String[] arguments;
-	
-	private boolean isSetUp = false;
-	
-	public static void main(String[] args) {	
-		run(CommandsTest.class);
-	}
-	
-	public void setUp() throws Exception {
-		if (!isSetUp) {
-			try {
-				magicSetUpRepo("proj1", new String[] { "folder1/c.txt", "folder1/d.txt", "folder2/test.flag"});
-			} catch (Exception e) {
-				System.err.println("Could not setup repository");
-			}
-			isSetUp = true;
-		}
-		ioFolder1 = getFile("test1");
-		ioFolder2 = getFile("test2");
-		ioFolder3 = getFile("test2/proj1");
-		ioFolder4 = getFile("test2/proj1/folder1");
-		
-		FileUtil.deepDelete(ioFolder1);
-		FileUtil.deepDelete(ioFolder2);
-		ioFolder1.mkdir();
-		ioFolder2.mkdir();
-		
-	}
-	
-	public void tearDown() throws CVSException {
-		FileUtil.deepDelete(ioFolder1);
-		FileUtil.deepDelete(ioFolder2);
-	}
-	
-	public CommandsTest() {
-		super("CommandsTest");
-		arguments = new String[]{"proj1"};
-	}
-	
-	public CommandsTest(String name) {
-		super(name);
-		arguments = new String[]{"proj1"};
-	}
-	
-	public static Test suite() {
-		TestSuite suite = new TestSuite(CommandsTest.class);
-		return new CVSTestSetup(suite);
-	}
-	
-	/**
-	 * This should somehow create the following file-structure:
-	 * 
-	 * temp
-	 *   test1
-	 *     proj1
-	 *       CVS
-	 *       folder1
-	 *         CVS
-	 *         c.txt
-	 *         d.txt
-	 *       folder2
-	 *         CVS
-	 *         test.flag
-	 *   test2
-	 *     proj1
-	 *       CVS
-	 *       folder1
-	 *         CVS
-	 *         c.txt
-	 *         d.txt
-	 *       folder2
-	 *         CVS
-	 *         test.flag
-	 * 
-	 * where the cvs-folder contains the appropiate files including
-	 * the appropiated Entries-files
-	 */
-	public void subTestCeckout() throws CVSException {
-
-		execute("co",globalOptions, 
-							EMPTY_ARGS, 
-							arguments, 
-							ioFolder1, 
-							monitor,
-							System.err);
-
-		execute("co",globalOptions, 
-							EMPTY_ARGS, 
-							arguments, 
-							ioFolder2, 
-							monitor,
-							System.err);
-	}
-	
-	public void testCommitFiles() throws Exception {
-		subTestCeckout();
-		subTestCommitUpdate();
-	}
-	
-	/**
-	 * Made for checking the ability of the client to cope with 
-	 * multible folders and files as arguments
-	 */
-	public void testDoubleRound() throws Exception {
-		
-		File folder1;
-		File folder2;
-		
-		File file1a;
-		File file2a;
-		File file3a;
-		File file4a;
-
-		File file1b;
-		File file2b;
-		File file3b;
-		File file4b;
-
-		folder1 = ioFolder1;
-		folder2 = ioFolder2;
-		
-		file1a = new File(folder1,"coProject1/a.txt");
-		file2a = new File(folder1,"coProject2/a.txt");
-		file3a = new File(folder2,"coProject1/a.txt");
-		file4a = new File(folder2,"coProject2/a.txt");
-
-		file1b = new File(folder1,"coProject1/f1/b.txt");
-		file2b = new File(folder1,"coProject2/f1/b.txt");
-		file3b = new File(folder2,"coProject1/f1/b.txt");
-		file4b = new File(folder2,"coProject2/f1/b.txt");
-		
-		
-		// Do the setup ...
-		magicSetUpRepo("coProject1",new String[]{"a.txt","f1/b.txt","f1/c.txt","f2/d.txt"});
-		magicSetUpRepo("coProject2",new String[]{"a.txt","f1/b.txt","f1/c.txt","f2/d.txt"});
-		
-		execute("co",
-							globalOptions,
-							EMPTY_ARGS,
-							new String[]{"coProject1","coProject2"},
-							folder1,
-							monitor,
-							System.err);
-		
-		execute("co",
-							globalOptions,
-							EMPTY_ARGS,
-							new String[]{"coProject1","coProject2"},
-							folder2,
-							monitor,
-							System.err);
-		
-		// Change the two projects
-		appendToFile(file1a,"AppendIt The first");
-		appendToFile(file2a,"AppendIt The second");
-		
-		appendToFile(file1b,"AppendIt The first");
-		appendToFile(file2b,"AppendIt The second");
-		
-		// Send the two projects to the server
-		execute("ci",
-							globalOptions,
-							new String[]{"-m","msg" + PLATFORM_NEWLINE + "second Line"},
-							new String[]{"coProject1","coProject2"},
-							folder1,
-							monitor,
-							System.err);
-		
-		execute("update",
-							globalOptions,
-							EMPTY_ARGS,
-							new String[]{"coProject1","coProject2"},
-							folder2,
-							monitor,
-							System.err);
-		
-		// Look if all the changes have been done allright
-		assertEqualsArrays(readFromFile(file1a),readFromFile(file3a));
-		assertEqualsArrays(readFromFile(file2a),readFromFile(file4a));
-		
-		assertEqualsArrays(readFromFile(file1b),readFromFile(file3b));
-		assertEqualsArrays(readFromFile(file2b),readFromFile(file4b));
-		
-		
-		// Now check if the programm works with single files
-		appendToFile(file1a,"AppendIt The EXTRA");
-		appendToFile(file1b,"AppendIt The EXTRA");
-		execute("ci",
-							globalOptions,
-							new String[]{"-m","msg"},
-							new String[]{"coProject1/a.txt"},
-							folder1,
-							monitor,
-							System.err);
-		
-		execute("update",
-							globalOptions,
-							EMPTY_ARGS,
-							new String[]{"coProject1/a.txt"},
-							folder2,
-							monitor,
-							System.err);
-		
-		// It should have the 1a file updated but not the 1b file
-		// because we did not upload and commit it
-		assertEqualsArrays(readFromFile(file1a),readFromFile(file3a));
-		try {
-			assertEqualsArrays(readFromFile(file1b),readFromFile(file3b));
-			throw new IllegalArgumentException("Fail-Statment");
-		} catch (AssertionFailedError e) {}
-	}
-	
-	/**
-	 * This TestCase should maybe become simpler.
-	 * 
-	 * Anyway, it is about Up and downloading changes
-	 * without conflicts
-	 */
-	public void subTestCommitUpdate() throws Exception {
-		
-		File file1;
-		File file2;
-		String[] fileContent1;
-		// String[] fileContent2;
-		boolean fail = false;
-		GregorianCalendar calender;
-		
-		calender = new GregorianCalendar();
-		
-		fileContent1 = new String[]{"This is a ", "two-liner", calender.get(Calendar.MILLISECOND) + ""};
-		// fileContent2 = new String[]{"This is a one-liner", calender.get(Calendar.MILLISECOND) + 10 + ""};
-		
-		file1 = getFile("test1/proj1/folder1/c.txt");
-		file2 = getFile("test2/proj1/folder1/c.txt");
-				
-		// change something and commit the canges
-		// in client1
-		// writeToFile("test1/...", contents)
-		writeToFile(file1,fileContent1);
-		
-		execute("ci",globalOptions, 
-							new String[]{"-m","TestMessage"}, 
-							arguments, 
-							ioFolder1, 
-							monitor,
-							System.err);
-		
-		// test that files in client1 and client2 are unequal before
-		try {
-			assertEqualsArrays(readFromFile(file1),readFromFile(file2));
-		} catch (Throwable e) {
-			fail = true;
-		}
-		
-		assertTrue("subTestCommitUpdate.0a (This could happen by coincedence, try again) ",fail);
-		fail = false;
-
-		execute("update",globalOptions, 
-							EMPTY_ARGS, 
-							arguments, 
-							ioFolder2, 
-							monitor,
-							System.err);
-			
-		assertEqualsArrays(fileContent1,readFromFile(file2));
-				
-	}
-
-	public void testDifferentFolders() throws Exception {
-		
-		File file1;
-		File file2;
-		String[] fileContent1;
-		String[] fileContent2;
-		boolean fail = false;
-		GregorianCalendar calender;
-		
-		calender = new GregorianCalendar();
-		
-		// Init the field
-		subTestCeckout();
-
-		file1 = getFile("test1/proj1/folder1/c.txt");		
-		file2 = getFile("test2/proj1/folder1/c.txt");
-		fileContent1 = new String[]{"This is a ", "two-liner", calender.get(Calendar.MILLISECOND) + ""};
-		fileContent2 = new String[]{"This is a one-liner", calender.get(Calendar.MILLISECOND) + 10 + ""};
-		
-		// First run
-		writeToFile(file1,fileContent1);
-		
-
-		execute("ci",globalOptions, 
-							new String[]{"-m","TestMessage"}, 
-							arguments, 
-							ioFolder1, 
-							monitor,
-							System.err);
-
-		try {
-			assertEqualsArrays(readFromFile(file1),readFromFile(file2));
-		} catch (Throwable e) {
-			fail = true;
-		}
-		
-		assertTrue("testDifferentFolders.1 (This could happen by coincedence, try again) ",fail);
-		fail = false;
-		
-		// Should be able to set globalOptions to new String[0]
-		execute("update",new String[0], 
-							EMPTY_ARGS, 
-							new String[0], 
-							ioFolder4, 
-							monitor,
-							System.err);
-		
-		assertEqualsArrays(fileContent1,readFromFile(file2));
-
-		// Seconde run
-		// 
-		// wait a second to get a new timestamp and
-		// check that the resource has acctually a new timestamp
-		waitMsec(4000);
-		writeToFile(file2,fileContent2);
-		assertEquals(true, CVSWorkspaceRoot.getCVSFolderFor(ioFolder4).getFile("c.txt").isModified());
-		
-		// Should be able to set globalOptions to new String[0]
-		execute("ci",new String[0], 
-							new String[]{"-m","TestMessage"}, 
-							new String[0], 
-							ioFolder4, 
-							monitor,
-							System.err);
-
-		try {
-			assertEqualsArrays(readFromFile(file1),readFromFile(file2));
-		} catch (Throwable e) {
-			fail = true;
-		}
-		
-		assertTrue("testDifferentFolders.3 (This could happen by coincedence, try again) ",fail);
-		fail = false;
-
-		execute("update",globalOptions, 
-							EMPTY_ARGS, 
-							arguments, 
-							ioFolder1, 
-							monitor,
-							System.err);
-		
-		assertEqualsArrays(fileContent2,readFromFile(file1));
-
-	}
-	
-	public void testCommit() throws Exception {
-		
-		File ioFolder = ioFolder1;
-
-		execute("co",globalOptions, 
-							EMPTY_ARGS, 
-							arguments, 
-							ioFolder, 
-							monitor,
-							System.err);
-							
-		GregorianCalendar calender;
-		
-		
-		calender = new GregorianCalendar();
-				
-		writeToFile(getFile("test1\\proj1\\folder1\\c.txt"), new String[]{"This is my","Test",calender.get(Calendar.MILLISECOND) +""});
-		
-		execute("ci",globalOptions, 
-							new String[]{"-m","TestMessage"}, 
-							arguments, 
-							ioFolder, 
-							monitor,
-							System.err);
-	}
-	
-	public void testConnection() throws CVSException {
-
-		File ioFolder = ioFolder1;
-		
-		execute("co",globalOptions, 
-							EMPTY_ARGS, 
-							new String[]{"proj1"}, 
-							ioFolder, 
-							monitor,
-							System.err);
-		try {
-			execute("co",globalOptions, 
-							EMPTY_ARGS, 
-							new String[]{"proj1XXX"}, 
-							ioFolder, 
-							monitor,
-							System.err);
-			fail();
-		} catch (CVSException e) {}
-	}
-	
-	public void testDoubleCheckout() throws Exception {
-		
-		magicSetUpRepo("coProject1",new String[]{"a.txt","f1/b.txt","f1/c.txt","f2/d.txt"});
-		magicSetUpRepo("coProject2",new String[]{"a.txt","f1/b.txt","f1/c.txt","f2/d.txt"});
-		execute("co",
-							globalOptions,
-							EMPTY_ARGS,
-							new String[]{"coProject1","coProject2"},
-							workspaceRoot,
-							monitor,
-							System.err);
-		
-		assertTrue(getFile("coProject1/a.txt").exists());
-		assertTrue(getFile("coProject1/f1/b.txt").exists());
-		assertTrue(getFile("coProject2/a.txt").exists());
-		assertTrue(getFile("coProject2/f1/b.txt").exists());
-		
-		FileUtil.deepDelete(getFile("coProject1"));
-		FileUtil.deepDelete(getFile("coProject2"));
-				
-	}
-	
-	public void testImport() throws Exception {
-		File ioFolder = ioFolder1;
-		ICVSFolder mFolder = CVSWorkspaceRoot.getCVSFolderFor(ioFolder);
-		
-		String[] fileStructure = new String[]{"im/a.txt","im/f1/a.txt","im/f1/b.txt"};
-		createRandomFile(ioFolder,fileStructure);
-		
-		magicDeleteProject("im");
-		
-		execute("import",globalOptions,
-					   new String[]{"-m","Initial Release"},
-					   new String[]{"im","r1","r2"},
-					   getFile(mFolder.getFolder("im")),
-					   new NullProgressMonitor(),
-					   System.err);
-					   
-		execute("co",globalOptions,
-					   EMPTY_ARGS,
-					   new String[]{"im"},
-					   getFile(mFolder),
-					   new NullProgressMonitor(),
-					   System.err);
-	}
-
-	public void testUpdate() throws CVSException {
-
-		File ioFolder = ioFolder1;
-		
-		execute("co",globalOptions, 
-							EMPTY_ARGS, 
-							arguments, 
-							ioFolder, 
-							monitor,
-							System.err);
-							
-		try {
-			execute("update",globalOptions, 
-							EMPTY_ARGS, 
-							new String[0], 
-							ioFolder, 
-							monitor,
-							System.err);
-			fail();
-		} catch (CVSException e) {}
-
-		execute("update",globalOptions, 
-							EMPTY_ARGS, 
-							arguments, 
-							ioFolder, 
-							monitor,
-							System.err);
-	}
-}
-
diff --git a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/provider/ModuleTest.java b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/provider/ModuleTest.java
index 7148efc..f08e863 100644
--- a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/provider/ModuleTest.java
+++ b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/provider/ModuleTest.java
@@ -3,20 +3,26 @@
  * (c) Copyright IBM Corp. 2000, 2002.
  * All Rights Reserved.
  */
-import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
 
+import junit.framework.Assert;
 import junit.framework.Test;
 import junit.framework.TestSuite;
 import org.eclipse.core.internal.plugins.PluginDescriptor;
 import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
 import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IPluginDescriptor;
+import org.eclipse.core.runtime.IPluginRegistry;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.Platform;
-import org.eclipse.team.ccvs.core.*;
 import org.eclipse.team.ccvs.core.CVSTag;
 import org.eclipse.team.ccvs.core.ICVSFolder;
 import org.eclipse.team.ccvs.core.ICVSResource;
@@ -87,19 +93,27 @@
 		isSetUp = true;
 	}
 	
-	protected void uploadProject(String projectName) throws TeamException, IOException {
-		// upload the modules definitions file
-		PluginDescriptor testPlugin = (PluginDescriptor)Platform.getPluginRegistry().getPluginDescriptor("org.eclipse.team.tests.cvs.core");
-		String filePath = testPlugin.getLocation().concat(RESOURCE_PATH + projectName);
-		URL url = null;
-		try {
-			url = new URL (filePath);
-		} catch (java.net.MalformedURLException e) {
-			assertTrue("Bad URL for " + filePath, true);
-		}
+	protected void uploadProject(String projectName) throws TeamException, IOException, CoreException {
+		// locate the test case contents in the plugin resources
+		IPluginRegistry registry = Platform.getPluginRegistry();
+		IPluginDescriptor descriptor = registry.getPluginDescriptor("org.eclipse.team.tests.cvs.core");
+		URL baseURL = descriptor.getInstallURL();
+		URL url = new URL(baseURL, RESOURCE_PATH + projectName);
+		url = Platform.resolve(url);
+		Assert.assertTrue(url.getProtocol().equals("file"));
+		IPath path = new Path(url.getPath());
 		
-		// Import the project into CVS
-		Session s = new Session(getRepository(), CVSWorkspaceRoot.getCVSFolderFor(new File(url.getPath())));
+		// create a project rooted there
+		IWorkspace workspace = ResourcesPlugin.getWorkspace();
+		IWorkspaceRoot workspaceRoot = workspace.getRoot();
+		IProject project = workspaceRoot.getProject(projectName);
+		IProjectDescription projectDescription = workspace.newProjectDescription(projectName);
+		projectDescription.setLocation(path);
+		project.create(projectDescription, null);
+		project.open(null);
+
+		// import the project into CVS
+		Session s = new Session(getRepository(), CVSWorkspaceRoot.getCVSFolderFor(project));
 		s.open(DEFAULT_MONITOR);
 		try {
 			Command.IMPORT.execute(s, Command.NO_GLOBAL_OPTIONS, 
@@ -110,6 +124,9 @@
 		} finally {
 			s.close();
 		}
+
+		// delete the project locally
+		project.delete(false /*deleteContent*/, false /*force*/, null);
 	}
 	
 	// XXX Temporary method of checkout (i.e. with vcm_meta
@@ -145,7 +162,7 @@
 	public void testSelfReferencingModule() throws TeamException, CoreException, IOException {
 		uploadProject("project1");
 		IProject project1 = checkoutProject("project1", null);
-		IRemoteSyncElement tree = getProvider(project1).getRemoteSyncTree(project1, CVSTag.DEFAULT, DEFAULT_MONITOR);
+		IRemoteSyncElement tree = CVSWorkspaceRoot.getRemoteSyncTree(project1, CVSTag.DEFAULT, DEFAULT_MONITOR);
 		assertEquals(Path.EMPTY, CVSWorkspaceRoot.getCVSResourceFor(project1), (ICVSResource)tree.getRemote(), false, false);
 		RemoteModule module = getRemoteModule("project1");
 		assertEquals(Path.EMPTY, (RemoteFolder)tree.getRemote(), module, false);
@@ -161,13 +178,13 @@
 	public void testFlattenedStructure() throws TeamException, CoreException, IOException {
 		
 		IProject docs = checkoutProject("docs", null);
-		IRemoteSyncElement tree = getProvider(docs).getRemoteSyncTree(docs, CVSTag.DEFAULT, DEFAULT_MONITOR);
+		IRemoteSyncElement tree = CVSWorkspaceRoot.getRemoteSyncTree(docs, CVSTag.DEFAULT, DEFAULT_MONITOR);
 		assertEquals(Path.EMPTY, CVSWorkspaceRoot.getCVSResourceFor(docs), (ICVSResource)tree.getRemote(), false, false);
 		RemoteModule module = getRemoteModule("docs");
 		assertEquals(Path.EMPTY, (RemoteFolder)tree.getRemote(), module, false);
 		
 		IProject macros = checkoutProject("macros", null);
-		tree = getProvider(macros).getRemoteSyncTree(macros, CVSTag.DEFAULT, DEFAULT_MONITOR);
+		tree = CVSWorkspaceRoot.getRemoteSyncTree(macros, CVSTag.DEFAULT, DEFAULT_MONITOR);
 		assertEquals(Path.EMPTY, CVSWorkspaceRoot.getCVSResourceFor(macros), (ICVSResource)tree.getRemote(), false, false);
 		module = getRemoteModule("macros");
 		assertEquals(Path.EMPTY, (RemoteFolder)tree.getRemote(), module, false);
@@ -185,14 +202,14 @@
 	public void testIncludeAndExcludeDocs() throws TeamException, CoreException, IOException {
 		uploadProject("project2");
 		IProject project2 = checkoutProject("project2", null);
-		IRemoteSyncElement tree = getProvider(project2).getRemoteSyncTree(project2, CVSTag.DEFAULT, DEFAULT_MONITOR);
+		IRemoteSyncElement tree = CVSWorkspaceRoot.getRemoteSyncTree(project2, CVSTag.DEFAULT, DEFAULT_MONITOR);
 		assertEquals(Path.EMPTY, CVSWorkspaceRoot.getCVSResourceFor(project2), (ICVSResource)tree.getRemote(), false, false);
 
 		RemoteModule module = getRemoteModule("project2");
 		assertEquals(Path.EMPTY, (RemoteFolder)tree.getRemote(), module, false);
 
 		project2 = checkoutProject("project2-only", null);
-		tree = getProvider(project2).getRemoteSyncTree(project2, CVSTag.DEFAULT, DEFAULT_MONITOR);
+		tree = CVSWorkspaceRoot.getRemoteSyncTree(project2, CVSTag.DEFAULT, DEFAULT_MONITOR);
 		assertEquals(Path.EMPTY, CVSWorkspaceRoot.getCVSResourceFor(project2), (ICVSResource)tree.getRemote(), false, false);
 
 		module = getRemoteModule("project2-only");
@@ -211,15 +228,15 @@
 	public void testAliasForFiles() throws TeamException, CoreException, IOException {
 		uploadProject("project3");
 		IProject project3 = checkoutProject("project3-sub", null);
-		IRemoteSyncElement tree = getProvider(project3).getRemoteSyncTree(project3, CVSTag.DEFAULT, DEFAULT_MONITOR);
+		IRemoteSyncElement tree = CVSWorkspaceRoot.getRemoteSyncTree(project3, CVSTag.DEFAULT, DEFAULT_MONITOR);
 //		assertEquals("Local does not match remote", Session.getManagedResource(project3), (ICVSResource)tree.getRemote(), false, false);
 
 		project3 = checkoutProject("project3-src", null);
-		tree = getProvider(project3).getRemoteSyncTree(project3, CVSTag.DEFAULT, DEFAULT_MONITOR);
+		tree = CVSWorkspaceRoot.getRemoteSyncTree(project3, CVSTag.DEFAULT, DEFAULT_MONITOR);
 //		assertEquals("Local does not match remote", Session.getManagedResource(project3), (ICVSResource)tree.getRemote(), false, false);
 
 		project3 = checkoutProject("project3-src_file", null);
-		tree = getProvider(project3).getRemoteSyncTree(project3, CVSTag.DEFAULT, DEFAULT_MONITOR);
+		tree = CVSWorkspaceRoot.getRemoteSyncTree(project3, CVSTag.DEFAULT, DEFAULT_MONITOR);
 //		assertEquals("Local does not match remote", Session.getManagedResource(project3), (ICVSResource)tree.getRemote(), false, false);
 	}
 	
@@ -234,15 +251,15 @@
 	public void testAliases() throws TeamException, CoreException, IOException {
 		uploadProject("project7");
 		IProject project7 = checkoutProject("project7-common", null);
-		IRemoteSyncElement tree = getProvider(project7).getRemoteSyncTree(project7, CVSTag.DEFAULT, DEFAULT_MONITOR);
+		IRemoteSyncElement tree = CVSWorkspaceRoot.getRemoteSyncTree(project7, CVSTag.DEFAULT, DEFAULT_MONITOR);
 //		assertEquals("Local does not match remote", Session.getManagedResource(project7), (ICVSResource)tree.getRemote(), false, false);
 
 		project7 = checkoutProject("project7-pc", null);
-		tree = getProvider(project7).getRemoteSyncTree(project7, CVSTag.DEFAULT, DEFAULT_MONITOR);
+		tree = CVSWorkspaceRoot.getRemoteSyncTree(project7, CVSTag.DEFAULT, DEFAULT_MONITOR);
 //		assertEquals("Local does not match remote", Session.getManagedResource(project7), (ICVSResource)tree.getRemote(), false, false);
 
 		project7 = checkoutProject("project7-linux", null);
-		tree = getProvider(project7).getRemoteSyncTree(project7, CVSTag.DEFAULT, DEFAULT_MONITOR);
+		tree = CVSWorkspaceRoot.getRemoteSyncTree(project7, CVSTag.DEFAULT, DEFAULT_MONITOR);
 //		assertEquals("Local does not match remote", Session.getManagedResource(project7), (ICVSResource)tree.getRemote(), false, false);
 	}
 	
