diff --git a/bundles/org.eclipse.releng.tests/.classpath b/bundles/org.eclipse.releng.tests/.classpath
deleted file mode 100644
index 53bd22c..0000000
--- a/bundles/org.eclipse.releng.tests/.classpath
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-    <classpathentry kind="src" path="src"/>
-    <classpathentry kind="var" path="JRE_LIB" sourcepath="JRE_SRC"/>
-    <classpathentry kind="var" path="ECLIPSE_HOME/plugins/org.junit_3.8.1/junit.jar"/>
-    <classpathentry kind="src" path="/org.eclipse.core.boot"/>
-    <classpathentry kind="src" path="/org.eclipse.core.runtime"/>
-    <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.releng.tests/.cvsignore b/bundles/org.eclipse.releng.tests/.cvsignore
deleted file mode 100644
index 894553b..0000000
--- a/bundles/org.eclipse.releng.tests/.cvsignore
+++ /dev/null
@@ -1,6 +0,0 @@
-bin
-temp.folder
-org.eclipse.releng.tests_2.1.0.zip
-relengtestssrc.zip
-build.xml
-relengtests.jar
diff --git a/bundles/org.eclipse.releng.tests/.project b/bundles/org.eclipse.releng.tests/.project
deleted file mode 100644
index f781483..0000000
--- a/bundles/org.eclipse.releng.tests/.project
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.releng.tests</name>
-	<comment></comment>
-	<projects>
-		<project>org.eclipse.core.boot</project>
-		<project>org.eclipse.core.runtime</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.releng.tests/about.html b/bundles/org.eclipse.releng.tests/about.html
deleted file mode 100644
index 9db411a..0000000
--- a/bundles/org.eclipse.releng.tests/about.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>20th June, 2002</p>	
-<h3>License</h3>
-<p>Eclipse.org makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Common Public License Version 1.0 (&quot;CPL&quot;).  A copy of the CPL is available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>.
-For purposes of the CPL, &quot;Program&quot; will mean the Content.</p>
-
-<h3>Contributions</h3>
-
-<p>If this Content is licensed to you under the terms and conditions of the CPL, any Contributions, as defined in the CPL, uploaded, submitted, or otherwise
-made available to Eclipse.org, members of Eclipse.org and/or the host of Eclipse.org web site, by you that relate to such
-Content are provided under the terms and conditions of the CPL and can be made available to others under the terms of the CPL.</p>
-
-<p>If this Content is licensed to you under license terms and conditions other than the CPL (&quot;Other License&quot;), any modifications, enhancements and/or
-other code and/or documentation (&quot;Modifications&quot;) uploaded, submitted, or otherwise made available to Eclipse.org, members of Eclipse.org and/or the
-host of Eclipse.org, by you that relate to such Content are provided under terms and conditions of the Other License and can be made available
-to others under the terms of the Other License.  In addition, with regard to Modifications for which you are the copyright holder, you are also
-providing the Modifications under the terms and conditions of the CPL and such Modifications can be made available to others under the terms of
-the CPL.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.releng.tests/build.properties b/bundles/org.eclipse.releng.tests/build.properties
deleted file mode 100644
index aeb8bf6..0000000
--- a/bundles/org.eclipse.releng.tests/build.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2003 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials 
-# are made available under the terms of the Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes = plugin.properties,\
-               plugin.xml,\
-               *.xml,\
-               *.txt,\
-               *.exe
-source.relengtests.jar = src/
diff --git a/bundles/org.eclipse.releng.tests/ignoreErrorsUnix.txt b/bundles/org.eclipse.releng.tests/ignoreErrorsUnix.txt
deleted file mode 100644
index e69de29..0000000
--- a/bundles/org.eclipse.releng.tests/ignoreErrorsUnix.txt
+++ /dev/null
diff --git a/bundles/org.eclipse.releng.tests/ignoreErrorsWindows.txt b/bundles/org.eclipse.releng.tests/ignoreErrorsWindows.txt
deleted file mode 100644
index 3a88561..0000000
--- a/bundles/org.eclipse.releng.tests/ignoreErrorsWindows.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-127
-128
diff --git a/bundles/org.eclipse.releng.tests/ignoreFiles.txt b/bundles/org.eclipse.releng.tests/ignoreFiles.txt
deleted file mode 100644
index d28b594..0000000
--- a/bundles/org.eclipse.releng.tests/ignoreFiles.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-feature.properties
-feature.xml
-cpl*.html
-license.html
-notice.html
-*/doc_zip/reference/api/*
-*/org.apache.ant_*
-*/plugins/org.apache.xerces_*/xercesImpl_jar/*
-*/plugins/org.apache.xerces_*/xercessrc_zip/*
-*/plugins/org.eclipse.platform.source_*/src/org.apache.xerces_*/xercessrc_zip/*
-*/plugins/org.eclipse.tomcat_*/conf/*
-*/plugins/org.eclipse.tomcat_*/catalina_jar/*
-*/plugins/org.eclipse.tomcat_*/jasper-runtime_jar/*
-*/plugins/org.eclipse.tomcat_*/tomcat-util_jar/*
-*/org.apache.lucene_1.2.1/lucene-1.2-src_zip/lucene-1.2-src/*
-*/plugins/org.eclipse.platform.source_*/src/org.apache.lucene_1.2.1/lucene-1.2-src_zip/lucene-1.2-src/*
-*/plugins/org.eclipse.jdt.ui_*/jdt_jar/org/eclipse/jdt/internal/corext/template/default-codetemplates.xml
-*/plugins/org.eclipse.ui.externaltools_*/externaltools_jar/anttasks_1.5b.xml
-*/plugins/org.eclipse.ui.externaltools_*/externaltools_jar/XDOCtasks.xml
-*/plugins/org.eclipse.pde.ui_*/templates/help/toc.xml
-*/plugins/org.eclipse.help.webapp_*/WEB-INF/web.xml
-*/plugins/org.eclipse.ui_*/plugin.xml
-.metadata/.cache.properties
diff --git a/bundles/org.eclipse.releng.tests/notes.txt b/bundles/org.eclipse.releng.tests/notes.txt
deleted file mode 100644
index 6738366..0000000
--- a/bundles/org.eclipse.releng.tests/notes.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-In order for the testChkpii automated test to run you must have
-the correct version of the internal IBM chkpii tools on your
-path and the file must be called chkpw509.exe
-
-Also, in Unix system chkpii chokes if you have errors 127 and 128
-in your ignoreErrors.txt file
-
-Also, you must use the correct platform file seperator in the
-ignoreFiles.txt.
\ No newline at end of file
diff --git a/bundles/org.eclipse.releng.tests/plugin.xml b/bundles/org.eclipse.releng.tests/plugin.xml
deleted file mode 100644
index 7ce1179..0000000
--- a/bundles/org.eclipse.releng.tests/plugin.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin
-   id="org.eclipse.releng.tests"
-   name="Eclipse Releng Tests"
-   version="2.1.0"
-   provider-name="Eclipse.org">
-   
-<requires>
-   <import plugin="org.eclipse.core.boot"/>
-   <import plugin="org.eclipse.core.runtime"/>
-   <import plugin="org.eclipse.core.resources"/>
-   <import plugin="org.junit"/>
-</requires>
-
-<runtime>
-   <library name="relengtests.jar"/>
-</runtime>
-
-</plugin>
diff --git a/bundles/org.eclipse.releng.tests/src/org/eclipse/releng/tests/BuildTests.java b/bundles/org.eclipse.releng.tests/src/org/eclipse/releng/tests/BuildTests.java
deleted file mode 100644
index c4d46a7..0000000
--- a/bundles/org.eclipse.releng.tests/src/org/eclipse/releng/tests/BuildTests.java
+++ /dev/null
@@ -1,927 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.releng.tests;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.LineNumberReader;
-//import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.StringTokenizer;
-import java.util.zip.ZipFile;
-
-import org.eclipse.core.boot.BootLoader;
-import org.eclipse.core.runtime.Platform;
-
-import junit.framework.TestCase;
-
-public class BuildTests extends TestCase {
-	
-	private List copyrightExcludeDirectories;
-	private List cvsExcludeDirectories;
-	private String sourceDirectoryName;
-	private String logFileName;
-	private static final String CVS_KO = "-ko";
-	private static final String CVS_KKV = "-kkv";
-	private static final String CVS_KB = "-kb";
-	private static final String CVS_BINARY = "CVS_BINARY";
-	private static final int ENTRY_TYPE_INDEX = 3;
-	private static final int ENTRY_NAME_INDEX = 0;
-	private static final int MIN_ENTRY_FIELDS_SIZE = 4;
-	private static final String DEFAULT_CVS_TYPE = "-kkv";
-	
-	private Map cvsTypes;
-	private List cvsDirectoryTypes;
-	private String[] javaCopyrightLines;
-	private long goodCopyrights = 0;
-	private long badCopyrights = 0;
-	private static final int HTML = 0;
-	private static final int PROPERTIES = 1;
-	private static final int XML = 2;
-	
-	private static FileTool.IZipFilter getTrueFilter() {
-		return new FileTool.IZipFilter() {
-			public boolean shouldExtract(String fullEntryName, String entryName, int depth) {return true;}
-			public boolean shouldUnzip(String fullEntryName, String entryName, int depth) {
-				return true;
-			}
-		};
-	}
-	
-	/**
-	 * Method hasErrors.
-	 * @param string
-	 * @return boolean
-	 */
-	private boolean hasErrors(String string) {
-		
-		boolean result = false;
-		BufferedReader aReader = null;
-		
-		try {
-			aReader = new BufferedReader(new InputStreamReader(new FileInputStream(string)));
-			String aLine = aReader.readLine();
-			while (aLine != null) {
-				int aNumber = parseLine(aLine);
-				if (aNumber > 0) {
-					result = true;
-					break;
-				}
-				aLine = aReader.readLine();
-			}
-		} catch (FileNotFoundException e) {
-			System.out.println("Could not open log file: " + string);
-			result = true;
-		} catch (IOException e) {
-			System.out.println("Error reading log file: " + string);
-			result = true;
-		} finally {
-			if (aReader != null) {
-				try {
-					aReader.close();
-				} catch (IOException e) {
-					result = true;
-				}
-			}
-		}
-		
-		return result;
-	}
-
-	public void bogusTestCopyright() {  // Not ready for primetime yet.
-		
-		boolean result = false;
-		initializeJavaCopyright();
-		
-		new File(logFileName).mkdirs();
-		logFileName = logFileName + File.separator + "copyrightLog.txt";
-
-		try {
-			BufferedWriter aLog = new BufferedWriter(new FileWriter(logFileName));
-			File rootDirectory = new File(sourceDirectoryName);
-			result = scanCopyrights(rootDirectory, aLog);
-			aLog.close();
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-		
-		System.out.println("Total copyrights: " + (goodCopyrights + badCopyrights));
-		System.out.println("Good copyrights: " + goodCopyrights);
-		System.out.println("Bad copyrights: " + badCopyrights);
-		
-		assertFalse("Copyright errors.  See the releng test logs linked from the test results page for details.", result);
-	}
-
-
-	
-	/**
-	 * @param rootDirectory
-	 * @param aLog
-	 * @return boolean
-	 */
-	private boolean scanCopyrights(File aDirectory, BufferedWriter aLog) {
-		
-		boolean result = false;
-		
-		if (isCopyrightExcludeDirectory(aDirectory)) {
-			return result;
-		}
-		
-		File[] files = aDirectory.listFiles();
-		
-		if (files == null) {
-			return result;
-		}
-		
-		for (int i = 0; i < files.length; i++) {
-			File aFile = files[i];
-			if (aFile.isDirectory()) {
-				result = result | scanCopyrights(aFile, aLog);
-			} else {
-				result = result | validateCopyright(aFile, aLog);;
-			}
-		}
-		return result;
-	}
-	
-	public void ztestCVSKTag() {
-		
-		boolean result = false;
-		initializeCVSTypes();
-		new File(logFileName).mkdirs();
-		logFileName = logFileName + File.separator + "cvsTypesLog.txt";
-			
-		try {
-			BufferedWriter aLog = new BufferedWriter(new FileWriter(logFileName));
-			File rootDirectory = new File(sourceDirectoryName);
-			result = scanCVSKTag(rootDirectory, aLog);
-			aLog.close();
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-		
-		assertFalse("CVS KTag type errors.  See the releng test logs linked from the test results page for details.", result);
-	}
-	
-	private void initializeCVSTypes() {
-		cvsTypes = new HashMap();
-		cvsDirectoryTypes = new ArrayList();
-		cvsExcludeDirectories = new ArrayList();
-		
-		
-		cvsTypes.put("gif", CVS_BINARY);
-		cvsTypes.put("jpg", CVS_BINARY);
-		cvsTypes.put("zip", CVS_BINARY);
-		cvsTypes.put("jar", CVS_BINARY);
-		cvsTypes.put("bmp", CVS_BINARY);
-		cvsTypes.put("class", CVS_BINARY);
-		cvsTypes.put("dll", CVS_BINARY);
-		cvsTypes.put("doc", CVS_BINARY);
-		cvsTypes.put("exe", CVS_BINARY);
-		cvsTypes.put("ico", CVS_BINARY);
-		cvsTypes.put("jpeg", CVS_BINARY);
-		cvsTypes.put("pdf", CVS_BINARY);
-		cvsTypes.put("png", CVS_BINARY);
-		cvsTypes.put("ppt", CVS_BINARY);
-		cvsTypes.put("so", CVS_BINARY);
-		cvsTypes.put("tiff", CVS_BINARY);
-		cvsTypes.put("tif", CVS_BINARY);
-		cvsTypes.put("xls", CVS_BINARY);
-		cvsTypes.put("rsc", CVS_BINARY);
-		cvsTypes.put("jnilib", CVS_BINARY);
-		cvsTypes.put("a", CVS_BINARY);
-		cvsTypes.put("sl", CVS_BINARY);
-		cvsTypes.put("a", CVS_BINARY);
-		cvsTypes.put("1", CVS_BINARY);
-		cvsTypes.put("xpm", CVS_BINARY);
-		cvsTypes.put("a", CVS_BINARY);
-		cvsTypes.put("pm", CVS_BINARY);
-
-		// Define directories with all binary types	
-		cvsDirectoryTypes.add("org.eclipse.jdt.ui.tests.refactoring" + File.separator + "resources");
-		
-		// Define exclude directories
-		cvsExcludeDirectories.add("org.eclipse.jdt.ui.tests.refactoring" + File.separator + "resources");
-		cvsExcludeDirectories.add("platform-launcher");
-
-	}
-	
-	private void initializeJavaCopyright() {
-		copyrightExcludeDirectories = new ArrayList();
-
-		javaCopyrightLines = new String[8];
-		javaCopyrightLines[0]="/*******************************************************************************";
-		javaCopyrightLines[1]=" * Copyright (c) 2000, 2003 IBM Corporation and others.";
-		javaCopyrightLines[2]=" * All rights reserved. This program and the accompanying materials ";
-		javaCopyrightLines[3]=" * are made available under the terms of the Common Public License v1.0";
-		javaCopyrightLines[4]=" * which accompanies this distribution, and is available at";
-		javaCopyrightLines[5]=" * http://www.eclipse.org/legal/cpl-v10.html";
-		javaCopyrightLines[6]=" * ";
-		javaCopyrightLines[7]=" * Contributors:";
-		
-		// Define directories with all binary types	
-		copyrightExcludeDirectories.add("org.eclipse.jdt.ui.tests.refactoring" + File.separator + "resources");
-		copyrightExcludeDirectories.add("org.eclipse.jdt.debug.tests" + File.separator + "resources");
-
-	}
-	
-	private boolean scanCVSKTag(File aDirectory, BufferedWriter aLog) {
-		
-		boolean result = false;
-		
-		if (isCvsExcludeDirectory(aDirectory)) {
-			return result;
-		}
-		
-		File[] files = aDirectory.listFiles();
-		
-		if (files == null) {
-			return result;
-		}
-		
-		for (int i = 0; i < files.length; i++) {
-			File aFile = files[i];
-			if (aFile.isDirectory()) {
-				if (aFile.getName().equals("CVS")) {
-					result = result | scanCVSDirectory(aFile, aLog);
-				} else {
-					result = result | scanCVSKTag(aFile, aLog);
-				} 
-			}
-		}
-		return result;
-	}
-	
-	/**
-	 * @param aDirectory
-	 * @return
-	 */
-	private boolean isCvsExcludeDirectory(File aDirectory) {
-		String aString = aDirectory.getPath().substring(sourceDirectoryName.length()).toLowerCase();
-		Iterator anIterator = cvsExcludeDirectories.iterator();
-		while (anIterator.hasNext()) {
-			String anItem = (String) anIterator.next();
-			if (aString.indexOf(anItem) != -1) {
-				return true; 
-			}
-		}
-		return false;
-	}
-	
-	/**
-	 * @param aDirectory
-	 * @return
-	 */
-	private boolean isCopyrightExcludeDirectory(File aDirectory) {
-		String aString = aDirectory.getPath().substring(sourceDirectoryName.length()).toLowerCase();
-		Iterator anIterator = copyrightExcludeDirectories.iterator();
-		while (anIterator.hasNext()) {
-			String anItem = (String) anIterator.next();
-			if (aString.indexOf(anItem) != -1) {
-				return true; 
-			}
-		}
-		return false;
-	}
-	
-	private boolean scanCVSDirectory(File aDirectory, BufferedWriter aLog) {
-		
-		boolean result = false;
-		
-		File entries = new File(aDirectory, "Entries");
-		try {
-			BufferedReader aReader = new BufferedReader(new FileReader(entries));
-			String aLine = aReader.readLine();
-			while (aLine != null) {
-				result = result | validateCVSEntry(aDirectory.getParentFile(), aLine, aLog);
-				aLine = aReader.readLine();
-			}
-			
-			aReader.close();
-		} catch (FileNotFoundException e) {
-			System.out.println("File Not Found reading Entries file");
-			e.printStackTrace();
-		} catch (IOException e) {
-			System.out.println("IOException reading Entries file");
-			e.printStackTrace();
-		}
-		
-		return result;
-		
-	}
-
-	/**
-	 * 
-	 * @param aFile
-	 * @return boolean - true if the copyright is NOT valid.
-	 */	
-	private boolean validateCopyright(File aFile, BufferedWriter aLog) {
-		boolean result = false;
-		
-		if (!aFile.getName().endsWith(".java")) {
-			return result;
-		}
-		
-		LineNumberReader aReader;
-		try {
-			aReader = new LineNumberReader(new FileReader(aFile));
-			for (int i = 0; i < javaCopyrightLines.length; i++) {
-				String aLine = aReader.readLine();
-				if (aLine == null) {
-					result = true;
-					break;
-				}
-				
-				if (i > -1) {
-					if (!aLine.trim().toLowerCase().equals(javaCopyrightLines[i].trim().toLowerCase())) {
-						result = true;
-						break;
-					}
-				}
-			}
-			aReader.close();
-		} catch (FileNotFoundException e) {
-			e.printStackTrace();
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-		
-		if (result) {
-			badCopyrights++;
-			try {
-				int start = aFile.getPath().indexOf("plugins");
-				String fileName;
-				if (start == -1) {
-					fileName = aFile.getPath();
-				} else {
-					fileName = aFile.getPath().substring(start + "plugins".length() + 1);
-				}
-
-				aLog.write(fileName);
-				aLog.newLine();
-			} catch (IOException e1) {
-				e1.printStackTrace();
-			}
-	
-		} else {
-			goodCopyrights++;
-		}
-		
-		return result;
-	}
-	
-	private boolean validateCVSEntry(File aDirectory, String aLine, BufferedWriter aLog) {
-
-		boolean result = false;
-		
-		String[] fields = split(aLine, "/");
-		if (fields.length < MIN_ENTRY_FIELDS_SIZE) {
-			return result;
-		}
-		
-		String expectedType;
-	
-		// Some entire directories are marked as Binary.	
-		if (isCVSBinaryDirectory(aDirectory)) {
-			expectedType = CVS_BINARY;
-		} else {
-			expectedType = null;
-		}
-		
-		String entryName = aDirectory + File.separator + fields[ENTRY_NAME_INDEX];
-		if (expectedType == null) {
-			expectedType  = (String) cvsTypes.get(entryName);
-		}
-
-		// No type registered for exact file name.  Check for extension
-		if (expectedType == null) {			
-			
-			String[] dotParts = split(fields[ENTRY_NAME_INDEX], ".");
-			String entryExtension;
-			if (dotParts.length == 0) {
-				// File name has no extension.
-				expectedType = DEFAULT_CVS_TYPE;
-			} else {
-				entryExtension = dotParts[dotParts.length - 1];
-				expectedType = (String) cvsTypes.get(entryExtension);
-				if (expectedType == null) {
-					// Extension has no type registered
-					expectedType = DEFAULT_CVS_TYPE;
-				}
-			}
-		}
-		
-		// We know what type to expect for this file.  Are we the right one?
-				
-		String entryType = fields[ENTRY_TYPE_INDEX];
-		if (entryType.length() == 0) {
-			entryType = CVS_KKV;
-		}
-		
-		try {
-			if (expectedType.equals(CVS_BINARY)) {
-				if (!entryType.equals(CVS_KB)) {
-					// Fail Binary Test
-					int start = entryName.indexOf("plugins");
-					String fileName;
-					if (start == -1) {
-						fileName = entryName;
-					} else {
-						fileName = entryName.substring(start + "plugins".length() + 1);
-					}
-					aLog.write(fileName + " should be *BINARY*");
-					aLog.newLine();
-					result = true;
-				}
-			} else {
-				if (!(entryType.equals(CVS_KKV) || entryType.equals(CVS_KO))) {
-					// Fail
-					int start = entryName.indexOf("plugins");
-					String fileName;
-					if (start == -1) {
-						fileName = entryName;
-					} else {
-						fileName = entryName.substring(start + "plugins".length() + 1);
-					}
-					aLog.write(fileName + " should be *TEXT*");
-					aLog.newLine();
-					result = true;
-				}
-			}
-		} catch (IOException e) {	
-			System.out.println("IOException writing log");
-			e.printStackTrace();	
-		}
-		return result;
-	}
-	
-	/**
-	 * @param aDirectory
-	 * @return
-	 */
-	private boolean isCVSBinaryDirectory(File aDirectory) {
-		String aString = aDirectory.getPath().substring(sourceDirectoryName.length()).toLowerCase();
-		Iterator anIterator = cvsDirectoryTypes.iterator();
-		while (anIterator.hasNext()) {
-			String anItem = (String) anIterator.next();
-			if (aString.indexOf(anItem) != -1) {
-				return true; 
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @param aLine
-	 * @param delimeter
-	 * @return String[]
-	 */
-	private String[] split(String aLine, String delimeter) {
-		StringTokenizer tokenizer = new StringTokenizer(aLine, delimeter, true);
-		List list = new ArrayList();
-		String lastToken = "";
-		while (tokenizer.hasMoreTokens()) {
-			String aToken = (String) tokenizer.nextToken();
-			if (aToken.equals(delimeter)) {
-				if (lastToken.equals(delimeter)) {
-					list.add("");
-				}
-			} else {
-				list.add(aToken);
-			}
-			lastToken=aToken;
-		}
-		return (String[]) list.toArray(new String[0]);
-	}
-	
-	public void testChkpii() {
-			
-			String zipFile = locateEclipseZip();
-//			String sniffFolder = BootLoader.getInstallURL().getPath() + "releng_sniff_folder";
-//			String sniffFolder = "\\builds\\t";
-			String sniffFolder = Platform.getLocation().toOSString();
-		
-			try {
-				FileTool.unzip(getTrueFilter(), new ZipFile(zipFile), new File(sniffFolder));
-			} catch (IOException e) {
-				
-				
-				fail(zipFile + ": " + sniffFolder  + ": " + "IOException unzipping Eclipse for chkpii");
-			}
-		
-			boolean result1  = testChkpii(HTML);
-			boolean result2 = testChkpii(XML);
-			boolean result3 = testChkpii(PROPERTIES);
-			assertTrue("Translation errors in files.  See the chkpii logs linked from the test results page for details.", (result1 && result2 && result3));
-		}
-		
-		private boolean testChkpii(int type) {
-			Runtime aRuntime = Runtime.getRuntime();
-			String chkpiiString = getChkpiiString(type);
-			try {
-				Process aProcess = aRuntime.exec(chkpiiString);
-				BufferedReader aBufferedReader = new BufferedReader(new InputStreamReader(aProcess.getInputStream()));
-				String line = null;
-				while ( (line = aBufferedReader.readLine()) != null) {
-				}
-				aProcess.waitFor();
-			} catch (IOException e) {
-				e.printStackTrace();
-				return false;
-			} catch (InterruptedException e) {
-				return false;
-			}
-			return !hasErrors(getOutputFile(type));
-		}
-		
-		/**
-		 * Method getChkpiiString.
-		 * @param HTML
-		 * @return String
-		 */
-		private String getChkpiiString(int type) {
-			return getExec() + " " + getFilesToTest(type) + " -E -O " + getOutputFile(type) + " -XM @" + getExcludeErrors() + " -X " + getExcludeFile () + " -S" +" /tex";
-		}
-		/**
-		 * Method locateEclipseZip.
-		 * @return String
-		 */
-		private String locateEclipseZip() {
-
-			// String to use when running as an automated test.			
-			String installDir = BootLoader.getInstallURL().getPath() + ".." + File.separator + "..";
-			
-			// String to use when running in Eclipse
-			// String installDir = BootLoader.getInstallURL().getPath() + "..";
-			File aFile = new File(installDir);
-			if (aFile == null) {
-				System.out.println("File is null");
-			}
-			System.out.println(installDir);
-			
-			File[] files = aFile.listFiles();
-			for (int i = 0; i < files.length; i++) {
-				File file = files[i];
-				String fileName = file.getName();
-				if (fileName.startsWith("eclipse-SDK-") && fileName.endsWith(".zip")) {
-					return file.getPath();
-				}
-			}
-			
-			return "";
-		}
-		
-		/**
-		 * Method getExcludeFiles.
-		 * @return String
-		 */
-		private String getExcludeFile() {
-			String aString = BootLoader.getInstallURL().getPath() + "plugins" + File.separator + "org.eclipse.releng.tests_2.1.0" + File.separator + "ignoreFiles.txt";
-			return new File(aString).getPath();
-		}
-		
-		/**
-		 * Method getOutputFile.
-		 * @param HTML
-		 * @return String
-		 */
-		
-		private String getOutputFile(int type) {
-		
-
-			new File(logFileName).mkdirs();
-			
-			String aString = logFileName + File.separator + "org.eclipse.nls.";
-			aString = new File(aString).getPath();
-
-			switch (type) {
-				case HTML :
-					return aString + "html.txt";
-				case PROPERTIES :
-					return aString + "properties.txt";
-				
-				case XML : 
-					return aString + "xml.txt";
-
-				default :
-					return aString + "other.txt";
-			}
-		}
-		
-		/**
-		 * Method getFilesToTest.
-		 * @param HTML
-		 * @return String
-		 */
-		
-		private String getFilesToTest(int type) {
-			
-			String sniffFolder = Platform.getLocation().toOSString();
-
-			String aString = new File(sniffFolder).getPath() + File.separator;
-			
-			switch (type) {
-				case HTML :
-					return aString + "*.htm*";
-				case PROPERTIES :
-					return aString + "*.properties";
-							
-				case XML : 
-					return aString + "*.xml";
-			
-				default :
-					return aString + "*.*";
-			}
-		}
-		
-		/**
-		 * Method getExec.
-		 * @return String
-		 */
-		
-		private String getExec() {
-
-			return new File("chkpw504.exe").getPath();
-		}
-		
-		/**
-		 * Method getExcludeErrors.
-		 */
-		private String getExcludeErrors() {
-			
-			String os = BootLoader.getOS();
-			String fileName;
-			
-			if (os.equals(BootLoader.OS_WIN32)) {
-				fileName = "ignoreErrorsWindows.txt";
-			} else {
-				fileName = "ignoreErrorsUnix.txt";
-			}
-			
-			String aString = BootLoader.getInstallURL().getPath() + "plugins" + File.separator + "org.eclipse.releng.tests_2.1.0" + File.separator + fileName;
-			return new File(aString).getPath();
-		}
-		
-	/**
-	 * Method parseLine.
-	 * @param aLine
-	 * @return -1 if not an error or warning line or the number of errors or
-	 * warnings.
-	 */
-	private int parseLine(String aLine) {
-		int index = aLine.indexOf("Files Contain Error");
-		
-		if (index == -1) {
-			index = aLine.indexOf("Files Contain Warning");
-		}
-		
-		if (index == -1) {
-			index = aLine.indexOf("Files Could Not Be Processed");
-		}
-		
-		if (index == -1) {
-			return index;
-		}
-		
-		String aString = aLine.substring(0, index).trim();
-		return Integer.parseInt(aString);
-	}
-	
-	public class FileSuffixFilter implements FilenameFilter {
-
-		private String suffix;
-		
-		public FileSuffixFilter(String suffix) {
-			this.suffix = suffix;
-		}
-		
-		/**
-		 * @see java.io.FilenameFilter#accept(java.io.File, java.lang.String)
-		 */
-		public boolean accept(File dir, String name) {
-			int lastDot = name.lastIndexOf('.');
-			if (lastDot == -1) {
-				return false;
-			}
-			return name.substring(lastDot).equals(suffix);
-		}
-
-	}
-
-	public static final String[] REQUIRED_FEATURE_FILES = {"cpl-v10.html", "feature.properties", "feature.xml", "license.html"};
-	public static final String REQUIRED_FEATURE_SUFFIX = ".jpg";
-
-	public static final String[] REQUIRED_PLUGIN_FILES = {"about.html", "plugin.properties", "plugin.xml"};
-	public static final String REQUIRED_PLUGIN_SUFFIX = ".jar";
-
-	public static final String[] REQUIRED_FEATURE_PLUGIN_FILES = {"about.html", "about.ini", "about.mappings", "about.properties", "plugin.properties", "plugin.xml"};
-	public static final String REQUIRED_FEATURE_PLUGIN_SUFFIX = ".gif";
-
-	public static final String[] REQUIRED_FRAGMENT_FILES = {"fragment.xml"};
-	public static final String REQUIRED_FRAGMENT_SUFFIX = "";
-	
-	public static final String[] REQUIRED_SOURCE_FILES = {"about.html"};
-	public static final String REQUIRED_SOURCE_SUFFIX = ".zip";
-	
-	public static final String[] SUFFIX_EXEMPT_LIST = {"org.eclipse.swt"};
-	
-	public static final int PLUGIN_COUNT = 84; // - 20;	// Note this number must include non-shipping test plugins
-	public static final int FEATURE_COUNT = 9; // - 1;	// Note this number must include non-shipping test feature
-
-	/**
-	 * Constructor for EmptyDirectoriesTest.
-	 * @param arg0
-	 */
-	public BuildTests(String arg0) {
-		super(arg0);
-	}
-
-	/**
-	 * @see TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		
-		// Autoamted Test
-		logFileName = BootLoader.getInstallURL().getPath() + ".." + File.separator + ".." + File.separator + "results" + File.separator + "chkpii";  // A tad bogus but this is where the build wants to copy the results from!
-		sourceDirectoryName = BootLoader.getInstallURL().getPath() +  ".." + File.separator + ".." + File.separator + ".." + File.separator + ".." + File.separator + "src";
-
-		// Runtime Workbench - TODI Put me back to Automated status
-//		logFileName = "d:\\results";
-//		sourceDirectoryName = "d:\\sourceFetch";
-	}
-
-	/**
-	 * @see TestCase#tearDown()
-	 */
-	protected void tearDown() throws Exception {
-		super.tearDown();
-	}
-
-	public void testFeatureFiles() {
-		List result = new ArrayList();
-		String installDir = BootLoader.getInstallURL().getPath();
-		File featureDir = new File(installDir, "features");
-		File[] features = featureDir.listFiles();
-		for (int i = 0; i < features.length; i++) {
-			File aFeature = features[i];
-			if (!testDirectory(aFeature, REQUIRED_FEATURE_FILES, REQUIRED_FEATURE_SUFFIX)) {
-				result.add(aFeature.getPath());
-			}
-
-		}
-		
-		String aString = "";
-		if (result.size() > 0) {
-			
-			Iterator iter = result.iterator();
-			while (iter.hasNext()) {
-				String element = (String) iter.next();
-				aString = aString + element + "; ";
-			}
-		}
-		assertTrue("Feature directory missing required files: " + aString, result.size() == 0);
-	}
-	
-//	public void testPluginCount() {
-//		String installDir = BootLoader.getInstallURL().getPath();
-//		File pluginDir = new File(installDir, "plugins");
-//		File[] plugins = pluginDir.listFiles();
-//
-//		assertTrue("Plug-ins missing: " + (PLUGIN_COUNT - plugins.length), PLUGIN_COUNT == plugins.length);
-//	}
-	
-	public void testFeatureCount() {
-		String installDir = BootLoader.getInstallURL().getPath();
-		File featureDir = new File(installDir, "features");
-		File[] features = featureDir.listFiles();
-
-		assertTrue("Features missing: " + (FEATURE_COUNT - features.length), FEATURE_COUNT == features.length);
-	}
-	
-	
-	public void testPluginFiles() {
-		List result = new ArrayList();
-		String installDir = BootLoader.getInstallURL().getPath();
-		File pluginDir = new File(installDir, "plugins");
-		File[] plugins = pluginDir.listFiles();
-		for (int i = 0; i < plugins.length; i++) {
-			File aPlugin = plugins[i];
-			if (aPlugin.getName().indexOf("test") == -1) {
-				if (!testPluginFile(aPlugin)) {
-					result.add(aPlugin.getPath());
-				}
-			}
-		}
-
-		String aString = "";
-		if (result.size() > 0) {
-
-			Iterator iter = result.iterator();
-			while (iter.hasNext()) {
-				String element = (String) iter.next();
-				aString = aString + element + "; ";
-			}
-		}
-		assertTrue("Plugin directory missing required files: " + aString, result.size() == 0);
-	}
-
-	private boolean testPluginFile(File aPlugin) {
-	
-		// Are we a doc plugin?
-		if (testDirectory(aPlugin, REQUIRED_PLUGIN_FILES, ".zip")) {
-			return true;
-		}
-		
-		// Are we a feature plugin?
-		if (testDirectory(aPlugin, REQUIRED_FEATURE_PLUGIN_FILES, REQUIRED_FEATURE_PLUGIN_SUFFIX)) {
-			return true;
-		}
-	
-		// Are we a regular plugin
-		if (testDirectory(aPlugin, REQUIRED_PLUGIN_FILES, REQUIRED_PLUGIN_SUFFIX)) {
-			return true;
-		}
-		
-		// Are we a source plugin
-		if (testSourcePlugin(aPlugin)) {
-			return true;
-		}
-		
-		// Are we a fragment
-		if (testDirectory(aPlugin, REQUIRED_FRAGMENT_FILES, REQUIRED_FRAGMENT_SUFFIX)) {
-			return true;
-		}
-		
-		// No then we are bad
-		return false;
-	}
-	
-	private boolean testDirectory(File aDirectory, String[] requiredFiles, String requiredSuffix) {
-		if (!Arrays.asList(aDirectory.list()).containsAll(Arrays.asList(requiredFiles))) {
-			return false;
-		}
-		
-		int index = aDirectory.getName().indexOf('_');
-		if (index == -1) {
-			index = aDirectory.getName().length();
-		}
-		
-		String plainName = aDirectory.getName().substring(0, index);
-		
-		if (requiredSuffix.equals("") || Arrays.asList(SUFFIX_EXEMPT_LIST).contains(plainName)) {
-			return true;
-		} else if (aDirectory.listFiles(new FileSuffixFilter(requiredSuffix)).length == 0) {
-			return false;
-		}
-		
-		return true;
-	}
-
-	/**
-	 * Return true if the receiver is a source plugin, false otherwise
-	 * A separate method because this is a little tricky.
-	 * @param aPlugin
-	 * @return boolean
-	 */
-	private boolean testSourcePlugin(File aPlugin) {
-		if (!testDirectory(aPlugin, REQUIRED_PLUGIN_FILES, "")) {
-			return false;
-		}
-		
-		File sourceDir = new File(aPlugin, "src");
-		File[] sourceDirs = sourceDir.listFiles();
-		if (sourceDirs == null) {
-			return false;
-		}
-		
-		for (int i = 0; i < sourceDirs.length; i++) {
-			File aSourceDir = sourceDirs[i];
-			if (!testDirectory(aSourceDir, REQUIRED_SOURCE_FILES, REQUIRED_SOURCE_SUFFIX)) {
-				return false;
-			}
-		}
-		return true;
-	}	
-	
-}
diff --git a/bundles/org.eclipse.releng.tests/src/org/eclipse/releng/tests/FileTool.java b/bundles/org.eclipse.releng.tests/src/org/eclipse/releng/tests/FileTool.java
deleted file mode 100644
index 6b70152..0000000
--- a/bundles/org.eclipse.releng.tests/src/org/eclipse/releng/tests/FileTool.java
+++ /dev/null
@@ -1,507 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.releng.tests;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.StringTokenizer;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-import java.util.zip.ZipOutputStream;
-
-
-/**
- * A tool for performing operations on files.
- */
-public class FileTool {
-	/**
-	 * A zip filter which is used to filter out unwanted entries
-	 * while extracting a zip file.
-	 * 
-	 * @see FileTool#unzip(IZipFilter, ZipFile, File, Log)
-	 */
-	public interface IZipFilter {
-		/**
-		 * Returns a boolean indicating whether the entry with the
-		 * specified name should be extracted from the zip file.
-		 * 
-		 * @param fullEntryName the full entry name; includes full
-		 * path segments for nested zip entries
-		 * @param entryName the partial entry name; only includes
-		 * path segments from the currect zip entry
-		 * @param depth a number greater than or equal to zero
-		 * which specifies the depth of the current nested zip
-		 * entry
-		 * @return a boolean indicating whether the entry with the
-		 * specified name should be extracted from the zip file
-		 */
-		public boolean shouldExtract(String fullEntryName, String entryName, int depth);
-		/**
-		 * Returns a boolean indicating whether the entry (which
-		 * is a zip/jar file) with the specified name should be
-		 * extracted from the zip file and then unzipped.
-		 * 
-		 * @param fullEntryName the full entry name; includes full
-		 * path segments for nested zip entries
-		 * @param entryName the partial entry name; only includes
-		 * path segments from the currect zip entry
-		 * @param depth a number greater than or equal to zero
-		 * which specifies the depth of the current nested zip
-		 * entry
-		 * @return a boolean indicating whether the entry (which
-		 * is a zip/jar file) with the specified name should be
-		 * extracted from the zip file and then unzipped
-		 */
-		public boolean shouldUnzip(String fullEntryName, String entryName, int depth);
-	}
-	/**
-	 * A buffer.
-	 */
-	private static byte[] buffer = new byte[8192];
-	/**
-	 * Returns the given file path with its separator
-	 * character changed from the given old separator to the
-	 * given new separator.
-	 * 
-	 * @param path a file path
-	 * @param oldSeparator a path separator character
-	 * @param newSeparator a path separator character
-	 * @return the file path with its separator character
-	 * changed from the given old separator to the given new
-	 * separator
-	 */
-	public static String changeSeparator(String path, char oldSeparator, char newSeparator){
-		return path.replace(oldSeparator, newSeparator);
-	}
-	/**
-	 * Returns a boolean indicating whether the given files
-	 * have the same content.
-	 * 
-	 * @param file1 the first file
-	 * @param file2 the second file
-	 * @return a boolean indicating whether the given files
-	 * have the same content
-	 */
-	public static boolean compare(File file1, File file2) throws IOException {
-		if(file1.length() != file2.length()){
-			return false;
-		}
-		InputStream is1 = null;
-		InputStream is2 = null;
-		try {
-			is1 = new BufferedInputStream(new FileInputStream(file1));
-			is2 = new BufferedInputStream(new FileInputStream(file2));
-			int a = 0;
-			int b = 0;
-			boolean same = true;
-			while(same && a != -1 && b != -1){
-				a = is1.read();
-				b = is2.read();
-				same = a == b;
-			}
-			return same;
-		} finally {
-			if(is2 != null){
-				try {
-					is2.close();
-				} catch(IOException e){
-				}
-			}
-			if(is1 != null){
-				try {
-					is1.close();
-				} catch(IOException e){
-				}
-			}
-		}
-	}
-	/**
-	 * Copies the given source file to the given destination file.
-	 * 
-	 * @param src the given source file
-	 * @param dst the given destination file
-	 */
-	public static void copy(File src, File dst) throws IOException {
-		copy(src.getParentFile(), src, dst);
-	}
-	/**
-	 * Copies the given source file to the given destination file.
-	 * 
-	 * @param root
-	 * @param src the given source file
-	 * @param dst the given destination file
-	 */
-	public static void copy(File root, File src, File dst) throws IOException {
-		if(src.isDirectory()){
-			String[] children = src.list();
-			for(int i = 0; i < children.length; ++i){
-				File child = new File(src, children[i]);
-				copy(root, child, dst);
-			}
-		} else {
-			String rootString = root.toString();
-			String srcString = src.toString();
-			File dstFile = new File(dst, srcString.substring(rootString.length() + 1));
-			transferData(src, dstFile);
-		}
-	}
-	/**
-	 * Delete the given file or directory. Directories are
-	 * deleted recursively. If the file or directory can
-	 * not be deleted, a warning message is written to
-	 * stdout.
-	 * 
-	 * @param file a file or directory
-	 */
-	public static void delete(File file) {
-		if(file.exists()){
-			if(file.isDirectory()){
-				String[] children = file.list();
-				for(int i = 0; i < children.length; ++i) {
-					File child = new File(file, children[i]);
-					delete(child);
-				}
-			}
-			if(!file.delete()){
-				System.out.println("WARNING: could not delete " + file);
-			}
-				
-		}
-	}
-	/**
-	 * Returns a new <code>File</code> from the given path
-	 * name segments.
-	 * 
-	 * @param segments the given path name segments
-	 * @return a new <code>File</code> from the given path
-	 * name segments
-	 */
-	public static File getFile(String[] segments) {
-		File result = new File(segments[0]);
-		for(int i = 1; i < segments.length; ++i){
-			result = new File(result, segments[i]);
-		}
-		return result;
-	}
-	/**
-	 * Returns a list of all files below the given directory
-	 * that end with a string in the given include list and
-	 * do not end with a string in the given exclude list.
-	 * If include is <code>null</code> all files are included
-	 * except those that are explicitly excluded. If exclude
-	 * is <code>null</code> no files are excluded except those
-	 * that are not included.
-	 * 
-	 * @param dir the given directory
-	 * @param include a list of filenames to include
-	 * @param exclude a list of filenames to exclude
-	 * @return a list of all files below the given directory
-	 * that are included and not explicitly excluded
-	 */
-	public static File[] getFiles(File dir, String[] include, String[] exclude) {
-		List list = new ArrayList();
-		String[] children = dir.list();
-		if(children == null){
-			return new File[0];
-		}
-		for(int i = 0; i < children.length; ++i){
-			File child = new File(dir, children[i]);
-			String name = child.getName();
-			if(child.isDirectory()){
-				File[] result = getFiles(child, include, exclude);
-				for(int j = 0; j < result.length; ++j){
-					list.add(result[j]);
-				}
-			} else {
-				boolean includeFile = include == null;
-				if(include != null){
-					for(int j = 0; j < include.length; ++j){
-						if(name.endsWith(include[j])){
-							includeFile = true;
-							break;
-						}
-					}
-				}
-				boolean excludeFile = exclude != null;
-				if(exclude != null){
-					for(int j = 0; j < exclude.length; ++j){
-						if(name.endsWith(exclude[j])){
-							excludeFile = true;
-							break;
-						}
-					}
-				}
-				if(includeFile && !excludeFile){
-					list.add(child);
-				}
-			}
-		}
-		return (File[])list.toArray(new File[0]);
-	}
-	/**
-	 * Breaks the given file into its path name segments
-	 * and returns the result.
-	 * 
-	 * @param file a file or directory
-	 * @return the path name segments of the given file
-	 */
-	public static String[] getSegments(File file) {
-		return getSegments(file.toString(), File.separatorChar);
-	}
-	/**
-	 * Breaks the given string into segments and returns the
-	 * result.
-	 * 
-	 * @param s a string
-	 * @param separator the segment separator
-	 * @return the segments of the given string
-	 */
-	public static String[] getSegments(String s, char separator){
-		List result = new ArrayList();
-		StringTokenizer tokenizer = new StringTokenizer(s, "" + separator);
-		while(tokenizer.hasMoreTokens()){
-			result.add(tokenizer.nextToken());
-		}
-		return (String[])result.toArray(new String[0]);
-	}
-	/**
-	 * Returns a vector of <code>File</code> paths parsed from
-	 * the given paths string.
-	 * 
-	 * @param paths a paths string
-	 * @return a vector of <code>File</code> paths parsed from
-	 * the given paths string
-	 */
-	public static File[] parsePaths(String paths){
-		List result = new ArrayList();
-		StringTokenizer tokenizer = new StringTokenizer(paths, ";");
-		while(tokenizer.hasMoreTokens()){
-			result.add(new File(tokenizer.nextToken()));
-		}
-		return (File[])result.toArray(new File[0]);
-	}
-	/**
-	 * Copies all bytes in the given source file to
-	 * the given destination file.
-	 * 
-	 * @param source the given source file
-	 * @param destination the given destination file
-	 */
-	public static void transferData(File source, File destination) throws IOException {
-		destination.getParentFile().mkdirs();
-		InputStream is = null;
-		OutputStream os = null;
-		try {
-			is = new FileInputStream(source);
-			os = new FileOutputStream(destination);
-			transferData(is, os);
-		} finally {
-			if(os != null){
-				try {
-					os.close();
-				} catch(IOException e){
-				}
-			}
-			if(is != null){
-				try {
-					is.close();
-				} catch(IOException e){
-				}
-			}
-		}
-	}
-	/**
-	 * Copies all bytes in the given source stream to
-	 * the given destination stream. Neither streams
-	 * are closed.
-	 * 
-	 * @param source the given source stream
-	 * @param destination the given destination stream
-	 */
-	public static void transferData(InputStream source, OutputStream destination) throws IOException {
-		int bytesRead = 0;
-		while(bytesRead != -1){
-			bytesRead = source.read(buffer, 0, buffer.length);
-			if(bytesRead != -1){
-				destination.write(buffer, 0, bytesRead);
-			}
-		}
-	}
-	/**
-	 * Unzips the given zip file to the given destination directory
-	 * extracting only those entries the pass through the given
-	 * filter.
-	 * 
-	 * @param filter filters out unwanted zip entries
-	 * @param zipFile the zip file to unzip
-	 * @param dstDir the destination directory
-	 */
-	public static void unzip(IZipFilter filter, ZipFile zipFile, File dstDir) throws IOException {
-		unzip(filter, zipFile, dstDir, dstDir, 0);
-	}
-	
-	private static void unzip(IZipFilter filter, ZipFile zipFile, File rootDstDir, File dstDir, int depth) throws IOException {
-	
-		Enumeration entries = zipFile.entries();
-	
-		try {
-			while(entries.hasMoreElements()){
-				ZipEntry entry = (ZipEntry)entries.nextElement();
-				if(entry.isDirectory()){
-					continue;
-				}
-				String entryName = entry.getName();
-				File file = new File(dstDir, FileTool.changeSeparator(entryName, '/', File.separatorChar));
-				String fullEntryName = FileTool.changeSeparator(file.toString().substring(rootDstDir.toString().length() + 1), File.separatorChar, '/');
-				if(!(filter == null || filter.shouldExtract(fullEntryName, entryName, depth))){
-					continue;
-				}
-				file.getParentFile().mkdirs();
-				InputStream src = null;
-				OutputStream dst = null;
-				try {
-					src = zipFile.getInputStream(entry);
-					dst = new FileOutputStream(file);
-					transferData(src, dst);
-				} finally {
-					if(dst != null){
-						try {
-							dst.close();
-						} catch(IOException e){
-						}
-					}
-					if(src != null){
-						try {
-							src.close();
-						} catch(IOException e){
-						}
-					}
-				}
-				if((entryName.endsWith(".zip") || entryName.endsWith(".jar")) && (filter == null || filter.shouldUnzip(fullEntryName, entryName, depth))) {
-					String fileName = file.getName();
-					String dirName = fileName.substring(0, fileName.length() - 4) + "_" + fileName.substring(fileName.length() - 3);
-					ZipFile innerZipFile = null;
-					try {
-						innerZipFile = new ZipFile(file);
-						File innerDstDir = new File(file.getParentFile(), dirName);
-						unzip(filter, innerZipFile, rootDstDir, innerDstDir, depth + 1);
-						file.delete();
-					} catch (IOException e) {
-						if(innerZipFile != null){
-							try {
-								innerZipFile.close();
-							} catch(IOException e2){
-							}
-						}
-						System.out.println("Could not unzip: " + fileName + ". InnerZip = " + innerZipFile.getName() + ". Lenght: " + innerZipFile.getName().length());
-						e.printStackTrace();
-					}
-				
-				}
-			}
-		} finally {
-			try {
-				zipFile.close();
-			} catch(IOException e){
-			}
-		}
-	}
-	/**
-	 * Zips the given directory to the given zip file.
-	 * Directories are zipped recursively. Inner zip files are
-	 * created for directories that end with "_zip" or "_jar".
-	 * If verbose is true, progress information is logged.
-	 * 
-	 * @param dir the directory to zip
-	 * @param zipFile the resulting zip file
-	 * @param verbose a boolean indicating whether progress
-	 * information is logged
-	 */
-	public static void zip(File dir, File zipFile) throws IOException {
-		BufferedOutputStream bos = null;
-		ZipOutputStream zos = null;
-		try {
-			bos = new BufferedOutputStream(new FileOutputStream(zipFile));
-			zos = new ZipOutputStream(bos);
-			zip(dir, dir, zos);
-		} finally {
-			if(zos == null){
-				if(bos != null){
-					try {
-						bos.close();
-					} catch(IOException e){
-					}
-				}
-			} else {
-				try {
-					zos.close();
-				} catch(IOException e){
-				}
-			}
-		}
-	}
-	private static void zip(File root, File file, ZipOutputStream zos) throws IOException {
-		if(file.isDirectory()){
-			String name = file.getName();
-			if(name.endsWith("_zip") || name.endsWith("_jar")){
-				String rootString = root.toString();
-				String fileString = file.toString();
-				String zipEntryName = fileString.substring(rootString.length() + 1);
-				int underscoreIndex = zipEntryName.lastIndexOf("_");
-				zipEntryName = zipEntryName.substring(0, underscoreIndex) + "." + zipEntryName.substring(underscoreIndex + 1);
-				ZipEntry zipEntry = new ZipEntry(changeSeparator(zipEntryName, File.separatorChar, '/'));
-				zos.putNextEntry(zipEntry);
-				ZipOutputStream zos2 = new ZipOutputStream(zos);
-				String[] list = file.list();
-				for(int i = 0; i < list.length; ++i){
-					File item = new File(file, list[i]);
-					zip(file, item, zos2);
-				}
-				zos2.finish();
-				zos.closeEntry();
-			} else {
-				String[] list = file.list();
-				for(int i = 0; i < list.length; ++i){
-					File item = new File(file, list[i]);
-					zip(root, item, zos);
-				}
-			}
-		} else {
-			String rootString = root.toString();
-			String fileString = file.toString();
-			String zipEntryName = fileString.substring(rootString.length() + 1);
-			ZipEntry zipEntry = new ZipEntry(changeSeparator(zipEntryName, File.separatorChar, '/'));
-			zos.putNextEntry(zipEntry);
-			FileInputStream fos = null;
-			try {
-				fos = new FileInputStream(file);
-				transferData(fos, zos);
-			} finally {
-				if(fos != null){
-					try {
-						fos.close();
-					} catch(IOException e){
-					}
-				}
-			}
-			zos.closeEntry();
-		}
-	}
-}
diff --git a/bundles/org.eclipse.releng.tests/test.xml b/bundles/org.eclipse.releng.tests/test.xml
deleted file mode 100644
index b317d31..0000000
--- a/bundles/org.eclipse.releng.tests/test.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0"?>
-<project name="RelEng Automated Tests" default="run" basedir=".">
-
-  <!-- The property ${eclipse-home} should be passed into this script -->
-  <!-- sets the properties eclipse-home, and library-file -->
-  <property name="eclipse-home" value="${basedir}/../../"/>
-  <property name="library-file" value="${eclipse-home}/plugins/org.eclipse.test/library.xml"/>
-  <property name="location" value="/builds/t"/>
-
-  <!-- This target holds all initialization code that needs to be done for -->
-  <!-- all tests that are to be run. Initialization for individual tests -->
-  <!-- should be done within the body of the suite target. -->
-  <target name="init">
-    <tstamp/>
-  </target>
-
-  <!-- This target holds code to cleanup the testing environment after the tests -->
-  <!-- have been run. You can use this to delete temporary files that are created. -->
-  <target name="cleanup">
-    <delete dir="${location}" quiet="true"/>
-  </target>
-
-  <!-- This target runs the test suite. Any actions that need to happen after all -->
-  <!-- the tests have been run should go here. -->
-  <target name="run" depends="init,suite,cleanup">
-    <ant target="collect" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="includes" value="org*.xml"/>
-      <property name="output-file" value="org.eclipse.releng.tests.xml"/>
-    </ant>
-  </target>
-
-  <target name="BuildTests" depends="init,cleanup">
-    <ant target="core-test" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="data-dir" value="${location}"/>
-      <property name="plugin-name" value="org.eclipse.releng.tests"/>
-      <property name="classname" value="org.eclipse.releng.tests.BuildTests"/>
-    </ant>
-  </target>
-
-  <!-- This target defines the tests that need to be run. -->
-  <target name="suite" depends="BuildTests"/>
- </project>
\ No newline at end of file
diff --git a/bundles/org.eclipse.sdk.examples/.project b/bundles/org.eclipse.sdk.examples/.project
deleted file mode 100644
index 705c8dd..0000000
--- a/bundles/org.eclipse.sdk.examples/.project
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.sdk.examples</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-	</buildSpec>
-	<natures>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.sdk.examples/about.html b/bundles/org.eclipse.sdk.examples/about.html
deleted file mode 100644
index 9db411a..0000000
--- a/bundles/org.eclipse.sdk.examples/about.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>20th June, 2002</p>	
-<h3>License</h3>
-<p>Eclipse.org makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Common Public License Version 1.0 (&quot;CPL&quot;).  A copy of the CPL is available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>.
-For purposes of the CPL, &quot;Program&quot; will mean the Content.</p>
-
-<h3>Contributions</h3>
-
-<p>If this Content is licensed to you under the terms and conditions of the CPL, any Contributions, as defined in the CPL, uploaded, submitted, or otherwise
-made available to Eclipse.org, members of Eclipse.org and/or the host of Eclipse.org web site, by you that relate to such
-Content are provided under the terms and conditions of the CPL and can be made available to others under the terms of the CPL.</p>
-
-<p>If this Content is licensed to you under license terms and conditions other than the CPL (&quot;Other License&quot;), any modifications, enhancements and/or
-other code and/or documentation (&quot;Modifications&quot;) uploaded, submitted, or otherwise made available to Eclipse.org, members of Eclipse.org and/or the
-host of Eclipse.org, by you that relate to such Content are provided under terms and conditions of the Other License and can be made available
-to others under the terms of the Other License.  In addition, with regard to Modifications for which you are the copyright holder, you are also
-providing the Modifications under the terms and conditions of the CPL and such Modifications can be made available to others under the terms of
-the CPL.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.sdk.examples/about.ini b/bundles/org.eclipse.sdk.examples/about.ini
deleted file mode 100644
index 2dee36a..0000000
--- a/bundles/org.eclipse.sdk.examples/about.ini
+++ /dev/null
@@ -1,31 +0,0 @@
-# about.ini
-# contains information about a feature
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# "%key" are externalized strings defined in about.properties
-# This file does not need to be translated.
-
-# Property "aboutText" contains blurb for "About" dialog (translated)
-aboutText=%blurb
-
-# Property "windowImage" contains path to window icon (16x16)
-# needed for primary features only
-
-# Property "featureImage" contains path to feature image (32x32)
-featureImage=eclipse32.gif
-
-# Property "aboutImage" contains path to product image (500x330 or 115x164)
-# needed for primary features only
-
-# Property "appName" contains name of the application (not translated)
-# needed for primary features only
-
-# Property "welcomePage" contains path to welcome page (special XML-based format)
-# optional
-
-# Property "welcomePerspective" contains the id of the perspective in which the
-# welcome page is to be opened.
-# optional
-
-
-
-
diff --git a/bundles/org.eclipse.sdk.examples/about.mappings b/bundles/org.eclipse.sdk.examples/about.mappings
deleted file mode 100644
index bddaab4..0000000
--- a/bundles/org.eclipse.sdk.examples/about.mappings
+++ /dev/null
@@ -1,6 +0,0 @@
-# about.mappings
-# contains fill-ins for about.properties
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file does not need to be translated.
-
-0=@build@
\ No newline at end of file
diff --git a/bundles/org.eclipse.sdk.examples/about.properties b/bundles/org.eclipse.sdk.examples/about.properties
deleted file mode 100644
index 9b05951..0000000
--- a/bundles/org.eclipse.sdk.examples/about.properties
+++ /dev/null
@@ -1,26 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2003 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials 
-# are made available under the terms of the Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-
-blurb=Eclipse SDK Examples\n\
-\n\
-Version: {featureVersion}\n\
-Build id: {0}\n\
-\n\
-(c) Copyright IBM Corp. and others 2000, 2003.  All rights reserved.\n\
-Visit http://www.eclipse.org/eclipse
-
diff --git a/bundles/org.eclipse.sdk.examples/build.properties b/bundles/org.eclipse.sdk.examples/build.properties
deleted file mode 100644
index cc6797e..0000000
--- a/bundles/org.eclipse.sdk.examples/build.properties
+++ /dev/null
@@ -1,25 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2003 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials 
-# are made available under the terms of the Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes=\
-about.html,\
-about.ini,\
-about.mappings,\
-about.properties,\
-eclipse32.gif,\
-plugin.xml,\
-plugin.properties
-
-# note: the following files are intentionally not listed in bin.includes
-#    cpl-v10.html
-#    notice.html
-# these files need to end up as root files in <install>/eclipse/
-
-
diff --git a/bundles/org.eclipse.sdk.examples/cpl-v10.html b/bundles/org.eclipse.sdk.examples/cpl-v10.html
deleted file mode 100644
index 36aa208..0000000
--- a/bundles/org.eclipse.sdk.examples/cpl-v10.html
+++ /dev/null
@@ -1,125 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<HTML>
-<HEAD>
-<TITLE>Common Public License - v 1.0</TITLE>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-</HEAD>
-
-<BODY BGCOLOR="#FFFFFF" VLINK="#800000">
-
-
-<P ALIGN="CENTER"><B>Common Public License - v 1.0</B>
-<P><B></B><FONT SIZE="3"></FONT>
-<P><FONT SIZE="3"></FONT><FONT SIZE="2">THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT").  ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.</FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"><B>1.  DEFINITIONS</B></FONT>
-<P><FONT SIZE="2">"Contribution" means:</FONT>
-
-<UL><FONT SIZE="2">a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and<BR CLEAR="LEFT">
-b) in the case of each subsequent Contributor:</FONT></UL>
-
-
-<UL><FONT SIZE="2">i)	 	changes to the Program, and</FONT></UL>
-
-
-<UL><FONT SIZE="2">ii)		additions to the Program;</FONT></UL>
-
-
-<UL><FONT SIZE="2">where such changes and/or additions to the Program originate from and are distributed by that particular Contributor.  </FONT><FONT SIZE="2">A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf.  </FONT><FONT SIZE="2">Contributions do not include additions to the Program which:  (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.  </FONT></UL>
-
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">"Contributor" means any person or entity that distributes the Program.</FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.  </FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2">"Program" means the Contributions distributed in accordance with this Agreement.</FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.</FONT>
-<P><FONT SIZE="2"><B></B></FONT>
-<P><FONT SIZE="2"><B>2.  GRANT OF RIGHTS</B></FONT>
-
-<UL><FONT SIZE="2"></FONT><FONT SIZE="2">a)	</FONT><FONT SIZE="2">Subject to the terms of this Agreement, each Contributor hereby grants</FONT><FONT SIZE="2"> Recipient a non-exclusive, worldwide, royalty-free copyright license to</FONT><FONT SIZE="2" COLOR="#FF0000"> </FONT><FONT SIZE="2">reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.</FONT></UL>
-
-
-<UL><FONT SIZE="2"></FONT></UL>
-
-
-<UL><FONT SIZE="2"></FONT><FONT SIZE="2">b) 	Subject to the terms of this Agreement, each Contributor hereby grants </FONT><FONT SIZE="2">Recipient a non-exclusive, worldwide,</FONT><FONT SIZE="2" COLOR="#008000"> </FONT><FONT SIZE="2">royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form.  This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents.  The patent license shall not apply to any other combinations which include the Contribution.  No hardware per se is licensed hereunder.   </FONT></UL>
-
-
-<UL><FONT SIZE="2"></FONT></UL>
-
-
-<UL><FONT SIZE="2">c)	Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity.  Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise.  As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any.  For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.</FONT></UL>
-
-
-<UL><FONT SIZE="2"></FONT></UL>
-
-
-<UL><FONT SIZE="2">d)	Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. </FONT></UL>
-
-
-<UL><FONT SIZE="2"></FONT></UL>
-
-<P><FONT SIZE="2"><B>3.  REQUIREMENTS</B></FONT>
-<P><FONT SIZE="2"><B></B>A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:</FONT>
-
-<UL><FONT SIZE="2">a)	it complies with the terms and conditions of this Agreement; and</FONT></UL>
-
-
-<UL><FONT SIZE="2">b)	its license agreement:</FONT></UL>
-
-
-<UL><FONT SIZE="2">i)	effectively disclaims</FONT><FONT SIZE="2"> on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; </FONT></UL>
-
-
-<UL><FONT SIZE="2">ii) 	effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; </FONT></UL>
-
-
-<UL><FONT SIZE="2">iii)</FONT><FONT SIZE="2">	states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and</FONT></UL>
-
-
-<UL><FONT SIZE="2">iv)	states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.</FONT><FONT SIZE="2" COLOR="#0000FF"> </FONT><FONT SIZE="2" COLOR="#FF0000"></FONT></UL>
-
-
-<UL><FONT SIZE="2" COLOR="#FF0000"></FONT><FONT SIZE="2"></FONT></UL>
-
-<P><FONT SIZE="2">When the Program is made available in source code form:</FONT>
-
-<UL><FONT SIZE="2">a)	it must be made available under this Agreement; and </FONT></UL>
-
-
-<UL><FONT SIZE="2">b)	a copy of this Agreement must be included with each copy of the Program.  </FONT></UL>
-
-<P><FONT SIZE="2"></FONT><FONT SIZE="2" COLOR="#0000FF"><STRIKE></STRIKE></FONT>
-<P><FONT SIZE="2" COLOR="#0000FF"><STRIKE></STRIKE></FONT><FONT SIZE="2">Contributors may not remove or alter any copyright notices contained within the Program.  </FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.  </FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"><B>4.  COMMERCIAL DISTRIBUTION</B></FONT>
-<P><FONT SIZE="2">Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like.  While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors.   Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering.  The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement.  In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations.  The Indemnified Contributor may participate in any such claim at its own expense.</FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">For example, a Contributor might include the Program in a commercial product offering, Product X.  That Contributor is then a Commercial Contributor.  If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone.  Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.</FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2" COLOR="#0000FF"></FONT>
-<P><FONT SIZE="2" COLOR="#0000FF"></FONT><FONT SIZE="2"><B>5.  NO WARRANTY</B></FONT>
-<P><FONT SIZE="2">EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is</FONT><FONT SIZE="2"> solely responsible for determining the appropriateness of using and distributing </FONT><FONT SIZE="2">the Program</FONT><FONT SIZE="2"> and assumes all risks associated with its exercise of rights under this Agreement</FONT><FONT SIZE="2">, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, </FONT><FONT SIZE="2">programs or equipment, and unavailability or interruption of operations</FONT><FONT SIZE="2">.  </FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2"><B>6.  DISCLAIMER OF LIABILITY</B></FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2">EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES </FONT><FONT SIZE="2">(INCLUDING WITHOUT LIMITATION LOST PROFITS),</FONT><FONT SIZE="2"> HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"><B>7.  GENERAL</B></FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2">If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.</FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed.  In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. </FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance.  If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable.  However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.  </FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2">Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted  and may only be modified in the following manner. The Agreement Steward reserves the right to </FONT><FONT SIZE="2">publish new versions (including revisions) of this Agreement from time to </FONT><FONT SIZE="2">time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward.   IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity.  </FONT><FONT SIZE="2">Each new version of the Agreement will be given a distinguishing version number.  The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new </FONT><FONT SIZE="2">version.  </FONT><FONT SIZE="2">Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, </FONT><FONT SIZE="2">by implication, estoppel or otherwise</FONT><FONT SIZE="2">.</FONT><FONT SIZE="2">  All rights in the Program not expressly granted under this Agreement are reserved.</FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose.  Each party waives its rights to a jury trial in any resulting litigation.</FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT>
-
-</BODY>
-
-</HTML>
\ No newline at end of file
diff --git a/bundles/org.eclipse.sdk.examples/eclipse32.gif b/bundles/org.eclipse.sdk.examples/eclipse32.gif
deleted file mode 100644
index f71a8f6..0000000
--- a/bundles/org.eclipse.sdk.examples/eclipse32.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.sdk.examples/notice.html b/bundles/org.eclipse.sdk.examples/notice.html
deleted file mode 100644
index 00d784b..0000000
--- a/bundles/org.eclipse.sdk.examples/notice.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-<title>Eclipse.org Software User Agreement</title>
-</head>
-
-<body lang="EN-US" link=blue vlink=purple>
-<h2>Eclipse.org Software User Agreement</h2>
-<p>17th June, 2002</p>
-
-<p>ECLIPSE.ORG MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-
-<p>Unless otherwise indicated, all Content made available by Eclipse.org is provided to you under the terms and conditions of the Common Public License Version 1.0
-   (&quot;CPL&quot;).  A copy of the CPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>.
-   For purposes of the CPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
-   modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-
-<p>Content may be apportioned into plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;). A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Files named &quot;feature.xml&quot; may contain a list of the names and version numbers of  the Plug-ins and/or Fragments associated with a Feature.   Plug-ins and Fragments are located in directories
-   named &quot;plugins&quot; and Features are located in directories named &quot;features&quot;.</p>
-  
-<p>Features may also include other Features (&quot;Included Features&quot;). Files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</p>
-  
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;). Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-	<li>The top-level (root) directory</li>
-	<li>Plug-in and Fragment directories</li>
-	<li>Subdirectories of the directory named &quot;src&quot; of certain Plug-ins</li>
-	<li>Feature directories</li>
-</ul>
-		
-<p>Note: if a Feature made available by Eclipse.org is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them. Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot;.
-Such Abouts, Feature Licenses and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.  The Abouts, Feature Licenses and Feature Update Licenses may refer to the CPL or other license agreements, notices or terms and conditions . It is your obligation to read and accept all such all terms and conditions prior to use of the Content.
-If no About, Feature License or Feature Update License is provided, please contact Eclipse.org to determine what terms and conditions govern that particular Content.</p>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.sdk.examples/plugin.properties b/bundles/org.eclipse.sdk.examples/plugin.properties
deleted file mode 100644
index e0b80bb..0000000
--- a/bundles/org.eclipse.sdk.examples/plugin.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2003 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials 
-# are made available under the terms of the Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-pluginName=Eclipse SDK Examples
-providerName=Eclipse.org
diff --git a/bundles/org.eclipse.sdk.examples/plugin.xml b/bundles/org.eclipse.sdk.examples/plugin.xml
deleted file mode 100644
index a7de99f..0000000
--- a/bundles/org.eclipse.sdk.examples/plugin.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin
-   name="%pluginName"
-   id="org.eclipse.sdk.examples"
-   version="2.1.1"
-   provider-name="%providerName">
-</plugin>
diff --git a/bundles/org.eclipse.sdk.tests/.project b/bundles/org.eclipse.sdk.tests/.project
deleted file mode 100644
index 72794b1..0000000
--- a/bundles/org.eclipse.sdk.tests/.project
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.sdk.tests</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-	</buildSpec>
-	<natures>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.sdk.tests/about.html b/bundles/org.eclipse.sdk.tests/about.html
deleted file mode 100644
index 9db411a..0000000
--- a/bundles/org.eclipse.sdk.tests/about.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>20th June, 2002</p>	
-<h3>License</h3>
-<p>Eclipse.org makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Common Public License Version 1.0 (&quot;CPL&quot;).  A copy of the CPL is available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>.
-For purposes of the CPL, &quot;Program&quot; will mean the Content.</p>
-
-<h3>Contributions</h3>
-
-<p>If this Content is licensed to you under the terms and conditions of the CPL, any Contributions, as defined in the CPL, uploaded, submitted, or otherwise
-made available to Eclipse.org, members of Eclipse.org and/or the host of Eclipse.org web site, by you that relate to such
-Content are provided under the terms and conditions of the CPL and can be made available to others under the terms of the CPL.</p>
-
-<p>If this Content is licensed to you under license terms and conditions other than the CPL (&quot;Other License&quot;), any modifications, enhancements and/or
-other code and/or documentation (&quot;Modifications&quot;) uploaded, submitted, or otherwise made available to Eclipse.org, members of Eclipse.org and/or the
-host of Eclipse.org, by you that relate to such Content are provided under terms and conditions of the Other License and can be made available
-to others under the terms of the Other License.  In addition, with regard to Modifications for which you are the copyright holder, you are also
-providing the Modifications under the terms and conditions of the CPL and such Modifications can be made available to others under the terms of
-the CPL.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.sdk.tests/about.ini b/bundles/org.eclipse.sdk.tests/about.ini
deleted file mode 100644
index dbd842f..0000000
--- a/bundles/org.eclipse.sdk.tests/about.ini
+++ /dev/null
@@ -1,27 +0,0 @@
-# about.ini
-# contains information about a feature
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# "%key" are externalized strings defined in about.properties
-# This file does not need to be translated.
-
-# Property "aboutText" contains blurb for "About" dialog (translated)
-aboutText=%blurb
-
-# Property "windowImage" contains path to window icon (16x16)
-# needed for primary features only
-
-# Property "featureImage" contains path to feature image (32x32)
-featureImage=eclipse32.gif
-
-# Property "aboutImage" contains path to product image (500x330 or 115x164)
-# needed for primary features only
-
-# Property "appName" contains name of the application (not translated)
-# needed for primary features only
-
-# Property "welcomePage" contains path to welcome page (special XML-based format)
-# optional
-
-# Property "welcomePerspective" contains the id of the perspective in which the
-# welcome page is to be opened.
-# optional
diff --git a/bundles/org.eclipse.sdk.tests/about.mappings b/bundles/org.eclipse.sdk.tests/about.mappings
deleted file mode 100644
index bddaab4..0000000
--- a/bundles/org.eclipse.sdk.tests/about.mappings
+++ /dev/null
@@ -1,6 +0,0 @@
-# about.mappings
-# contains fill-ins for about.properties
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file does not need to be translated.
-
-0=@build@
\ No newline at end of file
diff --git a/bundles/org.eclipse.sdk.tests/about.properties b/bundles/org.eclipse.sdk.tests/about.properties
deleted file mode 100644
index 5043b8f..0000000
--- a/bundles/org.eclipse.sdk.tests/about.properties
+++ /dev/null
@@ -1,26 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2003 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials 
-# are made available under the terms of the Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-
-blurb=Eclipse SDK Tests\n\
-\n\
-Version: {featureVersion}\n\
-Build id: {0}\n\
-\n\
-(c) Copyright IBM Corp. and others 2000, 2003.  All rights reserved.\n\
-Visit http://www.eclipse.org/eclipse
-
diff --git a/bundles/org.eclipse.sdk.tests/build.properties b/bundles/org.eclipse.sdk.tests/build.properties
deleted file mode 100644
index 4f23659..0000000
--- a/bundles/org.eclipse.sdk.tests/build.properties
+++ /dev/null
@@ -1,25 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2003 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials 
-# are made available under the terms of the Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes=\
-about.html,\
-about.ini,\
-about.mappings,\
-about.properties,\
-eclipse32.gif,\
-plugin.xml,\
-plugin.properties
-
-
-# note: the following files are intentionally not listed in bin.includes
-#    cpl-v10.html
-#    notice.html
-# these files need to end up as root files in <install>/eclipse/
-
diff --git a/bundles/org.eclipse.sdk.tests/cpl-v10.html b/bundles/org.eclipse.sdk.tests/cpl-v10.html
deleted file mode 100644
index 36aa208..0000000
--- a/bundles/org.eclipse.sdk.tests/cpl-v10.html
+++ /dev/null
@@ -1,125 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<HTML>
-<HEAD>
-<TITLE>Common Public License - v 1.0</TITLE>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-</HEAD>
-
-<BODY BGCOLOR="#FFFFFF" VLINK="#800000">
-
-
-<P ALIGN="CENTER"><B>Common Public License - v 1.0</B>
-<P><B></B><FONT SIZE="3"></FONT>
-<P><FONT SIZE="3"></FONT><FONT SIZE="2">THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT").  ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.</FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"><B>1.  DEFINITIONS</B></FONT>
-<P><FONT SIZE="2">"Contribution" means:</FONT>
-
-<UL><FONT SIZE="2">a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and<BR CLEAR="LEFT">
-b) in the case of each subsequent Contributor:</FONT></UL>
-
-
-<UL><FONT SIZE="2">i)	 	changes to the Program, and</FONT></UL>
-
-
-<UL><FONT SIZE="2">ii)		additions to the Program;</FONT></UL>
-
-
-<UL><FONT SIZE="2">where such changes and/or additions to the Program originate from and are distributed by that particular Contributor.  </FONT><FONT SIZE="2">A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf.  </FONT><FONT SIZE="2">Contributions do not include additions to the Program which:  (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.  </FONT></UL>
-
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">"Contributor" means any person or entity that distributes the Program.</FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.  </FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2">"Program" means the Contributions distributed in accordance with this Agreement.</FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.</FONT>
-<P><FONT SIZE="2"><B></B></FONT>
-<P><FONT SIZE="2"><B>2.  GRANT OF RIGHTS</B></FONT>
-
-<UL><FONT SIZE="2"></FONT><FONT SIZE="2">a)	</FONT><FONT SIZE="2">Subject to the terms of this Agreement, each Contributor hereby grants</FONT><FONT SIZE="2"> Recipient a non-exclusive, worldwide, royalty-free copyright license to</FONT><FONT SIZE="2" COLOR="#FF0000"> </FONT><FONT SIZE="2">reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.</FONT></UL>
-
-
-<UL><FONT SIZE="2"></FONT></UL>
-
-
-<UL><FONT SIZE="2"></FONT><FONT SIZE="2">b) 	Subject to the terms of this Agreement, each Contributor hereby grants </FONT><FONT SIZE="2">Recipient a non-exclusive, worldwide,</FONT><FONT SIZE="2" COLOR="#008000"> </FONT><FONT SIZE="2">royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form.  This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents.  The patent license shall not apply to any other combinations which include the Contribution.  No hardware per se is licensed hereunder.   </FONT></UL>
-
-
-<UL><FONT SIZE="2"></FONT></UL>
-
-
-<UL><FONT SIZE="2">c)	Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity.  Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise.  As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any.  For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.</FONT></UL>
-
-
-<UL><FONT SIZE="2"></FONT></UL>
-
-
-<UL><FONT SIZE="2">d)	Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. </FONT></UL>
-
-
-<UL><FONT SIZE="2"></FONT></UL>
-
-<P><FONT SIZE="2"><B>3.  REQUIREMENTS</B></FONT>
-<P><FONT SIZE="2"><B></B>A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:</FONT>
-
-<UL><FONT SIZE="2">a)	it complies with the terms and conditions of this Agreement; and</FONT></UL>
-
-
-<UL><FONT SIZE="2">b)	its license agreement:</FONT></UL>
-
-
-<UL><FONT SIZE="2">i)	effectively disclaims</FONT><FONT SIZE="2"> on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; </FONT></UL>
-
-
-<UL><FONT SIZE="2">ii) 	effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; </FONT></UL>
-
-
-<UL><FONT SIZE="2">iii)</FONT><FONT SIZE="2">	states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and</FONT></UL>
-
-
-<UL><FONT SIZE="2">iv)	states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.</FONT><FONT SIZE="2" COLOR="#0000FF"> </FONT><FONT SIZE="2" COLOR="#FF0000"></FONT></UL>
-
-
-<UL><FONT SIZE="2" COLOR="#FF0000"></FONT><FONT SIZE="2"></FONT></UL>
-
-<P><FONT SIZE="2">When the Program is made available in source code form:</FONT>
-
-<UL><FONT SIZE="2">a)	it must be made available under this Agreement; and </FONT></UL>
-
-
-<UL><FONT SIZE="2">b)	a copy of this Agreement must be included with each copy of the Program.  </FONT></UL>
-
-<P><FONT SIZE="2"></FONT><FONT SIZE="2" COLOR="#0000FF"><STRIKE></STRIKE></FONT>
-<P><FONT SIZE="2" COLOR="#0000FF"><STRIKE></STRIKE></FONT><FONT SIZE="2">Contributors may not remove or alter any copyright notices contained within the Program.  </FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.  </FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"><B>4.  COMMERCIAL DISTRIBUTION</B></FONT>
-<P><FONT SIZE="2">Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like.  While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors.   Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering.  The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement.  In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations.  The Indemnified Contributor may participate in any such claim at its own expense.</FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">For example, a Contributor might include the Program in a commercial product offering, Product X.  That Contributor is then a Commercial Contributor.  If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone.  Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.</FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2" COLOR="#0000FF"></FONT>
-<P><FONT SIZE="2" COLOR="#0000FF"></FONT><FONT SIZE="2"><B>5.  NO WARRANTY</B></FONT>
-<P><FONT SIZE="2">EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is</FONT><FONT SIZE="2"> solely responsible for determining the appropriateness of using and distributing </FONT><FONT SIZE="2">the Program</FONT><FONT SIZE="2"> and assumes all risks associated with its exercise of rights under this Agreement</FONT><FONT SIZE="2">, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, </FONT><FONT SIZE="2">programs or equipment, and unavailability or interruption of operations</FONT><FONT SIZE="2">.  </FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2"><B>6.  DISCLAIMER OF LIABILITY</B></FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2">EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES </FONT><FONT SIZE="2">(INCLUDING WITHOUT LIMITATION LOST PROFITS),</FONT><FONT SIZE="2"> HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"><B>7.  GENERAL</B></FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2">If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.</FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed.  In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. </FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance.  If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable.  However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.  </FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2">Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted  and may only be modified in the following manner. The Agreement Steward reserves the right to </FONT><FONT SIZE="2">publish new versions (including revisions) of this Agreement from time to </FONT><FONT SIZE="2">time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward.   IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity.  </FONT><FONT SIZE="2">Each new version of the Agreement will be given a distinguishing version number.  The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new </FONT><FONT SIZE="2">version.  </FONT><FONT SIZE="2">Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, </FONT><FONT SIZE="2">by implication, estoppel or otherwise</FONT><FONT SIZE="2">.</FONT><FONT SIZE="2">  All rights in the Program not expressly granted under this Agreement are reserved.</FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose.  Each party waives its rights to a jury trial in any resulting litigation.</FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT>
-
-</BODY>
-
-</HTML>
\ No newline at end of file
diff --git a/bundles/org.eclipse.sdk.tests/eclipse32.gif b/bundles/org.eclipse.sdk.tests/eclipse32.gif
deleted file mode 100644
index f71a8f6..0000000
--- a/bundles/org.eclipse.sdk.tests/eclipse32.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.sdk.tests/notice.html b/bundles/org.eclipse.sdk.tests/notice.html
deleted file mode 100644
index 00d784b..0000000
--- a/bundles/org.eclipse.sdk.tests/notice.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-<title>Eclipse.org Software User Agreement</title>
-</head>
-
-<body lang="EN-US" link=blue vlink=purple>
-<h2>Eclipse.org Software User Agreement</h2>
-<p>17th June, 2002</p>
-
-<p>ECLIPSE.ORG MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-
-<p>Unless otherwise indicated, all Content made available by Eclipse.org is provided to you under the terms and conditions of the Common Public License Version 1.0
-   (&quot;CPL&quot;).  A copy of the CPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>.
-   For purposes of the CPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
-   modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-
-<p>Content may be apportioned into plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;). A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Files named &quot;feature.xml&quot; may contain a list of the names and version numbers of  the Plug-ins and/or Fragments associated with a Feature.   Plug-ins and Fragments are located in directories
-   named &quot;plugins&quot; and Features are located in directories named &quot;features&quot;.</p>
-  
-<p>Features may also include other Features (&quot;Included Features&quot;). Files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</p>
-  
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;). Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-	<li>The top-level (root) directory</li>
-	<li>Plug-in and Fragment directories</li>
-	<li>Subdirectories of the directory named &quot;src&quot; of certain Plug-ins</li>
-	<li>Feature directories</li>
-</ul>
-		
-<p>Note: if a Feature made available by Eclipse.org is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them. Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot;.
-Such Abouts, Feature Licenses and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.  The Abouts, Feature Licenses and Feature Update Licenses may refer to the CPL or other license agreements, notices or terms and conditions . It is your obligation to read and accept all such all terms and conditions prior to use of the Content.
-If no About, Feature License or Feature Update License is provided, please contact Eclipse.org to determine what terms and conditions govern that particular Content.</p>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.sdk.tests/plugin.properties b/bundles/org.eclipse.sdk.tests/plugin.properties
deleted file mode 100644
index ab873cd..0000000
--- a/bundles/org.eclipse.sdk.tests/plugin.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2003 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials 
-# are made available under the terms of the Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-pluginName=Eclipse SDK Tests
-providerName=Eclipse.org
diff --git a/bundles/org.eclipse.sdk.tests/plugin.xml b/bundles/org.eclipse.sdk.tests/plugin.xml
deleted file mode 100644
index b4d91b6..0000000
--- a/bundles/org.eclipse.sdk.tests/plugin.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin
-   name="%pluginName"
-   id="org.eclipse.sdk.tests"
-   version="2.1.1"
-   provider-name="%providerName">
-</plugin>
diff --git a/bundles/org.eclipse.test/.classpath b/bundles/org.eclipse.test/.classpath
deleted file mode 100644
index ac357f8..0000000
--- a/bundles/org.eclipse.test/.classpath
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-    <classpathentry kind="src" path="src"/>
-    <classpathentry kind="src" path="/org.apache.ant"/>
-    <classpathentry kind="src" path="/org.apache.xerces"/>
-    <classpathentry kind="src" path="/org.junit"/>
-    <classpathentry kind="src" path="/org.eclipse.ant.core"/>
-    <classpathentry kind="src" path="/org.eclipse.core.boot"/>
-    <classpathentry kind="src" path="/org.eclipse.swt"/>
-    <classpathentry kind="src" path="/org.eclipse.ui.workbench"/>
-    <classpathentry kind="src" path="/org.eclipse.core.resources"/>
-    <classpathentry kind="src" path="/org.eclipse.update.core"/>
-    <classpathentry kind="src" path="/org.eclipse.help"/>
-    <classpathentry kind="src" path="/org.eclipse.jface"/>
-    <classpathentry kind="src" path="/org.eclipse.jface.text"/>
-    <classpathentry kind="src" path="/org.eclipse.core.runtime"/>
-    <classpathentry kind="var" path="JRE_LIB" rootpath="JRE_SRCROOT" sourcepath="JRE_SRC"/>
-    <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.test/.cvsignore b/bundles/org.eclipse.test/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/bundles/org.eclipse.test/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/bundles/org.eclipse.test/.project b/bundles/org.eclipse.test/.project
deleted file mode 100644
index 7e24f22..0000000
--- a/bundles/org.eclipse.test/.project
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.test</name>
-	<comment></comment>
-	<projects>
-		<project>org.apache.ant</project>
-		<project>org.apache.xerces</project>
-		<project>org.eclipse.ant.core</project>
-		<project>org.eclipse.core.boot</project>
-		<project>org.eclipse.core.resources</project>
-		<project>org.eclipse.core.runtime</project>
-		<project>org.eclipse.help</project>
-		<project>org.eclipse.jface</project>
-		<project>org.eclipse.jface.text</project>
-		<project>org.eclipse.swt</project>
-		<project>org.eclipse.ui.workbench</project>
-		<project>org.eclipse.update.core</project>
-		<project>org.junit</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.test/JUNIT.XSL b/bundles/org.eclipse.test/JUNIT.XSL
deleted file mode 100644
index a7dd9ab..0000000
--- a/bundles/org.eclipse.test/JUNIT.XSL
+++ /dev/null
@@ -1,455 +0,0 @@
-<xsl:stylesheet	xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
-<xsl:output method="html" indent="yes"/>
-<xsl:decimal-format decimal-separator="." grouping-separator="," />
-
-<xsl:template match="testsuites">
-	<HTML>
-		<HEAD>
-    <style type="text/css">
-      body {
-      	font:normal 68% verdana,arial,helvetica;
-      	color:#000000;
-      }
-      table tr td, table tr th {
-          font-size: 68%;
-      }
-      table.details tr th{
-      	font-weight: bold;
-      	text-align:left;
-      	background:#a6caf0;
-      }
-      table.details tr td{
-      	background:#eeeee0;
-      }
-      
-      p {
-      	line-height:1.5em;
-      	margin-top:0.5em; margin-bottom:1.0em;
-      }
-      h1 {
-      	margin: 0px 0px 5px; font: 165% verdana,arial,helvetica
-      }
-      h2 {
-      	margin-top: 1em; margin-bottom: 0.5em; font: bold 125% verdana,arial,helvetica
-      }
-      h3 {
-      	margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica
-      }
-      h4 {
-      	margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
-      }
-      h5 {
-      	margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
-      }
-      h6 {
-      	margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
-      }
-      .Error {
-      	font-weight:bold; color:red;
-      }
-      .Failure {
-      	font-weight:bold; color:purple;
-      }
-      .Properties {
-      	text-align:right;
-      }
-      </style>
-      <script language="JavaScript">
-        var TestCases = new Array();
-        var cur;
-        <xsl:for-each select="./testsuite">      
-            <xsl:apply-templates select="properties"/>
-        </xsl:for-each>
-
-       </script>
-       <script language="JavaScript"><![CDATA[
-        function displayProperties (name) {
-          var win = window.open('','JUnitSystemProperties','scrollbars=1,resizable=1');
-          var doc = win.document.open();
-          doc.write("<html><head><title>Properties of " + name + "</title>");
-          doc.write("<style>")
-          doc.write("body {font:normal 68% verdana,arial,helvetica;	color:#000000; }");
-          doc.write("table tr td, table tr th { font-size: 68%; }");
-          doc.write("table.properties { border-collapse:collapse; border-left:solid 1 #cccccc; border-top:solid 1 #cccccc; padding:5px; }");
-          doc.write("table.properties th { text-align:left; border-right:solid 1 #cccccc; border-bottom:solid 1 #cccccc; background-color:#eeeeee; }");
-          doc.write("table.properties td { font:normal; text-align:left; border-right:solid 1 #cccccc; border-bottom:solid 1 #cccccc; background-color:#fffffff; }");
-          doc.write("h3 { margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica }");
-          doc.write("</style>");
-          doc.write("</head><body>");
-          doc.write("<h3>Properties of " + name + "</h3>");
-          doc.write("<div align=\"right\"><a href=\"javascript:window.close();\">Close</a></div>");
-          doc.write("<table class='properties'>");
-          doc.write("<tr><th>Name</th><th>Value</th></tr>");
-          for (prop in TestCases[name]) {
-            doc.write("<tr><th>" + prop + "</th><td>" + TestCases[name][prop] + "</td></tr>");
-          }
-          doc.write("</table>");
-          doc.write("</body></html>");
-          doc.close();
-          win.focus();
-        }
-      ]]>  
-      </script>
-		</HEAD>
-		<body>
-			<a name="#top"></a>
-			<xsl:call-template name="pageHeader"/>	
-			
-			<!-- Summary part -->
-			<xsl:call-template name="summary"/>
-			<hr size="1" width="95%" align="left"/>
-			
-			<!-- Package List part -->
-			<xsl:call-template name="packagelist"/>
-			<hr size="1" width="95%" align="left"/>
-			
-			<!-- For each package create its part -->
-			<xsl:call-template name="packages"/>
-			<hr size="1" width="95%" align="left"/>
-			
-			<!-- For each class create the  part -->
-			<xsl:call-template name="classes"/>
-			
-		</body>
-	</HTML>
-</xsl:template>
-	
-	
-	
-	<!-- ================================================================== -->
-	<!-- Write a list of all packages with an hyperlink to the anchor of    -->
-	<!-- of the package name.                                               -->
-	<!-- ================================================================== -->
-	<xsl:template name="packagelist">	
-		<h2>Packages</h2>
-		Note: package statistics are not computed recursively, they only sum up all of its testsuites numbers.
-		<table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
-			<xsl:call-template name="testsuite.test.header"/>
-			<!-- list all packages recursively -->
-			<xsl:for-each select="./testsuite[not(./@package = preceding-sibling::testsuite/@package)]">
-				<xsl:sort select="@package"/>
-				<xsl:variable name="testsuites-in-package" select="/testsuites/testsuite[./@package = current()/@package]"/>
-				<xsl:variable name="testCount" select="sum($testsuites-in-package/@tests)"/>
-				<xsl:variable name="errorCount" select="sum($testsuites-in-package/@errors)"/>
-				<xsl:variable name="failureCount" select="sum($testsuites-in-package/@failures)"/>
-				<xsl:variable name="timeCount" select="sum($testsuites-in-package/@time)"/>
-				
-				<!-- write a summary for the package -->
-				<tr valign="top">
-					<!-- set a nice color depending if there is an error/failure -->
-					<xsl:attribute name="class">
-						<xsl:choose>
-							<xsl:when test="$failureCount &gt; 0">Failure</xsl:when>
-							<xsl:when test="$errorCount &gt; 0">Error</xsl:when>
-						</xsl:choose>
-					</xsl:attribute>
-					<td><a href="#{@package}"><xsl:value-of select="@package"/></a></td>
-					<td><xsl:value-of select="$testCount"/></td>
-					<td><xsl:value-of select="$errorCount"/></td>
-					<td><xsl:value-of select="$failureCount"/></td>
-					<td>
-					<xsl:call-template name="display-time">
-						<xsl:with-param name="value" select="$timeCount"/>
-					</xsl:call-template>
-					</td>
-				</tr>
-			</xsl:for-each>
-		</table>		
-	</xsl:template>
-	
-	
-	<!-- ================================================================== -->
-	<!-- Write a package level report                                       -->
-	<!-- It creates a table with values from the document:                  -->
-	<!-- Name | Tests | Errors | Failures | Time                            -->
-	<!-- ================================================================== -->
-	<xsl:template name="packages">
-		<!-- create an anchor to this package name -->
-		<xsl:for-each select="/testsuites/testsuite[not(./@package = preceding-sibling::testsuite/@package)]">
-			<xsl:sort select="@package"/>
-				<a name="#{@package}"></a>
-				<h3>Package <xsl:value-of select="@package"/></h3>
-				
-				<table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
-					<xsl:call-template name="testsuite.test.header"/>
-			
-					<!-- match the testsuites of this package -->
-					<xsl:apply-templates select="/testsuites/testsuite[./@package = current()/@package]" mode="print.test"/>
-				</table>
-				<a href="#top">Back to top</a>
-				<p/>
-				<p/>
-		</xsl:for-each>
-	</xsl:template>
-	
-	<xsl:template name="classes">
-		<xsl:for-each select="testsuite">
-			<xsl:sort select="@name"/>
-			<!-- create an anchor to this class name -->
-			<a name="#{@name}"></a>
-			<h3>TestCase <xsl:value-of select="@name"/></h3>
-			
-			<table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
-			  <xsl:call-template name="testcase.test.header"/>
-			  <!--
-			  test can even not be started at all (failure to load the class)
-			  so report the error directly
-			  -->
-				<xsl:if test="./error">
-					<tr class="Error">
-						<td colspan="4"><xsl:apply-templates select="./error"/></td>
-					</tr>
-				</xsl:if>
-				<xsl:apply-templates select="./testcase" mode="print.test"/>
-			</table>
-            <div class="Properties">
-                <a>
-			        <xsl:attribute name="href">javascript:displayProperties('<xsl:value-of select="@package"/>.<xsl:value-of select="@name"/>');</xsl:attribute>
-			        Properties &gt;&gt;
-			    </a>
-            </div>
-			<p/>
-			
-			<a href="#top">Back to top</a>
-		</xsl:for-each>
-	</xsl:template>
-	
-	<xsl:template name="summary">
-		<h2>Summary</h2>
-		<xsl:variable name="testCount" select="sum(testsuite/@tests)"/>
-		<xsl:variable name="errorCount" select="sum(testsuite/@errors)"/>
-		<xsl:variable name="failureCount" select="sum(testsuite/@failures)"/>
-		<xsl:variable name="timeCount" select="sum(testsuite/@time)"/>
-		<xsl:variable name="successRate" select="($testCount - $failureCount - $errorCount) div $testCount"/>
-		<table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
-		<tr valign="top">
-			<th>Tests</th>
-			<th>Failures</th>
-			<th>Errors</th>
-			<th>Success rate</th>
-			<th>Time</th>
-		</tr>
-		<tr valign="top">
-			<xsl:attribute name="class">
-				<xsl:choose>
-					<xsl:when test="$failureCount &gt; 0">Failure</xsl:when>
-					<xsl:when test="$errorCount &gt; 0">Error</xsl:when>
-				</xsl:choose>
-			</xsl:attribute>
-			<td><xsl:value-of select="$testCount"/></td>
-			<td><xsl:value-of select="$failureCount"/></td>
-			<td><xsl:value-of select="$errorCount"/></td>
-			<td>
-				<xsl:call-template name="display-percent">
-					<xsl:with-param name="value" select="$successRate"/>
-				</xsl:call-template>
-			</td>
-			<td>
-				<xsl:call-template name="display-time">
-					<xsl:with-param name="value" select="$timeCount"/>
-				</xsl:call-template>
-			</td>
-
-		</tr>
-		</table>
-		<table border="0" width="95%">
-		<tr>
-		<td	style="text-align: justify;">
-		Note: <i>failures</i> are anticipated and checked for with assertions while <i>errors</i> are unanticipated.
-		</td>
-		</tr>
-		</table>
-	</xsl:template>
-	
-  <!--
-   Write properties into a JavaScript data structure.
-   This is based on the original idea by Erik Hatcher (erik@hatcher.net)
-   -->
-  <xsl:template match="properties">
-    cur = TestCases['<xsl:value-of select="../@package"/>.<xsl:value-of select="../@name"/>'] = new Array();
-  	<xsl:for-each select="property">
-    <xsl:sort select="@name"/>
-        cur['<xsl:value-of select="@name"/>'] = '<xsl:call-template name="JS-escape"><xsl:with-param name="string" select="@value"/></xsl:call-template>';
-  	</xsl:for-each>
-  </xsl:template>
-	
-<!-- Page HEADER -->
-<xsl:template name="pageHeader">
-	<h1>Unit Test Results</h1>
-	<table width="100%">
-	<tr>
-		<td align="left"></td>
-		<td align="right">Designed for use with <a href='http://www.junit.org'>JUnit</a> and <a href='http://jakarta.apache.org/ant'>Ant</a>.</td>
-	</tr>
-	</table>
-	<hr size="1"/>
-</xsl:template>
-
-<xsl:template match="testsuite" mode="header">
-	<tr valign="top">
-		<th width="80%">Name</th>
-		<th>Tests</th>
-		<th>Errors</th>
-		<th>Failures</th>
-		<th nowrap="nowrap">Time(s)</th>
-	</tr>
-</xsl:template>
-
-<!-- class header -->
-<xsl:template name="testsuite.test.header">
-	<tr valign="top">
-		<th width="80%">Name</th>
-		<th>Tests</th>
-		<th>Errors</th>
-		<th>Failures</th>
-		<th nowrap="nowrap">Time(s)</th>
-	</tr>
-</xsl:template>
-
-<!-- method header -->
-<xsl:template name="testcase.test.header">
-	<tr valign="top">
-		<th>Name</th>
-		<th>Status</th>
-		<th width="80%">Type</th>
-		<th nowrap="nowrap">Time(s)</th>
-	</tr>
-</xsl:template>
-
-
-<!-- class information -->
-<xsl:template match="testsuite" mode="print.test">
-	<tr valign="top">
-		<!-- set a nice color depending if there is an error/failure -->
-		<xsl:attribute name="class">
-			<xsl:choose>
-				<xsl:when test="@failures[.&gt; 0]">Failure</xsl:when>
-				<xsl:when test="@errors[.&gt; 0]">Error</xsl:when>
-			</xsl:choose>
-		</xsl:attribute>
-	
-		<!-- print testsuite information -->
-		<td><a href="#{@name}"><xsl:value-of select="@name"/></a></td>
-		<td><xsl:value-of select="@tests"/></td>
-		<td><xsl:value-of select="@errors"/></td>
-		<td><xsl:value-of select="@failures"/></td>
-		<td>
-			<xsl:call-template name="display-time">
-				<xsl:with-param name="value" select="@time"/>
-			</xsl:call-template>
-		</td>
-	</tr>
-</xsl:template>
-
-<xsl:template match="testcase" mode="print.test">
-	<tr valign="top">
-		<xsl:attribute name="class">
-			<xsl:choose>
-				<xsl:when test="failure | error">Error</xsl:when>
-			</xsl:choose>
-		</xsl:attribute>
-		<td><xsl:value-of select="@name"/></td>
-		<xsl:choose>
-			<xsl:when test="failure">
-				<td>Failure</td>
-				<td><xsl:apply-templates select="failure"/></td>
-			</xsl:when>
-			<xsl:when test="error">
-				<td>Error</td>
-				<td><xsl:apply-templates select="error"/></td>
-			</xsl:when>
-			<xsl:otherwise>
-				<td>Success</td>
-				<td></td>
-			</xsl:otherwise>
-		</xsl:choose>
-		<td>
-			<xsl:call-template name="display-time">
-				<xsl:with-param name="value" select="@time"/>
-			</xsl:call-template>
-		</td>
-	</tr>
-</xsl:template>
-
-
-<xsl:template match="failure">
-	<xsl:call-template name="display-failures"/>
-</xsl:template>
-
-<xsl:template match="error">
-	<xsl:call-template name="display-failures"/>
-</xsl:template>
-
-<!-- Style for the error and failure in the tescase template -->
-<xsl:template name="display-failures">
-	<xsl:choose>
-		<xsl:when test="not(@message)">N/A</xsl:when>
-		<xsl:otherwise>
-			<xsl:value-of select="@message"/>
-		</xsl:otherwise>
-	</xsl:choose>
-	<!-- display the stacktrace -->
-	<code>
-		<p/>
-		<xsl:call-template name="br-replace">
-			<xsl:with-param name="word" select="."/>
-		</xsl:call-template>
-	</code>
-	<!-- the later is better but might be problematic for non-21" monitors... -->
-	<!--pre><xsl:value-of select="."/></pre-->
-</xsl:template>
-
-<xsl:template name="JS-escape">
-	<xsl:param name="string"/>
-	<xsl:choose><!-- something isn't right here, basically all single quotes need to be replaced with backslash-single-quote
-		<xsl:when test="contains($string,'&apos;')">
-			<xsl:value-of select="substring-before($string,'&apos;')"/>
-			\&apos;
-			<xsl:call-template name="JS-escape">
-				<xsl:with-param name="string" select="substring-after($string,'&apos;')"/>
-			</xsl:call-template>
-		</xsl:when> -->
-		<xsl:when test="contains($string,'\')">
-			<xsl:value-of select="substring-before($string,'\')"/>\\<xsl:call-template name="JS-escape">
-				<xsl:with-param name="string" select="substring-after($string,'\')"/>
-			</xsl:call-template>
-		</xsl:when>
-		<xsl:otherwise>
-			<xsl:value-of select="$string"/>
-		</xsl:otherwise>
-	</xsl:choose>
-</xsl:template>
-
-
-<!--
-	template that will convert a carriage return into a br tag
-	@param word the text from which to convert CR to BR tag
--->
-<xsl:template name="br-replace">
-	<xsl:param name="word"/>
-	<xsl:choose>
-		<xsl:when test="contains($word,'&#xA;')">
-			<xsl:value-of select="substring-before($word,'&#xA;')"/>
-			<br/>
-			<xsl:call-template name="br-replace">
-				<xsl:with-param name="word" select="substring-after($word,'&#xA;')"/>
-			</xsl:call-template>
-		</xsl:when>
-		<xsl:otherwise>
-			<xsl:value-of select="$word"/>
-		</xsl:otherwise>
-	</xsl:choose>
-</xsl:template>
-
-<xsl:template name="display-time">
-	<xsl:param name="value"/>
-	<xsl:value-of select="format-number($value,'0.000')"/>
-</xsl:template>
-
-<xsl:template name="display-percent">
-	<xsl:param name="value"/>
-	<xsl:value-of select="format-number($value,'0.00%')"/>
-</xsl:template>
-
-</xsl:stylesheet>
-
diff --git a/bundles/org.eclipse.test/about.html b/bundles/org.eclipse.test/about.html
deleted file mode 100644
index af95f14..0000000
--- a/bundles/org.eclipse.test/about.html
+++ /dev/null
@@ -1,81 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
-
-<p>2nd October, 2002</p>	
-<h3>License</h3>
-<p>Eclipse.org makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Common Public License Version 1.0 (&quot;CPL&quot;).  A copy of the CPL is available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>.
-For purposes of the CPL, &quot;Program&quot; will mean the Content.</p>
-
-<h3>Third Party Content</h3>
-
-<p>The Content includes items that have been sourced from third parties as follows:</p>
-
-<b>Xalan 2.1.0</b>
-<p>The plug-in is accompanied by software based on Xalan 2.1.0 developed by The Apache Software Foundation as part of the Apache XML project.  Therefore:</p>
-
-<blockquote>
-This product includes software developed by the Apache Software Foundation (<a href="http://www.apache.org/">http://www.apache.org/</a>).
-</blockquote>
-
-<p>The Xalan binary code is located in xalan.jar and is:</p>
-<blockquote>Copyright (c) 1999 The Apache Software Foundation. All rights reserved.</blockquote>
-Your use of Xalan in binary code form accompanying the plug-in is subject to the terms and conditions of the 
-Apache Software License 1.1 which is available at <a href="http://xml.apache.org/LICENSE">http://xml.apache.org/LICENSE</a>.  More specifically:</p>
-<blockquote>
-	1. Redistributions of source code must retain the above copyright notice, this list of<br />
-	conditions and the following disclaimer.<br />
-<br />
-	2. Redistributions in binary form must reproduce the above copyright notice, this list of<br />
-	conditions and the following disclaimer in the documentation and/or other materials<br />
-	provided with the distribution.<br />
-<br />
-	3. The end-user documentation included with the redistribution, if any, must include the<br />
-	following acknowledgment:<br />
-	<blockquote>
-		&quot;This product includes software developed by the Apache Software Foundation<br />
-		(<a href="http://www.apache.org/">http://www.apache.org/</a>).&quot;
-	</blockquote>
-	Alternately, this acknowledgment may appear in the software itself, if and wherever such<br />
-	third-party acknowledgments normally appear.<br />
-<br />
-	4. The names &quot;Xalan&quot; and &quot;Apache Software Foundation&quot; must not be used to endorse or<br />
-	promote products derived from this software without prior written permission. For written<br />
-	permission, please contact <a href="mailto:apache@apache.org">apache@apache.org</a>.<br />
-<br />
-	5. Products derived from this software may not be called &quot;Apache&quot;, nor may &quot;Apache&quot; appear<br />
-	in their name, without prior written permission of the Apache Software Foundation.<br />
-<br />
-	THIS SOFTWARE IS PROVIDED &quot;AS IS&quot; AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT<br />
-	LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR<br />
-	PURPOSE ARE	DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR ITS<br />
-	CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR<br />
-	CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR<br />
-	SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON<br />
-	ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,	OR TORT (INCLUDING<br />
-	NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT	OF THE USE OF THIS SOFTWARE, EVEN IF<br />
-	ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-</blockquote>
-
-<p>Source code for Xalan is available at <a href="http://xml.apache.org/xalan-j/index.html">http://xml.apache.org/xalan-j/index.html</a>.<p>
-
-<h3>Contributions</h3>
-
-<p>If this Content is licensed to you under the terms and conditions of the CPL, any Contributions, as defined in the CPL, uploaded, submitted, or otherwise
-made available to Eclipse.org, members of Eclipse.org and/or the host of Eclipse.org web site, by you that relate to such
-Content are provided under the terms and conditions of the CPL and can be made available to others under the terms of the CPL.</p>
-
-<p>If this Content is licensed to you under license terms and conditions other than the CPL (&quot;Other License&quot;), any modifications, enhancements and/or
-other code and/or documentation (&quot;Modifications&quot;) uploaded, submitted, or otherwise made available to Eclipse.org, members of Eclipse.org and/or the
-host of Eclipse.org, by you that relate to such Content are provided under terms and conditions of the Other License and can be made available
-to others under the terms of the Other License.  In addition, with regard to Modifications for which you are the copyright holder, you are also
-providing the Modifications under the terms and conditions of the CPL and such Modifications can be made available to others under the terms of
-the CPL.</p>
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.test/build.properties b/bundles/org.eclipse.test/build.properties
deleted file mode 100644
index 0c788fd..0000000
--- a/bundles/org.eclipse.test/build.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2003 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials 
-# are made available under the terms of the Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.automated.jar =src/
-bin.includes=*.jar,*.xsl,library.xml,plugin.xml,doc/,runtests*,test.xml,*.html
diff --git a/bundles/org.eclipse.test/library.xml b/bundles/org.eclipse.test/library.xml
deleted file mode 100644
index 2ca27f5..0000000
--- a/bundles/org.eclipse.test/library.xml
+++ /dev/null
@@ -1,126 +0,0 @@
-<?xml version="1.0"?>
-
-<project name="Library" default="init" basedir=".">
-
-  <target name="init">
-    <tstamp/>
-  </target>
-
-  <target name="core-test">
-    <antcall target="eclipse-test">
-      <param name="application" value="org.eclipse.test.coretestapplication"/>
-    </antcall>
-  </target>
-
-  <target name="ui-test">
-    <antcall target="eclipse-test">
-      <param name="application" value="org.eclipse.test.uitestapplication"/>
-    </antcall>
-  </target>
-  
-  <target name="eclipse-test">
-<!-- 
-Parameters to this target:
-data-dir		- the directory for Eclipse to write its data
-plugin-name		- the name of the plugin to test
-classname		- the name of the test class
-vmargs			- a string containing arguments to pass to the VM - defaults to ""
--->
-    <!-- Specify the default value for ${vmargs} -->
-
-    <tstamp>
-        <format property="TIMENOW" pattern="HHmmssSSSS"/>
-    </tstamp>
-
-    <property name="vmargs" value=""/>
-    <property name="launcher" value="org.eclipse.core.launcher.Main"/>
-    <property name="formatter" value="org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter"/>
-    <property name="extraVMargs" value="" />
-
-    <echo message="Running ${classname}"/>
-
-    <!-- Produces the file '${default-filename}' -->
-    <java classname="${launcher}" fork="true" dir=".">
-      <classpath>
-        <pathelement location="startup.jar"/>
-      </classpath>
-      <arg line="-application ${application}"/>
-      <arg line="-dev bin -data ${data-dir}"/>
-      <arg line="formatter=${formatter},${classname}.xml"/>
-      <arg line="-testPluginName ${plugin-name}"/>
-      <arg line="-className ${classname}"/>
-      <arg line="-noupdate"/>
-      <arg line="-os ${os}"/>
-      <arg line="-ws ${ws}"/>
-      <arg line="-arch ${arch}"/>
-      <jvmarg line="${vmargs} ${extraVMargs}"/>
-    </java>
-
-  </target>
-
-  <target name="collect">
-<!-- 
-Parameters to this target:
-includes		- the names of the files to include
-output-file		- the name of the output file to produce
--->
-    <junitreport todir="." tofile="${output-file}">
-      <fileset dir=".">
-        <include name="${includes}"/>
-      </fileset>
-    </junitreport>
-  </target>
-
-<!-- 
-WARNING: This task will not work correctly until org.eclipse.ant.core
-         upgrades to Ant 1.4 or higher. There are problems with absolute
-         paths and the style task.
--->
-  <target name="test-regressions">
-<!--
-Parameters to this target:
-oldfile			- the name of the baseline XML file to test against
-newfile			- the name of the XML file containing most recent test results
-outfile			- the name of the file produced
--->
-
-    <echo message="Running Regression Tests"/>
-    <property name="test-plugin-dir" value="${basedir}/fragments/org.eclipse.test"/>
-    <property name="rt-stylesheet" value="${test-plugin-dir}/regression-test.xsl"/>
-    <property name="rt-classname" value="org.eclipse.test.RegressionTest"/>
-
-    <!-- Ensure that the file exists, and give sensible behaviour if not -->
-    <style style="${rt-stylesheet}" in="${newfile}" out="${newfile}.tmp"/>
-    <style style="${rt-stylesheet}" in="${oldfile}" out="${oldfile}.tmp"/>
-    <java classname="${rt-classname}">
-      <classpath>
-        <pathelement location="${test-plugin-dir}/bin"/>
-      </classpath>
-      <arg value="${oldfile}.tmp"/>
-      <arg value="${newfile}.tmp"/>
-      <arg value="${outfile}"/>
-    </java>
-
-    <delete file="${oldfile}.tmp"/>
-    <delete file="${newfile}.tmp"/>
-  </target>
-
-  <target name="notfiy">
-<!--
-Parameters to this target:
-infile			- the name of the file that contains the message body
-address			- the e-mail address to notify
--->
-
-    <echo message="Sending Notification"/>
-    <property name="email-from" value="Eclipse Automated Test@oti.com"/>
-    <property name="email-subject" value="Nightly Build Report"/>
-    <property name="email-server" value="mail.ott.oti.com"/>
-
-    <mail from="${email-from}" tolist="${address}"
-          subject="${email-subject}" files="${infile}"
-          mailhost="${email-server}"/>
-
-  </target>
-
-</project>
diff --git a/bundles/org.eclipse.test/plugin.properties b/bundles/org.eclipse.test/plugin.properties
deleted file mode 100644
index f9c8b1b..0000000
--- a/bundles/org.eclipse.test/plugin.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2003 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials 
-# are made available under the terms of the Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-pluginName = Eclipse Automated Testing
-providerName = Eclipse.org
\ No newline at end of file
diff --git a/bundles/org.eclipse.test/plugin.xml b/bundles/org.eclipse.test/plugin.xml
deleted file mode 100644
index 9c6f1dd..0000000
--- a/bundles/org.eclipse.test/plugin.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<plugin
-	name="%pluginName"
-	id="org.eclipse.test"
-	version="2.1.0"
-	provider-name="%providerName">
-
-	<requires>
-	   <import plugin="org.apache.ant"/>
-  	   <import plugin="org.apache.xerces"/>
-	   <import plugin="org.junit"/>
-	   <import plugin="org.eclipse.ant.core" optional="true"/>
-	   <import plugin="org.eclipse.core.boot"/>
-	   <import plugin="org.eclipse.swt" optional="true"/>
-   	   <import plugin="org.eclipse.ui"/>
-	   <import plugin="org.eclipse.ui.workbench"/>
-	   <import plugin="org.eclipse.core.resources"/>
-       <import plugin="org.eclipse.update.core"/>
-       <import plugin="org.eclipse.help"/>
-       <import plugin="org.eclipse.jface"/>
-       <import plugin="org.eclipse.jface.text"/>
-	</requires> 
-
-	<runtime>
-	   <library name="automated.jar"/>
-	</runtime>
-
-	<extension id="coretestapplication" point="org.eclipse.core.runtime.applications">
-		<application>
-			<run
-				class="org.eclipse.test.CoreTestApplication">	      
-			</run>
-		</application>
-	</extension>
-
-	<extension id="uitestapplication" point="org.eclipse.core.runtime.applications">
-		<application>
-			<run
-				class="org.eclipse.test.UITestApplication">
-				<parameter name="productInfo" value="product.ini"/>
-			</run>
-		</application>
-	</extension>
-	
-    <extension point="org.eclipse.ant.core.extraClasspathEntries">
-      <extraClasspathEntry library="xalan.jar"/>
-    </extension>
-
-</plugin>
diff --git a/bundles/org.eclipse.test/readme.html b/bundles/org.eclipse.test/readme.html
deleted file mode 100644
index 4b17d9e..0000000
--- a/bundles/org.eclipse.test/readme.html
+++ /dev/null
@@ -1,296 +0,0 @@
-<html>
-<head>
-<title>Untitled Document</title>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-</head>
-
-<body bgcolor="#FFFFFF" text="#000000">
-<font size="+2"> Automated Testing of Eclipse Builds</font>
-<p>last updated: October 23, 2002</p>
-<p><font size="+1">Description</font></p>
-<p>This document describes how to run JUnit test plugins in Eclipse from the command 
-  line using Eclipse JUnit test plugins (see <a href="#appendixa">Appendix A</a> 
-  for listing) and a testing framework. This method of running tests is intended 
-  for anyone who wishes to automate their testing process or reproduce the testing 
-  mechanism used in Eclipse builds by the Eclipse Release Engineering team.</p>
-<p>Click <a href="testframework.html">here</a> for a description of the testing 
-  framework, and how it can be used outside of the setup described here.</p>
-<p>If you simply wish to write and run JUnit tests interactively from an Eclipse 
-  workbench, try one of the links below:</p>
-<p><a href="http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/jdt-ui-home/plugins/org.eclipse.jdt.junit/index.html">JUnit 
-  Support in Eclipse</a><br>
-<a href="http://dev.eclipse.org:8080/help/content/help:/org.eclipse.jdt.doc.user/tasks/tasks-207.htm?resultof=%6a%75%6e%69%74%20&toc=%2Forg.eclipse.jdt.doc.user%2Ftoc.xml">Using 
-  JUnit</a></p>
-
-<p><font size="+1">Requirements</font></p>
-<p>1. All test machines will require a java runtime environment (version 1.3 or 
-  higher) installed and added to the path environment variable.<br>
-  2. <a href="http://www.info-zip.org/pub/infozip/UnZip.html">Info-ZIP UnZip</a> 
-  version 5.41 or later installed and added to the path.<br>
-  3. The Automated Test feature from an Eclipse build (<a href="http://www.eclipse.org/downloads/index.php">http://www.eclipse.org/downloads/index.php</a>). 
-  This contains the test framework plugin and the test plugins to run.<br>
-  4. An Eclipse SDK zip file (<a href="http://www.eclipse.org/downloads/index.php">http://www.eclipse.org/downloads/index.php</a>) 
-  to test. Usually you will want to test a particular Eclipse build using a matching 
-  Automated Tests feature.</p>
-<p>To run the Team CVS tests you will need extssh access to a CVS repository. 
-  The tests create a lot of junk modules and tags so you will want to keep the 
-  test repository seperate from your development repository. While it is not necessary 
-  to clean up the repository between each Team test run you will probably want 
-  to clean it up periodically.</p>
-<p><font size="+1">Setup</font></p>
-<p>1. Extract the eclipse-Automated-Tests-&lt;buildid&gt;.zip. On Window, extract 
-  this file close to the root of the drive to prevent some path names from exceeding 
-  the 233 character limit. This will create a top-level directory &quot;<b>eclipse-testing</b>&quot;.<br>
-  2. Place the Eclipse SDK zip file to test in the eclipse-testing directory. 
-  Do not unzip this file. (The test scripts will take care of this)<br>
-  3. To run the Team CVS tests edit the test.xml script to provide connection 
-  information.</p>
-<blockquote> 
-  <p>Replace the following strings in the &quot;teamcvs&quot; target of the test.xml 
-    file with the information described below:</p>
-</blockquote>
-<ul>
-  <li>@cvs_user@ - the account used to connect to the cvs repository</li>
-  <li>@cvs_password@- the account password</li>
-  <li>@cvs_host@- the name of the cvs server</li>
-  <li>@cvs_root@- the repository path 
-    <p>These values are used at test time to automatically replace strings in 
-      org.eclipse.team.tests.cvs.core/repository.properties. For more information 
-      on how this file is used in the team CVS tests, click <a href="http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/org.eclipse.team.tests.cvs.core/readme.html?rev=HEAD&content-type=text/html">here</a>. 
-    </p>
-  </li>
-</ul>
-<p><font size="+1">Running Tests</font></p>
-<p>1. cd to the eclipse-testing directory<br>
-  2. Run the following script:</p>
-<p><b>runtests [-os &lt;operating system&gt;] [-ws &lt;windowing system&gt;] [-arch 
-  &lt;architecture&gt;] [-noclean] [&lt;testTarget&gt;][-properties &lt;path&gt;]</b></p>
-All parameters and targets are optional on windows systems. Just running &quot;runtests&quot; 
-will run <b>ALL</b> tests on Windows, installing a clean Eclipse between each 
-test target. On *nix systems, the os, ws and arch parameters must be specified. 
-<p><font size="+1">Parameters</font></p>
-<table width="90%" border="1">
-  <tr> 
-    <td>Parameter</td>
-    <td>Description</td>
-  </tr>
-  <tr> 
-    <td>-os &lt;operating system&gt;</td>
-    <td>The OS the tests are being run on. One of: aix, hpux, linux, qnx, solaris, 
-      win32. <b>Default win32</b></td>
-  </tr>
-  <tr> 
-    <td>-ws &lt;windowing system&gt;</td>
-    <td>The windowing system the tests are being run on. One of: motif, gtk, photon, 
-      win32. <b>Default win32</b></td>
-  </tr>
-  <tr> 
-    <td>-arch &lt;architecture&gt;</td>
-    <td>The architecture the tests are being run on. One of: ppc, PA_RISC, x86, 
-      sparc. <b>Default x86</b></td>
-  </tr>
-  <tr> 
-    <td>-noclean</td>
-    <td>Run tests without installing a clean Eclipse between test targets. Default 
-      is to install a clean Eclipse between test targets.</td>
-  </tr>
-  <tr>
-    <td>-properties</td>
-    <td>Used to reference a properties file containing additional Ant properties 
-      used in running tests.Can be used to pass additional vm arguments to the 
-      Java virtual machine running the tests by adding the entry &quot;extraVMargs=&lt;the 
-      args to pass to the vm&gt;&quot; to the specified properties file.</td>
-  </tr>
-</table>
-  
-<p><font size="+1">Test Targets</font></p>
-<p>Specifies which ant target to run in the main test.xml. Typically this corresponds 
-  to a test project's tests. If you do not specify a test target then the <b>all</b> 
-  test target is run.</p>
-
-<table width="90%" border="1">
-  <tr> 
-    <td>all</td>
-    <td>Runs all the targets below excluding the JDT-Core components tests.</td>
-  </tr>
-  <tr> 
-    <td>all14</td>
-    <td>Runs all the JDT-Core component tests and genHtml. This target requires 
-      a 1.4 level java virtual machine on the path.</td>
-  </tr>
-  <tr>
-    <td>ant</td>
-    <td>Runs the JUnit plugin tests for the Platform-Ant component.</td>
-  </tr>
-  <tr> 
-    <td>core</td>
-    <td>Runs the JUnit plugin tests for the Platform-Core component.</td>
-  </tr>
-  <tr> 
-    <td>help</td>
-    <td>Runs the JUnit plugin tests for the Platform-Help component.</td>
-  </tr>
-  <tr> 
-    <td>jdtcorebuilder</td>
-    <td>Runs the JUnit plugin tests for the JDT-Core component.</td>
-  </tr>
-  <tr> 
-    <td height="20">jdtcorecompiler</td>
-    <td height="20">Runs the JUnit plugin tests for the JDT-Core component.</td>
-  </tr>
-  <tr> 
-    <td>jdtcoremodel</td>
-    <td>Runs the JUnit plugin tests for the JDT-Core component.</td>
-  </tr>
-  <tr> 
-    <td>jdtdebug</td>
-    <td>Runs the JUnit plugin tests for the JDT-Debug component.</td>
-  </tr>
-  <tr> 
-    <td>jdtui</td>
-    <td>Runs the JUnit plugin tests for the JDT-UI component.</td>
-  </tr>
-  <tr> 
-    <td>jdtuirefactoring</td>
-    <td>Rruns additional JUnit plugin tests for the JDT-UI component.</td>
-  </tr>
-  <tr> 
-    <td>swt</td>
-    <td>Runs the JUnit plugin tests for the Platform-SWT component. This target 
-      is executed on Windows operating systems only.</td>
-  </tr>
-  <tr> 
-    <td>teamcore</td>
-    <td>Runs the JUnit plugin tests for the Platform-VCM component.</td>
-  </tr>
-  <tr> 
-    <td>teamcvs</td>
-    <td>Runs additional JUnit plugin tests for the Platform-VCM component.</td>
-  </tr>
-  <tr> 
-    <td>ui</td>
-    <td>Runs the JUnit plugin tests for the Platform-UI component.</td>
-  </tr>
-  <tr> 
-    <td>update</td>
-    <td>Runs the JUnit plugin tests for the Platform-Update component.</td>
-  </tr>
-  <tr> 
-    <td>genHtml</td>
-    <td>Converts xml test results in the &quot;eclipse-testing\results&quot; directory 
-      to html.</td>
-  </tr>
-</table>
-<p><br>
-</p>
-<p><font size="+1"><a name="appendixa"></a>Appendix A - JUnit test plugins</font></p>
-<p>The test plugins listed below are available from the dev.eclipse.org cvs repository 
-  and are available in binary distributable format from the Eclipse downloads 
-  page. </p>
-<p>* indicates the plugin that contains the test.xml if component has more than 
-  one JUnit test plugin</p>
-<table width="75%" border="1">
-  <tr> 
-    <td>Component</td>
-    <td>JUnit plugin tests</td>
-  </tr>
-  <tr> 
-    <td>Jdt-Core</td>
-    <td> 
-      <p>org.eclipse.jdt.core.tests.builder *<br>
-        org.eclipse.jdt.core.tests.compiler *<br>
-        org.eclipse.jdt.core.tests.model *</p>
-    </td>
-  </tr>
-  <tr> 
-    <td>Jdt-Debug</td>
-    <td>org.eclipse.jdt.debug.tests</td>
-  </tr>
-  <tr> 
-    <td>Jdt-UI</td>
-    <td> 
-      <p>org.eclipse.jdt.ui.tests *<br>
-        org.eclipse.jdt.ui.tests.refactoring *</p>
-    </td>
-  </tr>
-  <tr> 
-    <td>Platform-Core</td>
-    <td>
-      <p>org.eclipse.core.tests.harness *<br>
-        org.eclipse.core.tests.runtime<br>
-        org.eclipse.core.tests.resources</p>
-      </td>
-  </tr>
-  <tr> 
-    <td>Platform-Help</td>
-    <td>org.eclipse.help.tests</td>
-  </tr>
-  <tr> 
-    <td>Platform-SWT</td>
-    <td>org.eclipse.swt.tests</td>
-  </tr>
-  <tr> 
-    <td>Platform-UI</td>
-    <td>org.eclipse.ui.tests</td>
-  </tr>
-  <tr> 
-    <td>Platform-Update</td>
-    <td>org.eclipse.update.tests.core</td>
-  </tr>
-  <tr> 
-    <td>Platform-VCM(Team)</td>
-    <td> 
-      <p>org.eclipse.team.tests.cvs.core<br>
-      org.eclipse.team.tests.core</p>
-    </td>
-  </tr>
-</table>
-<p>&nbsp;</p>
-<p><font size="+1"><a name="appendixb"></a>Appendix B- Supported os, ws, and arch 
-  value combinations</font></p>
-<p>The following table contains the values that can be used with the -os, -ws, 
-  and -arch switches.</p>
-<table width="75%" border="1">
-  <tr> 
-    <td>Operating System (os)</td>
-    <td>Windowing System (ws)</td>
-    <td>Architecture (arch)</td>
-  </tr>
-  <tr> 
-    <td>aix</td>
-    <td>motif</td>
-    <td>ppc</td>
-  </tr>
-  <tr> 
-    <td>hpux</td>
-    <td>motif</td>
-    <td>PA_RISC</td>
-  </tr>
-  <tr> 
-    <td>linux</td>
-    <td>gtk</td>
-    <td>x86</td>
-  </tr>
-  <tr> 
-    <td>linux</td>
-    <td>motif</td>
-    <td>x86</td>
-  </tr>
-  <tr> 
-    <td height="24">qnx</td>
-    <td height="24">photon</td>
-    <td height="24">x86</td>
-  </tr>
-  <tr> 
-    <td>solaris</td>
-    <td>motif</td>
-    <td>sparc</td>
-  </tr>
-  <tr> 
-    <td>win32</td>
-    <td>win32</td>
-    <td>x86</td>
-  </tr>
-</table>
-</body>
-</html>
diff --git a/bundles/org.eclipse.test/regression-test.xsl b/bundles/org.eclipse.test/regression-test.xsl
deleted file mode 100644
index 3703211..0000000
--- a/bundles/org.eclipse.test/regression-test.xsl
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0"?>
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
-<xsl:output method="text" indent="no"/>
-
-<!--
-This stylesheet is used to transform the collected list of test results in XML
-into a sorted list of name/status pairs in plaintext. This plaintext list is
-then suitable for easy regression testing.
--->
-
-<xsl:variable name="newline">
-<xsl:text>
-</xsl:text>
-</xsl:variable>
-
-<xsl:template match="/">
-<xsl:for-each select="/testsuites/testsuite/testcase">
-	<xsl:sort select="@name"/>
-	<xsl:value-of select="@name"/>
-	<xsl:text> </xsl:text>
-	<xsl:choose>
-		<xsl:when test="failure">
-			<xsl:text>fail</xsl:text>
-		</xsl:when>
-		<xsl:when test="error">
-			<xsl:text>error</xsl:text>
-		</xsl:when>
-		<xsl:otherwise>
-			<xsl:text>pass</xsl:text>
-		</xsl:otherwise>
-	</xsl:choose>
-	<xsl:value-of select="$newline"/>
-</xsl:for-each>
-</xsl:template>
-</xsl:stylesheet>
diff --git a/bundles/org.eclipse.test/runtests b/bundles/org.eclipse.test/runtests
deleted file mode 100644
index 32b0fa3..0000000
--- a/bundles/org.eclipse.test/runtests
+++ /dev/null
@@ -1,92 +0,0 @@
-# !/bin/sh
-
-#set the DISPLAY for running tests on Linux
-DISPLAY=`$HOST`:0.0;export DISPLAY
-
-#this value must be set when using rsh to execute this script, otherwise the script will execute from the user's home directory
-dir=.
-
-# operating system, windowing system and architecture variables
-os=
-ws=
-arch=
-
-# list of tests (targets) to execute in test.xml
-tests=
-
-# default value to determine if eclipse should be reinstalled between running of tests
-installmode="clean"
-
-# name of a property file to pass to Ant
-properties=
-
-# message printed to console
-usage="usage: $0 -os <osType> -ws <windowingSystemType> -arch <architecture> [-noclean] [<test target>][-properties <path>]"
-
-
-# proces command line arguments
-while [ $# -gt 0 ]
-do
-	case "$1" in
-		-dir) dir="$2"; shift;;
-		-os) os="$2"; shift;;
-		-ws) ws="$2"; shift;;
-		-arch) arch="$2"; shift;;
-		-noclean) installmode="noclean";;
-		-properties) properties="-propertyfile $2";shift;;
-		*) tests=$tests\ $1;;
-	esac
-	shift
-done
-
-# for *nix systems, os, ws and arch values must be specified
-if [ "x$os" = "x" ]
-then
-	echo >&2 "$usage"
-	exit 1
-fi
-
-if [ "x$ws" = "x" ]
-then
-	echo >&2 "$usage"
-	exit 1
-fi
-
-if [ "x$arch" = "x" ]
-then
-	echo >&2 "$usage"
-	exit 1
-fi
-
-#necessary when invoking this script through rsh
-cd $dir
-
-# verify os, ws and arch values passed in are valid before running tests
-if [ "$os-$ws-$arch" = "linux-motif-x86" ] || [ "$os-$ws-$arch" = "linux-gtk-x86" ] || [ "$os-$ws-$arch" = "solaris-motif-sparc" ] || [ "$os-$ws-$arch" = "aix-motif-sparc" ] || [ "$os-$ws-$arch" = "hpux-motif-ppc" ] || [ "$os-$ws-$arch" = "qnx-photon-x86" ]
-then
-	rm -r eclipse
-	rm -r workspace
-	unzip -qq -o eclipse-SDK-*.zip
-	unzip -qq -o -C eclipse-junit-tests-*.zip */plugins/org.eclipse.test*
-	
-	if [ "$installmode" = "noclean" ]
-	then		
-		# if tests are to run without reinstalling eclipse, only install the test eclipse if it does not exist
-		# If the test-eclipse directory is in a partially installed state, it should be deleted manually
-
-		if [ ! -r test-eclipse/eclipse ]
-		then
-			 java -cp eclipse/startup.jar org.eclipse.core.launcher.Main -noupdate -ws $ws -os $os -arch $arch -application org.eclipse.ant.core.antRunner -file test.xml setup -Dws=$ws -Dos=$os -Darch=$arch -Dclean=true -logger org.apache.tools.ant.DefaultLogger
-		fi
-	fi
-
-# run tests
-java -cp eclipse/startup.jar org.eclipse.core.launcher.Main -noupdate -ws $ws -os $os -arch $arch -application org.eclipse.ant.core.antRunner -file test.xml $tests -Dws=$ws -Dos=$os -Darch=$arch -D$installmode=true $properties -logger org.apache.tools.ant.DefaultLogger
-
-# display message to user if os, ws and arch are invalid
-else
-	echo "The os, ws and arch values are either invalid or are an invalid combination"
-
-exit 1
-fi
-
diff --git a/bundles/org.eclipse.test/runtests.bat b/bundles/org.eclipse.test/runtests.bat
deleted file mode 100644
index 364006a..0000000
--- a/bundles/org.eclipse.test/runtests.bat
+++ /dev/null
@@ -1,81 +0,0 @@
-@echo off
-
-REM reset list of ant targets in test.xml to execute
-set tests=
-
-REM default switch to determine if eclipse should be reinstalled between running of tests
-set installmode=clean
-
-REM property file to pass to Ant scripts
-set properties=
-
-REM default values for os, ws and arch
-set os=win32
-set ws=win32
-set arch=x86
-
-REM reset ant command line args
-set ANT_CMD_LINE_ARGS=
-
-REM ****************************************************************
-REM
-REM Delete previous Eclipse installation and workspace
-REM
-REM ****************************************************************
-if EXIST eclipse rmdir /S /Q eclipse
-if EXIST workspace rmdir /s /Q workspace
-
-REM ****************************************************************
-REM
-REM Install Eclipse and org.eclipse.test plugin
-REM
-REM ****************************************************************
-
-unzip -qq -o eclipse-SDK-*.zip
-unzip -qq -o -C eclipse-junit-tests*.zip */plugins/org.eclipse.test*
-
-
-:processcmdlineargs
-
-REM ****************************************************************
-REM
-REM Process command line arguments
-REM
-REM ****************************************************************
-
-if x%1==x goto setup
-if x%1==x-ws set ws=%2 && shift && shift && goto processcmdlineargs
-if x%1==x-os set os =%2 && shift && shift && goto processcmdlineargs
-if x%1==x-arch set arch=%2 && shift && shift && goto processcmdlineargs
-if x%1==x-noclean set installmode=noclean && shift && goto processcmdlineargs
-if x%1==x-properties set properties=-propertyfile %2 && shift && shift && goto processcmdlineargs
-
-set tests=%tests% %1 && shift && goto processcmdlineargs
-
-
-:setup
-REM ****************************************************************
-REM
-REM	Setup up the test Eclipse
-REM
-REM	** if -noclean set, Eclipse will be re-installed only if the 
-REM	directory test-eclipse\eclipse does not exist.  If this directory
-REM	exists in a partially installed state, it should be deleted manually
-REM	and the script rerun with the same parameter settings. **
-REM
-REM ****************************************************************
-
-if NOT EXIST test-eclipse\eclipse java -cp eclipse\startup.jar org.eclipse.core.launcher.Main -noupdate -ws %ws% -os %os% -arch %arch% -application org.eclipse.ant.core.antRunner -file test.xml setup -Dws=%ws% -Dos=%os% -Darch=%arch% -Dclean=true
-
-if %installmode%==noclean java -cp eclipse\startup.jar org.eclipse.core.launcher.Main -noupdate -ws %ws% -os %os% -arch %arch% -application org.eclipse.ant.core.antRunner -file test.xml setup -Dws=%ws% -Dos=%os% -Darch=%arch% "-D%installmode%=true" -logger org.apache.tools.ant.DefaultLogger
-goto run
-
-
-:run
-REM ***************************************************************************
-REM	Run tests by running Ant in Eclipse on the test.xml script
-REM ***************************************************************************
-java -cp eclipse\startup.jar org.eclipse.core.launcher.Main -noupdate -ws %ws% -os %os% -arch %arch% -application org.eclipse.ant.core.antRunner -file test.xml %tests% -Dws=%ws% -Dos=%os% -Darch=%arch% %properties%  "-D%installmode%=true" -logger org.apache.tools.ant.DefaultLogger
-goto end
-
-:end
diff --git a/bundles/org.eclipse.test/src/org/eclipse/test/CoreTestApplication.java b/bundles/org.eclipse.test/src/org/eclipse/test/CoreTestApplication.java
deleted file mode 100644
index 3c4594e..0000000
--- a/bundles/org.eclipse.test/src/org/eclipse/test/CoreTestApplication.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.test;
-
-import java.io.IOException;
-import org.eclipse.core.boot.IPlatformRunnable;
-
-/**
- * A an application that launches tests once it is started.
- */
-public class CoreTestApplication implements IPlatformRunnable {
-	/** true if workspace tests should log their deltas */
-	private static boolean deltas= false;
-	
-	/**
-	 * Runs a set of tests as defined by the given command line args.
-	 * This is the platform application entry point.
-	 * @see IPlatformRunnable
-	 */
-	public Object run(Object arguments) throws Exception {
-		String[] args= processCommandLine((String[]) arguments);
-		return new Integer(runTests(args));
-	}
-
-	protected int runTests(String[] args) throws IOException {
-		return EclipseTestRunner.run(args);
-	}
-
-	public static boolean deltasEnabled() {
-		return deltas;
-	}
-		
-	protected String[] processCommandLine(String[] args) {
-		int[] configArgs = new int[100];
-		configArgs[0] = -1; // need to initialize the first element to something that could not be an index.
-		int configArgIndex = 0;
-		for (int i = 0; i < args.length; i++) {
-			boolean found = false;
-			// check for args without parameters (i.e., a flag arg)
-			// see if we should be logging deltas
-			if (args[i].equalsIgnoreCase("-deltas")) {
-				found = true;
-				deltas = true;
-			}
-			if (found) {
-				configArgs[configArgIndex++] = i;
-				continue;
-			}
-	
-			// check for args with parameters
-			if (i == args.length - 1 || args[i + 1].startsWith("-")) {
-				continue;
-			}
-			String arg = args[++i];
-
-			// done checking for args.  Remember where an arg was found 
-			if (found) {
-				configArgs[configArgIndex++] = i - 1;
-				configArgs[configArgIndex++] = i;
-			}
-		}
-	
-		//remove all the arguments consumed by this argument parsing
-		if (configArgIndex == 0)
-			return args;
-		String[] passThruArgs = new String[args.length - configArgIndex];
-		configArgIndex = 0;
-		int j = 0;
-		for (int i = 0; i < args.length; i++) {
-			if (i == configArgs[configArgIndex])
-				configArgIndex++;
-			else
-				passThruArgs[j++] = args[i];
-		}
-		return passThruArgs;
-	}
-}
diff --git a/bundles/org.eclipse.test/src/org/eclipse/test/EclipseTestRunner.java b/bundles/org.eclipse.test/src/org/eclipse/test/EclipseTestRunner.java
deleted file mode 100644
index d32f598..0000000
--- a/bundles/org.eclipse.test/src/org/eclipse/test/EclipseTestRunner.java
+++ /dev/null
@@ -1,480 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.test;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.PrintStream;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.Properties;
-import java.util.Vector;
-
-import junit.framework.AssertionFailedError;
-import junit.framework.Test;
-import junit.framework.TestListener;
-import junit.framework.TestResult;
-import junit.framework.TestSuite;
-
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.taskdefs.optional.junit.FormatterElement;
-import org.apache.tools.ant.taskdefs.optional.junit.JUnitResultFormatter;
-import org.apache.tools.ant.taskdefs.optional.junit.JUnitTest;
-
-import org.eclipse.core.runtime.Platform;
-
-/**
- * A TestRunner for JUnit that supports Ant JUnitResultFormatters
- * and running tests inside Eclipse.
- * Example call: EclipseTestRunner -classname junit.samples.SimpleTest formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter
- */
-public class EclipseTestRunner implements TestListener {
-	class TestFailedException extends Exception {
-		TestFailedException(String message) {
-			super(message);
-		}
-	} 
-	/**
-     * No problems with this test.
-     */
-    public static final int SUCCESS= 0;
-    /**
-     * Some tests failed.
-     */
-    public static final int FAILURES= 1;
-    /**
-     * An error occured.
-     */
-    public static final int ERRORS= 2;
-    
-    private static final String SUITE_METHODNAME= "suite";	
-	/**
-	 * debug mode
-	 */
-	private boolean debug= false;
-	/**
-	 * The current test result
-	 */
-	private TestResult fTestResult;
-	/**
-	 * The name of the plugin containing the test
-	 */
-	private String fTestPluginName;
-	/**
-     * The corresponding testsuite.
-     */
-    private Test fSuite;
-    /**
-     * Formatters from the command line.
-     */
-	private static Vector fgFromCmdLine= new Vector();
-	/**
-     * Holds the registered formatters.
-     */
-    private Vector formatters= new Vector();
-    /**
-     * Do we stop on errors.
-     */
-    private boolean fHaltOnError= false;
-    /**
-     * Do we stop on test failures.
-     */
-    private boolean fHaltOnFailure= false;
-    /**
-     * The TestSuite we are currently running.
-     */
-    private JUnitTest fJunitTest;
-    /** 
-     * output written during the test 
-     */
-    private PrintStream fSystemError;
-    /** 
-     * Error output during the test 
-     */
-    private PrintStream fSystemOut;   
-    /**
-     * Exception caught in constructor.
-     */
-    private Exception fException;
-    /**
-     * Returncode
-     */
-    private int fRetCode= SUCCESS;	
-    
-	/** 
-	 * The main entry point (the parameters are not yet consistent with
-	 * the Ant JUnitTestRunner, but eventually they should be).
-	 * Parameters<pre>
-	 * -className: the name of the testSuite
-	 * -testPluginName: the name of the containing plugin
-     * haltOnError: halt test on errors?
-     * haltOnFailure: halt test on failures?
-     * -testlistener listenerClass: deprecated
-     * 		print a warning that this option is deprecated
-     * formatter: a JUnitResultFormatter given as classname,filename. 
-     *  	If filename is ommitted, System.out is assumed.
-     * </pre>
-     */
-	public static void main(String[] args) throws IOException {
-		System.exit(run(args));
-	}
-	public static int run(String[] args) throws IOException {
-		String className= null;
-		String testPluginName= null;
-		
-        boolean haltError = false;
-        boolean haltFail = false;
-        
-        Properties props = new Properties();
-		
-		int startArgs= 0;
-		if (args.length > 0) {
-			// support the JUnit task commandline syntax where
-			// the first argument is the name of the test class
-			if (!args[0].startsWith("-")) {
-				className= args[0];
-				startArgs++;
-			}
-		} 
-		for (int i= startArgs; i < args.length; i++) {
-			if (args[i].toLowerCase().equals("-classname")) {
-				if (i < args.length-1)
-					className= args[i+1]; 
-				i++;	
-			} else if (args[i].toLowerCase().equals("-testpluginname")) {
-				if (i < args.length-1)
-					testPluginName= args[i+1]; 
-				i++;	
-			} else if (args[i].startsWith("haltOnError=")) {
-                haltError= Project.toBoolean(args[i].substring(12));
-            } else if (args[i].startsWith("haltOnFailure=")) {
-                haltFail = Project.toBoolean(args[i].substring(14));
-            } else if (args[i].startsWith("formatter=")) {
-                try {
-                    createAndStoreFormatter(args[i].substring(10));
-                } catch (BuildException be) {
-                    System.err.println(be.getMessage());
-                    return ERRORS;
-                }
-            } else if (args[i].startsWith("propsfile=")) {
-                FileInputStream in = new FileInputStream(args[i].substring(10));
-                props.load(in);
-                in.close();
-            } else if (args[i].equals("-testlistener")) {
-            	System.err.println("The -testlistener option is no longer supported\nuse the formatter= option instead");
-            	return ERRORS;
-			}
-        }
-			
-		if (className == null)
-			throw new IllegalArgumentException("Test class name not specified");
-		
-        JUnitTest t= new JUnitTest(className);
-
-        // Add/overlay system properties on the properties from the Ant project
-        Hashtable p= System.getProperties();
-        for (Enumeration enum = p.keys(); enum.hasMoreElements(); ) {
-            Object key = enum.nextElement();
-            props.put(key, p.get(key));
-        }
-        t.setProperties(props);
-	
-	    EclipseTestRunner runner= new EclipseTestRunner(t, testPluginName, haltError, haltFail);
-        transferFormatters(runner);
-        runner.run();
-        return runner.getRetCode();
-	}
-
-    /**
-     *   
-     */
-    public EclipseTestRunner(JUnitTest test, String testPluginName, boolean haltOnError, boolean haltOnFailure) {
-        fJunitTest= test;
-        fTestPluginName= testPluginName;
-        fHaltOnError= haltOnError;
-        fHaltOnFailure= haltOnFailure;
-        
-        try {
-            fSuite= getTest(test.getName());
-        } catch(Exception e) {
-            fRetCode = ERRORS;
-            fException = e;
-        }
-    }
-	
-	/**
-	 * Returns the Test corresponding to the given suite. 
-	 */
-	protected Test getTest(String suiteClassName) throws TestFailedException {
-		if (suiteClassName.length() <= 0) {
-			clearStatus();
-			return null;
-		}
-		Class testClass= null;
-		try {
-			testClass= loadSuiteClass(suiteClassName);
-		} catch (ClassNotFoundException e) {
-			String clazz= e.getMessage();
-			if (clazz == null) 
-				clazz= suiteClassName;
-			runFailed("Class not found \""+clazz+"\"");
-			return null;
-		} catch(Exception e) {
-			runFailed("Error: "+e.toString());
-			return null;
-		}
-		Method suiteMethod= null;
-		try {
-			suiteMethod= testClass.getMethod(SUITE_METHODNAME, new Class[0]);
-	 	} catch(Exception e) {
-	 		// try to extract a test suite automatically
-			clearStatus();			
-			return new TestSuite(testClass);
-		}
-		Test test= null;
-		try {
-			test= (Test)suiteMethod.invoke(null, new Class[0]); // static method
-			if (test == null)
-				return test;
-		} 
-		catch (InvocationTargetException e) {
-			runFailed("Failed to invoke suite():" + e.getTargetException().toString());
-			return null;
-		}
-		catch (IllegalAccessException e) {
-			runFailed("Failed to invoke suite():" + e.toString());
-			return null;
-		}
-		clearStatus();
-		return test;
-	}
-
-	protected void runFailed(String message) throws TestFailedException {
-		System.err.println(message);
-		throw new TestFailedException(message);
-	}
-
-	protected void clearStatus() {
-	}
-
-	/**
-	 * Loads the class either with the system class loader or a
-	 * plugin clsas loader if a plugin name was specified
-	 */
-	protected Class loadSuiteClass(String suiteClassName) throws ClassNotFoundException {
-		if (fTestPluginName == null)
-			return Class.forName(suiteClassName);
-		ClassLoader loader= getPluginClassLoader(fTestPluginName);
-		return loader.loadClass(suiteClassName);
-	}
-	
-	/**
-	 * Returns the Plugin class loader of the plugin containing the test.
-	 */
-	public ClassLoader getPluginClassLoader(String pluginName) {
-		if (Platform.getPluginRegistry().getPluginDescriptor(pluginName) != null)
-			return Platform.getPluginRegistry().getPluginDescriptor(pluginName).getPluginClassLoader();	
-		else
-			throw new IllegalArgumentException("No ClassLoader found for testplugin: " + pluginName);
-	}
-	
-	public void run() {
-        fTestResult= new TestResult();
-        fTestResult.addListener(this);
-        for (int i= 0; i < formatters.size(); i++) {
-            fTestResult.addListener((TestListener)formatters.elementAt(i));
-        }
-
-        long start= System.currentTimeMillis();
-        fireStartTestSuite();
-        
-        if (fException != null) { // had an exception in the constructor
-            for (int i= 0; i < formatters.size(); i++) {
-                ((TestListener)formatters.elementAt(i)).addError(null, fException);
-            }
-            fJunitTest.setCounts(1, 0, 1);
-            fJunitTest.setRunTime(0);
-        } else {
-            ByteArrayOutputStream errStrm = new ByteArrayOutputStream();
-            fSystemError= new PrintStream(errStrm);
-            
-            ByteArrayOutputStream outStrm = new ByteArrayOutputStream();
-            fSystemOut= new PrintStream(outStrm);
-
-            try {
-                fSuite.run(fTestResult);
-            } finally {
-                fSystemError.close();
-                fSystemError= null;
-                fSystemOut.close();
-                fSystemOut= null;
-                sendOutAndErr(new String(outStrm.toByteArray()), new String(errStrm.toByteArray()));
-                fJunitTest.setCounts(fTestResult.runCount(), fTestResult.failureCount(), fTestResult.errorCount());
-                fJunitTest.setRunTime(System.currentTimeMillis() - start);
-            }
-        }
-        fireEndTestSuite();
-
-        if (fRetCode != SUCCESS || fTestResult.errorCount() != 0) {
-            fRetCode = ERRORS;
-        } else if (fTestResult.failureCount() != 0) {
-            fRetCode = FAILURES;
-        }
-    }
-	
-    /**
-     * Returns what System.exit() would return in the standalone version.
-     *
-     * @return 2 if errors occurred, 1 if tests failed else 0.
-     */
-    public int getRetCode() {
-        return fRetCode;
-    }
-
-    /*
-     * @see TestListener.addFailure
-     */
-    public void startTest(Test t) {}
-
-    /*
-     * @see TestListener.addFailure
-     */
-    public void endTest(Test test) {}
-
-    /*
-     * @see TestListener.addFailure
-     */
-    public void addFailure(Test test, AssertionFailedError t) {
-        if (fHaltOnFailure) {
-            fTestResult.stop();
-        }
-    }
-
-    /*
-     * @see TestListener.addError
-     */
-    public void addError(Test test, Throwable t) {
-        if (fHaltOnError) {
-            fTestResult.stop();
-        }
-    }
-    
-	private void fireStartTestSuite() {
-		for (int i= 0; i < formatters.size(); i++) {
-            ((JUnitResultFormatter)formatters.elementAt(i)).startTestSuite(fJunitTest);
-        }
-    }
-
-    private void fireEndTestSuite() {
-        for (int i= 0; i < formatters.size(); i++) {
-            ((JUnitResultFormatter)formatters.elementAt(i)).endTestSuite(fJunitTest);
-        }
-    }
-
-    public void addFormatter(JUnitResultFormatter f) {
-        formatters.addElement(f);
-    }
-
-    /**
-     * Line format is: formatter=<classname>(,<pathname>)?
-     */
-    private static void createAndStoreFormatter(String line) throws BuildException {
-        FormatterElement fe = new FormatterElement();
-        String formatterClassName= null;
-        File formatterFile= null;
-        
-        int pos = line.indexOf(',');
-        if (pos == -1) {
-            formatterClassName= line;
-        } else {
-            formatterClassName= line.substring(0, pos);
-            formatterFile= new File(line.substring(pos + 1)); // the method is package visible
-        }
-        fgFromCmdLine.addElement(createFormatter(formatterClassName, formatterFile));
-    }
-
-    private static void transferFormatters(EclipseTestRunner runner) {
-        for (int i= 0; i < fgFromCmdLine.size(); i++) {
-            runner.addFormatter((JUnitResultFormatter)fgFromCmdLine.elementAt(i));
-        }
-    }
-
-	/*
-	 * DUPLICATED from FormatterElement, since it is package visible only
-	 */
-    private static JUnitResultFormatter createFormatter(String classname, File outfile) throws BuildException {
-    	OutputStream out= System.out;
-
-        if (classname == null) {
-            throw new BuildException("you must specify type or classname");
-        }
-        Class f = null;
-        try {
-            f= EclipseTestRunner.class.getClassLoader().loadClass(classname);
-        } catch (ClassNotFoundException e) {
-            throw new BuildException(e);
-        }
-
-        Object o = null;
-        try {
-            o = f.newInstance();
-        } catch (InstantiationException e) {
-            throw new BuildException(e);
-        } catch (IllegalAccessException e) {
-            throw new BuildException(e);
-        }
-
-        if (!(o instanceof JUnitResultFormatter)) {
-            throw new BuildException(classname+" is not a JUnitResultFormatter");
-        }
-
-        JUnitResultFormatter r = (JUnitResultFormatter) o;
-
-        if (outfile != null) {
-            try {
-                out = new FileOutputStream(outfile);
-            } catch (java.io.IOException e) {
-                throw new BuildException(e);
-            }
-        }
-        r.setOutput(out);
-        return r;
-    }
-
-    private void sendOutAndErr(String out, String err) {
-        for (int i=0; i<formatters.size(); i++) {
-            JUnitResultFormatter formatter = 
-                ((JUnitResultFormatter)formatters.elementAt(i));
-            
-            formatter.setSystemOutput(out);
-            formatter.setSystemError(err);
-        }
-    }
-    
-    protected void handleOutput(String line) {
-        if (fSystemOut != null) {
-            fSystemOut.println(line);
-        }
-    }
-    
-    protected void handleErrorOutput(String line) {
-        if (fSystemError != null) {
-            fSystemError.println(line);
-        }
-    }
-}	
diff --git a/bundles/org.eclipse.test/src/org/eclipse/test/RegressionTest.java b/bundles/org.eclipse.test/src/org/eclipse/test/RegressionTest.java
deleted file mode 100644
index 9c17af9..0000000
--- a/bundles/org.eclipse.test/src/org/eclipse/test/RegressionTest.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.test;
-
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.PrintStream;
-import java.util.StringTokenizer;
-
-/**
- * Check the output of several tests for regressions.
- */
-public class RegressionTest {
-
-	PrintStream output;
-	String oldFilename, newFilename, outFilename;
-	public static final String NOTHING_CHANGED_MSG
-		= "All tests unchanged.";	
-	/**
-	 * Constructor for RegressionTest
-	 */
-	public RegressionTest(	String oldFilename,
-							String newFilename,
-							String outFilename) {
-		this.oldFilename = oldFilename;
-		this.newFilename = newFilename;
-		this.outFilename = outFilename;
-	}
-
-	public static void main(String[] argv) {
-		if (argv.length < 3) {
-			System.err.println("Error: too few arguments");
-			System.err.println("Usage: (progname) oldfile newfile outfile");
-		} else {
-			// ASSERT: The program has at least the correct number of arguments
-			RegressionTest rt = new RegressionTest(argv[0], argv[1], argv[2]);
-			rt.testRegressions();
-		}
-	}
-
-	/**
-	 * Test for regressions in the test suite.
-	 */
-	public void testRegressions() {
-		// Read the old and new files
-		String oldPass = "";
-		String newPass = "";
-		try {
-			oldPass = readFile(oldFilename);
-			newPass = readFile(newFilename);
-		} catch (Exception e) {
-			System.err.println("Error opening input file");
-			System.err.println(e.getMessage());
-			System.exit(-1);
-		}
-
-		try {
-			output = new PrintStream(
-						new BufferedOutputStream(
-							new FileOutputStream(
-								new File(outFilename))));
-		} catch (Exception e) {
-			System.err.println("Error opening output file");
-			System.err.println(e.getMessage());
-			System.exit(-1);
-		}
-		// Establish their relationship
-		StringTokenizer oldst = new StringTokenizer(oldPass);
-		StringTokenizer newst = new StringTokenizer(newPass);
-
-		String[] oldTest = nextTest(oldst);
-		String[] newTest = nextTest(newst);
-
-		boolean nothingChanged = true;
-		while (oldTest != null && newTest != null) {
-
-			// Compare the two test names
-			int compareName = oldTest[0].compareTo(newTest[0]);
-			if (compareName == 0) {
-				int compareStatus = oldTest[1].compareTo(newTest[1]);
-				if (compareStatus != 0) {
-					nothingChanged = false;
-					output.println(testChanged(newTest));
-				}
-				oldTest = nextTest(oldst);
-				newTest = nextTest(newst);
-			} else if (compareName < 0) {
-				// oldTestName comes first
-				output.println(testNotRun(oldTest));
-				oldTest = nextTest(oldst);
-				nothingChanged = false;
-			} else {
-				// newTestName comes first
-				output.println(testAdded(newTest));
-				newTest = nextTest(newst);
-				nothingChanged = false;
-			}
-		}
-		// Make sure all tests are parsed
-		while (oldTest != null) {
-			// oldTestName comes first
-			output.println(testNotRun(oldTest));
-			oldTest = nextTest(oldst);
-			nothingChanged = false;
-		}
-		while (newTest != null) {
-			// newTestName comes first
-			output.println(testAdded(newTest));
-			newTest = nextTest(newst);
-			nothingChanged = false;
-		}
-		// Make sure that there is always some output.
-		if (nothingChanged) {
-			output.println(NOTHING_CHANGED_MSG);
-		}
-		output.close();
-	}
-
-	/**
-	 * Get the message for when a test is not run.
-	 */
-	static String testNotRun(String[] test) {
-		return "Not run: " + test[0];
-	}
-	
-	/**
-	 * Get the message for when a test's status changes.
-	 */
-	static String testChanged(String[] test) {
-		return "Changed: " + test[0] + ", " + test[1];
-	}
-	
-	/**
-	 * Get the message for when a test is added.
-	 */
-	static String testAdded(String[] test) {
-		return "New test: " + test[0] + ", Status: " + test[1];
-	}
-
-	/**
-	 * Read the file given by s, and return its contents.
-	 */
-	static String readFile(String s) throws IOException {
-		FileInputStream r = new FileInputStream(s);
-		int l = r.available();
-		byte[] b = new byte[l];
-		r.read(b);
-		r.close();
-		return new String(b);		
-	}
-	
-	/**
-	 * Returns the next 2 tokens in st, if they exist.
-	 * Returns null if they do not.
-	 */
-	static String[] nextTest(StringTokenizer st) {
-		String[] test = new String[2];
-		if (st.hasMoreTokens()) {
-			test[0] = st.nextToken();
-		} else {
-			return null;
-		}
-		if (st.hasMoreTokens()) {
-			test[1] = st.nextToken();
-		} else {
-			return null;
-		}
-		return test;
-	}
-}
-
diff --git a/bundles/org.eclipse.test/src/org/eclipse/test/UITestApplication.java b/bundles/org.eclipse.test/src/org/eclipse/test/UITestApplication.java
deleted file mode 100644
index 5f0cdd3..0000000
--- a/bundles/org.eclipse.test/src/org/eclipse/test/UITestApplication.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.test;
-
-import java.io.IOException;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.jface.window.Window;
-import org.eclipse.ui.internal.Workbench;
-
-/**
- * A Workbench that runs a test suite specified in the
- * command line arguments.
- */ 
-public class UITestApplication extends Workbench {
-	/**
-	 * Run an event loop for the workbench.
-	 */
-	protected void runEventLoop(Window.IExceptionHandler handler) {
-		// Dispatch all events.
-		Display display = Display.getCurrent();
-		while (true) {
-			try {
-				if (!display.readAndDispatch())
-					break;
-			} catch (Throwable e) {
-				break;
-			}
-		}
-
-		String[] arguments= getCommandLineArgs();
-		runTests(arguments);
-		close();		
-	}
-	
-	protected void runTests(String[] commandLineArgs) {
-		try {
-			EclipseTestRunner.main(commandLineArgs);	
-		} catch(IOException e) {
-			e.printStackTrace();
-		}	
-	}
-}
-
diff --git a/bundles/org.eclipse.test/test.xml b/bundles/org.eclipse.test/test.xml
deleted file mode 100644
index 52ed96e..0000000
--- a/bundles/org.eclipse.test/test.xml
+++ /dev/null
@@ -1,211 +0,0 @@
-<project name="Automated Eclipse Testing" default="all"  basedir="." >
-
-	<!--properties file containing the plugin directory name including version number-->
-	<property file="test.properties" />
-
-	<!--default directory where test-eclipse will be installed-->
-	<property name="install" value="${basedir}/test-eclipse" />
-	
-	<!--name that can be added to report name to identify which platform tests results come from-->
-	<property name="platform" value="" />
-
-	<!-- The root of the eclipse installation -->
-	<property name="eclipse-home" value="${install}/eclipse" />
-
-	<!-- The directory that will contain the xml and html results from the tests that are run -->
- 	<property name="results" value="${basedir}/results" />
-
-	<target name="init">
-	<!--  necessary condition for running org.eclipse.swt.tests--> 
-	 <condition property="win32">
-		<and>
-			<os family="windows" />
-    	</and>
-     </condition>
-		
-	<!--  necessary condition for running jdt core tests  -->
-   	<condition property="jvm14">
-		<and>
-      		<equals arg1="${ant.java.version}" arg2="1.4" />
-   		</and>
-	</condition>
-	</target>
-
-	<target name="setup" if="clean" description="Reinstall the test Eclipse installation if specified by user">
-		<delete dir="${install}" />
-		<mkdir dir="${install}" />
-		<exec dir="." executable="unzip">
-			<arg line="-o -qq eclipse-SDK-*.zip -d ${install}"/>
-	    	</exec>
-	
-		<exec dir="." executable="unzip">
-			<arg line="-o -qq eclipse-junit-tests-*.zip -d ${install}"/>
-    		</exec>
-	</target>
-
-	<target name="runtests" depends="setup" description="Runs ant on the test.xml for a specified plugin.  Requires a property value setting for testPlugin only if test.properties is not available.  The property testPlugin represents a directory name made up of the plugin id and plugin version.  This directory must contain a valid test.xml.">
-
-		<ant antfile="${eclipse-home}/plugins/${testPlugin}/test.xml" dir="${eclipse-home}" />
-		<copy file="${eclipse-home}/${report}.xml" tofile="${results}/xml/${report}_${platform}.xml" />
-
-	</target>
-
-	<target name="ant" description="Runs the org.eclipse.ant.tests.core test.xml">
-		<antcall target="runtests">
-			<param name="testPlugin" value="${org.eclipse.ant.tests.core}" />
-			<param name="report" value="org.eclipse.ant.tests.core" />
-		</antcall>
-	</target>
-
-	<target name="core" description="Runs the org.eclipse.core.tests.harness test.xml">
-		<antcall target="runtests">
-			<param name="testPlugin" value="${org.eclipse.core.tests.harness}" />
-			<param name="report" value="org.eclipse.core.tests" />
-		</antcall>
-	</target>
-	
-	<target name="relEng" description="Runs the org.eclipse.releng.tests test.xml">
-		<!--create directory that will hold chkpii results-->
-		<mkdir dir="${results}/chkpii" />
-		
-		<antcall target="runtests">
-			<param name="testPlugin" value="${org.eclipse.releng.tests}" />
-			<param name="report" value="org.eclipse.releng.tests" />
-		</antcall>
-
-		<move todir="${results}/chkpii" includeEmptyDirs="no">
-		    <fileset dir="${results}/chkpii"/>
-		    <mapper type="glob" from="*" to="${platform}_*"/>
-  		</move>
-	</target>
-	
-	<target name="help" description="Runs the org.eclipse.help.tests test.xml">      
-       		<antcall target="runtests" >
-    	   		<param name="testPlugin" value="${org.eclipse.help.tests}" />
-			<param name="report" value="org.eclipse.help.tests" />
-       		</antcall>
-	</target>
-	
-	<target name="jdtcorecompiler" if="jvm14" depends="init">
-		<antcall target="runtests" >
-			<param name="testPlugin" value="${org.eclipse.jdt.core.tests.compiler}" />
-			<param name="report" value="org.eclipse.jdt.core.tests.compiler" />
-		</antcall>
-	</target>
-	
-   <target name="jdtcorebuilder" if="jvm14" depends="init">
-		<antcall target="runtests" >
-			<param name="testPlugin" value="${org.eclipse.jdt.core.tests.builder}" />
-			<param name="report" value="org.eclipse.jdt.core.tests.builder" />
-		</antcall>
-	</target>
-
-	<target name="jdtcoremodel" if="jvm14" depends="init">
-		<antcall target="runtests" >
-			<param name="testPlugin" value="${org.eclipse.jdt.core.tests.model}" />
-			<param name="report" value="org.eclipse.jdt.core.tests.model" />
-		</antcall>
-	</target>
-
-	<target name="jdtdebug" description="Runs the org.eclipse.jdt.debug.tests test.xml">
-		<antcall target="runtests" >
-			<param name="testPlugin" value="${org.eclipse.jdt.debug.tests}" />
-			<param name="report" value="org.eclipse.jdt.debug.tests" />
-		</antcall>
-	</target>
-
-
-	<target name="jdtui" description="Runs the org.eclipse.jdt.ui.tests test.xml">
-		<antcall target="runtests" >
-			<param name="testPlugin" value="${org.eclipse.jdt.ui.tests}" />
-			<param name="report" value="org.eclipse.jdt.ui.tests" />
-		</antcall>
-	</target>
-
-
-	<target name="jdtuirefactoring" description="Runs the org.eclipse.jdt.ui.tests.refactoring test.xml">
-		<antcall target="runtests" >
-			<param name="testPlugin" value="${org.eclipse.jdt.ui.tests.refactoring}" />
-			<param name="report" value="org.eclipse.jdt.ui.tests.refactoring" />
-		</antcall>
-	</target>
-
-	
-	<target name="swt" depends="init" if="win32" description="Runs the org.eclipse.swt.tests test.xml but only on windows.">
-		<!--run swt automated tests on windows only-->
-       		<antcall target="runtests" >
-       			<param name="testPlugin" value="${org.eclipse.swt.tests}" />
-			<param name="report" value="org.eclipse.swt.tests" />
-       		</antcall>
- 	</target>
-
-
-	<target name="teamcore" description="Runs the org.eclipse.team.tests.core test.xml">      
-    		<antcall target="runtests" >
-    	  		<param name="testPlugin" value="${org.eclipse.team.tests.core}" />
-			<param name="report" value="org.eclipse.team.tests.core" />
-    		</antcall>
-	</target>
-
-
-	<target name="teamcvs" description="Runs the org.eclipse.team.tests.cvs.core test.xml.  This test requires additional setup.  See documentation in org.eclipse.team.tests.cvs.core">
-		<!--  Need to setup Eclipse first because of text replacement in a properties file  -->
-		<antcall target="setup" />
-
-		<!-- Fill in cvs repository information -->
-		<replace file="${eclipse-home}/plugins/${org.eclipse.team.tests.cvs.core}/repository.properties" token="@user@" value="@cvs_user@"/>
-		<replace file="${eclipse-home}/plugins/${org.eclipse.team.tests.cvs.core}/repository.properties" token="@password@" value="@cvs_password@"/>
-		<replace file="${eclipse-home}/plugins/${org.eclipse.team.tests.cvs.core}/repository.properties" token="@host@" value="@cvs_host@"/>
-		<replace file="${eclipse-home}/plugins/${org.eclipse.team.tests.cvs.core}/repository.properties" token="@root@" value="@cvs_root@"/>
-
-		<ant antfile="${eclipse-home}/plugins/${org.eclipse.team.tests.cvs.core}/test.xml" dir="${eclipse-home}" />
-
-		<copy file="${eclipse-home}/org.eclipse.team.tests.cvs.xml" tofile="${results}/xml/org.eclipse.team.tests.cvs_${platform}.xml" />
-
-   	</target>
-
-
-	<target name="ui" description="Runs the org.eclipse.ui.tests test.xml">
-		<antcall target="runtests">
-			<param name="testPlugin" value="${org.eclipse.ui.tests}" />
-			<param name="report" value="org.eclipse.ui.tests" />
-		</antcall>
-	</target>
-
-	<target name="update" description="Runs the org.eclipse.update.tests.core test.xml">
-	    	<antcall target="runtests" >
-			<param name="testPlugin" value="${org.eclipse.update.tests.core}" />
-			<param name="report" value="org.eclipse.update.tests.core" />
-      		</antcall>
-	</target>
-
-
-	<target name="all">
-		<antcall target="jdtdebug" />
-		<antcall target="ant" />
-		<antcall target="core" />
-		<antcall target="relEng" />
-		<antcall target="help" />
-		<antcall target="jdtui" />
-		<antcall target="swt" />
-		<antcall target="teamcvs" />
-		<antcall target="teamcore" />
-		<antcall target="ui" />
-		<antcall target="update" />
-		<antcall target="jdtuirefactoring" />
-		<antcall target="genHtml" />
-	</target>
-	
-	<target name="all14">
-		<antcall target="jdtcorebuilder" />
-		<antcall target="jdtcorecompiler" />
-		<antcall target="jdtcoremodel" />
-		<antcall target="genHtml" />
-	</target>
-
-	<target name="genHtml" description="Generates HTML results with provided JUNIT.XSL provided">
-		<style style="JUNIT.XSL" basedir="${results}/xml" destdir="${results}/html" />
-	</target>
-
-
-</project>
diff --git a/bundles/org.eclipse.test/testframework.html b/bundles/org.eclipse.test/testframework.html
deleted file mode 100644
index 9727bee..0000000
--- a/bundles/org.eclipse.test/testframework.html
+++ /dev/null
@@ -1,438 +0,0 @@
-<html>
-<head>
-<title>Eclipse Testing Instructions</title>
-</head>
-
-<body>
-<h1>The Eclipse Test Framework</h1>
-<p>Last Modified: Feb. 26, 2003</p>
-<p><font size="+1"><br>
-  Introduction</font></p>
-<p>The testing framework is comprised of the org.eclipse.test plugin and the org.eclipse.ant.optional.junit 
-  fragment. </p>
-<p>These two projects are available from the dev.eclipse.org repository and are 
-  included in the eclipse-Automated-Tests.&lt;buildid&gt;.zip from the eclipse.org 
-  downloads page.</p>
-<p><font size="+1">Building and Installation</font></p>
-<p>Since the org.eclipse.test plugin is stored in the repository in source-code 
-  form, it needs to be compiled before it can be used. The org.eclipse.ant.optional.junit 
-  fragment does not contain any source and can be used as is from the repository.</p>
-<ol>
-  <li>Turn of automatic builds. Window->Preferences->Workbench and uncheck "Perform 
-    build automatically on resource modification"</li>
-  <li>Load org.eclipse.test into your workspace.</li>
-  <li>Right-click on the org.eclipse.test project in either the Navigator or Packages 
-    view. Select 'Rebuild Project' from the context menu. This will compile the 
-    entire org.eclipse.test plugin.</li>
-  <li>Finally, copy the org.eclipse.test plugin into your target Eclipse.</li>
-  <li>The org.eclipse.ant.optional.junit fragment only needs to be present in 
-    the environment of the Eclipse that is overseeing the test process. If you 
-    are running the test script from within the Workbench, this means that the 
-    fragments need to be present withinn your development Eclipse. If you are 
-    running the tests from the command line, then the fragments will need to be 
-    present in your target Eclipse.</li>
-</ol>
-<p><font size="+1">Setup</font></p>
-<p>Follow the steps given above to build and install all of the neccessary plugins 
-  and fragments. Please note that the current version of the test framework is 
-  not compatible with the PDE notion of self-hosting. If you want to run the tests, 
-  you will need to setup a full target Eclipse so that the testing framework can 
-  detect everything that is needed.</p>
-
-<p>If you are writing tests for one or more Eclipse plugins, then you should
-create a separate plugin for tests. The test plugin will contain all of the
-tests that will be run on your development plugins, as well as defining how
-those tests get run.</p>
-
-<p>If you are not writing tests for an Eclipse plugin, then you should look into 
-  using JUnit on its own to test your work. JUnit is designed for testing Java 
-  code, and by default has no knowledge of Eclipse. There are separate mechanisms 
-  for using JUnit on Java code in Eclipse. See the documentation provided here:</p>
-<p> <a href="http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/jdt-ui-home/plugins/org.eclipse.jdt.junit/index.html">JUnit 
-  Support in Eclipse</a><br>
-  <a href="http://dev.eclipse.org:8080/help/content/help:/org.eclipse.jdt.doc.user/tasks/tasks-207.htm?resultof=%6a%75%6e%69%74%20&toc=%2Forg.eclipse.jdt.doc.user%2Ftoc.xml">Using 
-  JUnit</a></p>
-
-<p>Once a test plugin has been created, you must then create an Ant script that 
-  will run all of the tests. Create a file called 'test.xml', which is a sibling 
-  of 'plugin.xml'. This file defines how each test is going to be run. The 'test.xml' 
-  file is like a DOS batch file that scripts the entire testing process. Typically, 
-  the 'test.xml' file will contain targets for setting up the test run, executing 
-  the tests, cleaning up afterwards, and running the entire process.</p>
-<p>&nbsp;</p>
-<p><font size="+1">Converting existing Test Suites</font></p>
-
-<p>If you are converting an existing set of tests to use the new framework, the
-actual tests that have been written should not need much change.</p>
-
-<p>If you have tests in multiple plugins, it is helpful to designate one plugin
-as the main plugin for your component. This can be one of your existing
-plugins, or it can be a new plugin, created specifically for this purpose. Your
-main plugin is the only plugin that needs to contain a 'test.xml' script. This
-script can invoke the tests in each of your other plugins, so there is no need
-for multiple scripts. Your main plugin does not need to depend on your other
-plugins at all.</p>
-
-<p>Make sure that the tests are defined in a plugin. This is probably the most 
-  common cause of confusion in the entire test process. Your tests need to be 
-  in a plugin so that Eclipse can find them when it tries to load them.</p>
-<p>&nbsp;</p>
-<p><font size="+1">Creating new Test Suites</font></p>
-<p>Creating new JUnit tests for an Eclipse plugin should be no more difficult 
-  than writing standard JUnit tests. Since the framework allows tests to be run 
-  inside of a working Eclipse, any tests that you write have available to them 
-  any of the methods supplied by the Eclipse platform, provided that you add the 
-  appropriate dependencies to your tests' 'plugin.xml'.</p>
-<p>&nbsp;</p>
-<p><font size="+1">Performance Issues</font></p>
-<p>You should keep in mind the number of times that Eclipse needs to be
-started. Launching Eclipse has a substantial cost in terms of runtime. To
-minimize the number of times the platform is started, you should consider
-writing a TestSuite called AllTests for each of your test plugins. AllTests
-should invoke each of the tests that you want to run for a particular plugin.
-The 'test.xml' file can then run the AllTests class, which will run all of your
-tests, but the platform will only ever be started once for each of your test
-plugins.</p>
-
-<p>Note: Sometimes tests involve shutting down, restarting, and testing the state 
-  of metadata that was written to disk. These session tests will require Eclipse 
-  to be launched several times in sequence, which will increase the runtime of 
-  your tests. This cannot be avoided.</p>
-<p>&nbsp;</p>
-<p><font size="+1">Running the Test Suite from the UI</font></p>
-<p>Right click on the test.xml file and select 'Run Ant...' from the pull-down 
-  menu. The Running Ant dialog box pops up. From the list of targets, select the 
-  one that runs all of your tests. If you are using the example file provided 
-  below, this target is called 'Run', and will be selected by default. Hit the 
-  'Finish' button to start the test process.</p>
-<p><font size="+1">Running the Test Suite from the command line</font></p>
-<p>When the test suites are invoked automatically, they are run from command
-line. From the ${eclipse-home} directory, the command to use is:</p>
-
-<code>java -cp
-startup.jar org.eclipse.core.launcher.UIMain -application
-org.eclipse.ant.core.antRunner -buildfile ${test-plugin-path}\test.xml
--Declipse-home=${eclipse-home}</code>
-
-<p>Individual tests can also be invoked directly. From the ${eclipse-home}
-directory, use the command:</p>
-
-<code>java -cp startup.jar org.eclipse.core.launcher.UIMain -application ${launcher} 
--dev bin -testlistener org.eclipse.test.XMLTestListener -testpluginname ${plugin-name} 
--classname ${test-classname}</code> 
-<p>where ${launcher} is one of: <i>org.eclipse.test.uitestapplication</i> or <i>org.eclipse.test.coretestapplication</i> 
-  depending on whether or not you want to run your tests within an active Workbench.</p>
-<p><font size="+1">Output</font></p>
-
-<p>By default, output from each test run is logged as XML. For each test that 
-  is run, the output is logged into the file called ${classname}.xml. The individual 
-  XML files are located in the ${eclipse-home} directory. When the test run is 
-  finished, you can call the <b>&quot;collect&quot;</b> target in the library 
-  file, which will collect the XML into a single file. See below for an example 
-  of how to use this target correctly.</p>
-
-<p>The JUnit integration in Eclipse supports various advanced features, such as
-<b>Regression Testing</b>, <b>Email Notification</b>, and <b>HTML Output</b>.
-These features are currently under development, and do not yet have a
-standardized way to add them to a test run.</p>
-
-<h3>Other issues</h3>
-
-<h4>Headless Testing vs. UI testing</h4>
-
-<p>Many plugin tests will not need the Workbench active in order to run. Indeed, 
-  only the minimum number of plugins needed to run the plugin being tested need 
-  to be present when testing in a target Eclipse. There are two different Ant 
-  targets provided for running Eclipse plugin tests. One target starts the entire 
-  Workbench. The other starts Eclipse with the minimum number of plugins needed. 
-  It is up to you to decide which target is most appropriate. For examples, look 
-  at the <b>&quot;ui-test&quot;</b> and <b>&quot;core-test&quot;</b> targets below.</p>
-
-<h4>Disposing the Display</h4>
-
-<p>Some low-level tests for the Eclipse platform take actions that are not
-normally possible inside of Eclipse. An example of this behaviour would be
-disposing the display. While this action can be performed while running the UI,
-it will also kill the UI for the copy of Eclipse that is running, and cause
-errors when the Workbench tries to shutdown. If you need to test disposing the
-display, or other similar actions, your tests should be running without a UI. </p>
-
-<h4>Tests that are not plugins</h4>
-
-<p>It is very easy to forget to define your tests inside of a plugin. If your 
-  tests will not load properly, make sure that a 'plugin.xml' file exists in your 
-  test project, and also that the plugin is being loaded by the platform. Make 
-  sure that all of the dependencies are satisfied for your test plugin.</p>
-<p><font size="+1">Interface</font></p>
-
-<p>The org.eclipse.test plugin defines many useful Ant tasks/targets to aid developers 
-  in writing their test.xml scripts. Currently, there is only Ant targets defined, 
-  which can be called using Ant's built-in &lt;ant&gt; task. To use these targets, 
-  add the following line to the top of your script, and reference the ${library-file} 
-  property when calling &lt;ant&gt;:</p>
-
-<code>&lt;property name=&quot;library-file&quot;
-value=&quot;${eclipse-home}/fragments/org.eclipse.test/library.xml&quot;/&gt; </code>
-
-<p>The targets that are defined are: </p>
-
-<ul>
-  <li><b>ui-test</b> - This target runs a JUnit test suite inside of an Eclipse 
-    Workbench. This target is mainly for testing plugins that use the Eclipse 
-    UI and JFace. The output of the test pass is automatically logged in an XML 
-    file called ${classname}.xml. It takes four arguments: </li>
- <ul>
-  <li><i>data-dir</i> - The
-      data directory of the Eclipse that gets run</li>
-  <li><i>plugin-name</i> -
-      The name of the plugin that the test suite is defined in</li>
-  <li><i>classname</i> -
-      The name of the class that the test suite is defined in</li>
-  <li><i>vmargs</i> - An
-      optional argument string to pass to the VM running the tests</li>
- </ul>
-
-<p>For example, the following code will run the test
-org.eclipse.foo.bar.MyTest in the plugin org.eclipse.foo in a new Eclipse
-workbench. It passes the string &quot;-Dbaz=true&quot; to the VM. The Eclipse
-stores its metadata in the directory &quot;data-folder&quot;. 
-
-<code><pre>
-&lt;ant target=&quot;ui-test&quot; antfile=&quot;${library-file}&quot; dir=&quot;${eclipse-home}&quot;&gt;
-  &lt;property name=&quot;data-dir&quot; value=&quot;data-folder&quot;/&gt;
-  &lt;property name=&quot;plugin-name&quot; value=&quot;org.eclipse.foo&quot;/&gt;
-  &lt;property name=&quot;classname&quot; value=&quot;org.eclipse.foo.bar.MyTest&quot;/&gt;
-  &lt;property name=&quot;vmargs&quot; value=&quot;-Dbaz=true&quot;/&gt;
-&lt;/ant&gt;
-</pre></code>
-
-  <li><b>core-test</b> - This target runs a JUnit test suite inside of an IPlatformRunnable. 
-    This target is for testing plugins that use the Eclipse platform, but do not 
-    require a UI to be running. The output of the test pass is automatically logged 
-    in an XML file called ${classname}.xml. It takes four arguments: </li>
- <ul>
-  <li><i>data-dir</i> - The
-      data directory of the Eclipse that gets run</li>
-  <li><i>plugin-name</i> -
-      The name of the plugin that the test suite is defined in</li>
-  <li><i>classname</i> -
-      The name of the class that the test suite is defined in</li>
-  <li><i>vmargs</i> - An
-      optional argument string to pass to the VM running the tests</li>
- </ul>
-
-<p>For example, the following code will run the test
-org.eclipse.foo.bar.MyTest in the plugin org.eclipse.foo in a headless Eclipse.
-It passes the string &quot;-Dbaz=true&quot; to the VM. The Eclipse stores its
-metadata in the directory &quot;data-folder&quot;.
-
-<code><pre>
-&lt;ant target=&quot;core-test&quot; antfile=&quot;${library-file}&quot; dir=&quot;${eclipse-home}&quot;&gt;
-  &lt;property name=&quot;data-dir&quot; value=&quot;data-folder&quot;/&gt;
-  &lt;property name=&quot;plugin-name&quot; value=&quot;org.eclipse.foo&quot;/&gt;
-  &lt;property name=&quot;classname&quot; value=&quot;org.eclipse.foo.bar.MyTest&quot;/&gt;
-  &lt;property name=&quot;vmargs&quot; value=&quot;-Dbaz=true&quot;/&gt;
-&lt;/ant&gt;
-</pre></code>
-
- <li><b>collect</b> - This
-     target collects the XML files that are produced over the course of the
-     test script. It takes two arguments: </li>
- <ul>
-  <li><i>includes</i> - A
-      pattern matching all XML files to be included in the test report. This
-      argument is typically &quot;org*.xml&quot;</li>
-  <li><i>output-file</i> -
-      The filename where the output of the test gets stored. For the automated
-      build process, this file should be ${pluginname}.xml, and be located in
-      the ECLIPSE_HOME directory.</li>
- </ul>
-
-<p>For example, the following code collects all of the files
-matching the pattern &quot;org*.xml&quot; in the directory ${eclipse-home},
-into the file named &quot;logfile.xml&quot;.
-
-<code><pre>
-&lt;ant target=&quot;collect&quot; antfile=&quot;${library-file}&quot; dir=&quot;${eclipse-home}&quot;&gt;
-  &lt;property name=&quot;includes&quot; value=&quot;org*.xml&quot;/&gt;
-  &lt;property name=&quot;output-file&quot; value=&quot;logfile.xml&quot;/&gt;
-&lt;/ant&gt;
-</pre></code>
-
-  <li><b>test-regressions</b> - This target takes two compound XML files (after 
-    a collect - even if collect is only given 1 file), and produces a text file 
-    that contains a list of all test status changes that occur between the two 
-    files. It will report new tests added, old tests that weren't run, and tests 
-    whose status changed (pass to fail, or fail to pass). This target takes three 
-    arguments: </li>
- <ul>
-  <li><i>oldfile</i> - the
-      baseline file to compare against</li>
-  <li><i>newfile</i> - the
-      file containing the results of the most recent test run</li>
-  <li><i>outfile</i> - the
-      file in which to place the results of the regression test</li>
- </ul>
-
-<p>For example, the following code compares the test runs that
-were logged into the files &quot;old.xml&quot; and &quot;new.xml&quot;, and
-creates a file called &quot;output.txt&quot; that holds the differences between
-the two runs.
-
-<code><pre>
-&lt;ant target=&quot;test-regressions&quot; antfile=&quot;${library-file}&quot; dir=&quot;${eclipse-home}&quot;&gt;
-  &lt;property name=&quot;oldfile&quot; value=&quot;old.xml&quot;/&gt;
-  &lt;property name=&quot;newfile&quot; value=&quot;new.xml&quot;/&gt;
-  &lt;property name=&quot;outfile&quot; value=&quot;output.txt&quot;/&gt;
-&lt;/ant&gt;
-</pre></code>
-
- <li><b>notify</b> - This target
-     sends email notification of the status of the latest test run. Typically,
-     this sends the results of the latest regression test to a developer so
-     that new test failures can be detected quickly. This target takes two
-     parameters: </li>
- <ul>
-  <li><i>infile</i> - the
-      name of the file containing the message to send</li>
-  <li><i>address</i> - the
-      email address to send the file to</li>
- </ul>
-
-<p>For example, the following code will mail the contents of
-the file &quot;output.txt&quot; to the address &quot;foo@bar.com&quot;. 
-
-<code><pre>
-&lt;ant target=&quot;notify&quot; antfile=&quot;${library-file}&quot; dir=&quot;${eclipse-home}&quot;&gt;
-  &lt;property name=&quot;infile&quot; value=&quot;output.txt&quot;/&gt;
-  &lt;property name=&quot;address&quot; value=&quot;foo@bar.com&quot;/&gt;
-&lt;/ant&gt;
-</pre></code>
-</ul>
-
-<h2>Examples:</h2>
-
-<p>Included is the 'test.xml' file from the org.eclipse.ui.tests plugin. This
-file controls all of the automated testing that is done for the org.eclipse.ui
-plugin. It can be run from inside of Eclipse or from the command line. It is
-intended to serve as a template file for testing any other plugin.</p>
-
-<p>Notice that the structure of the file roughly mirrors that of a JUnit test.
-Targets are defined for setting up the tests, defining what needs to be done,
-cleaning up after the tests, and running everything in the right order.</p>
-
-<font color="red">This example is out of date.
-<code><pre>
-&lt;?xml version="1.0"?&gt;
-
-&lt;project name="testsuite" default="run" basedir="."&gt;
-  &lt;!-- The property ${eclipse-home} should be passed into this script --&gt;
-  &lt;!-- Set a meaningful default value for when it is not. --&gt;
-  &lt;property name="eclipse-home" value="${basedir}/../.."/&gt;
-
-  &lt;!-- sets the properties eclipse-home, and library-file --&gt;
-  &lt;property name="plugin-name" value="org.eclipse.ui.tests"/&gt;
-  &lt;property name="library-file"
-            value="${eclipse-home}/fragments/org.eclipse.test/library.xml"/&gt;
-
-  &lt;!-- This target holds all initialization code that needs to be done for --&gt;
-  &lt;!-- all tests that are to be run. Initialization for individual tests --&gt;
-  &lt;!-- should be done within the body of the suite target. --&gt;
-  &lt;target name="init"&gt;
-    &lt;tstamp/&gt;
-    &lt;delete&gt;
-      &lt;fileset dir="${eclipse-home}" includes="org*.xml"/&gt;
-    &lt;/delete&gt;
-  &lt;/target&gt;
-
-  &lt;!-- This target defines the tests that need to be run. --&gt;
-  &lt;target name="suite"&gt;
-    &lt;property name="session-folder" 
-              value="${eclipse-home}/ui_session_sniff_folder"/&gt;
-    &lt;delete dir="${session-folder}" quiet="true"/&gt;
-    &lt;ant target="ui-test" antfile="${library-file}" dir="${eclipse-home}"&gt;
-      &lt;property name="data-dir" value="${session-folder}"/&gt;
-      &lt;property name="plugin-name" value="${plugin-name}"/&gt;
-      &lt;property name="classname" 
-                value="org.eclipse.ui.tests.api.SessionCreateTest"/&gt;
-    &lt;/ant&gt;
-    &lt;ant target="ui-test" antfile="${library-file}" dir="${eclipse-home}"&gt;
-      &lt;property name="data-dir" value="${session-folder}"/&gt;
-      &lt;property name="plugin-name" value="${plugin-name}"/&gt;
-      &lt;property name="classname"
-                value="org.eclipse.ui.tests.api.SessionRestoreTest"/&gt;
-    &lt;/ant&gt;
-
-    &lt;property name="sniff-folder"
-              value="${eclipse-home}/ui_sniff_folder"/&gt;
-    &lt;delete dir="${sniff-folder}" quiet="true"/&gt;
-    &lt;ant target="ui-test" antfile="${library-file}" dir="${eclipse-home}"&gt;
-      &lt;property name="data-dir" value="${sniff-folder}"/&gt;
-      &lt;property name="plugin-name" value="${plugin-name}"/&gt;
-      &lt;property name="classname"
-                value="org.eclipse.ui.tests.UiTestSuite"/&gt;
-    &lt;/ant&gt;
-  &lt;/target&gt;
-
-  &lt;!-- This target holds code to cleanup the testing environment after --&gt;
-  &lt;!-- after all of the tests have been run. You can use this target to --&gt;
-  &lt;!-- delete temporary files that have been created. --&gt;
-  &lt;target name="cleanup"&gt;
-  &lt;/target&gt;
-
-  &lt;!-- This target runs the test suite. Any actions that need to happen --&gt;
-  &lt;!-- after all the tests have been run should go here. --&gt;
-  &lt;target name="run" depends="init,suite,cleanup"&gt;
-    &lt;ant target="collect" antfile="${library-file}" dir="${eclipse-home}"&gt;
-      &lt;property name="includes" value="org*.xml"/&gt;
-      &lt;property name="output-file" value="${plugin-name}.xml"/&gt;
-    &lt;/ant&gt;
-  &lt;/target&gt;
-
-&lt;/project&gt;
-</pre></code>
-</font>
-<h2>Known Issues:</h2>
-
-<h4>Problem 1: Issues with Ant 1.3</h4>
-
-<p>Ant 1.3 has some issues when used with the &lt;style&gt; tag and absolute
-paths. Also, any tests that use the <code>System.exit()</code> call will not
-log their output properly when using Ant 1.3.</p>
-
-<h4>Problem 2: ECLIPSE_HOME</h4>
-
-<p>The test suites need to know where the root of the eclipse install is on the
-file system (the ECLIPSE_HOME variable). However, this variable is only defined
-in JDT. The ${eclipse-home} property can be set to a reasonable default inside
-of the test.xml script. Then tests can be run from the standard Ant window,
-without having to specify -Declipse-home=%ECLIPSE_HOME%. If a value for
-${eclipse-home} does get passed in, the default (specified in test.xml) gets
-overridden. The parameter is passed in by the build mechanism. For most cases,
-the value &quot;${basedir}/../..&quot; is a reasonable default.</p>
-
-<h4>Problem 3: Ugly reference to library.xml</h4>
-
-<p>org.eclipse.test should provide Ant tasks, not template scripts.</p>
-
-<h4>Problem 4: No console output</h4>
-
-<p>When you run a TestSuite using the standard JUnit, it normally outputs a
-series of dots to the console so that you can track the TestSuite's progress.
-It is not possible to add this feature to the automated testing process at this
-point in time.</p>
-
-<h4>Problem 5: Ant java task on Linux</h4>
-
-<p>Ant expects there to be a java executable on the system path. Furthermore, the executable
-must be a real file, not a symbolic link. If the test framework is throwing an exception
-<code>java.io.IOException: java: not found</code>, ensure that the java executable is on
-your system path.</p>
-
-<h4>Problem 6: PDE</h4>
-<p>The testing framework currently has no knowledge of PDE. In order to run the automated
-you must be running a self hosting environment with a full development and target Eclipse.</p>
-
-</body>
-
-</html>
diff --git a/bundles/org.eclipse.test/xalan.jar b/bundles/org.eclipse.test/xalan.jar
deleted file mode 100644
index c489ee7..0000000
--- a/bundles/org.eclipse.test/xalan.jar
+++ /dev/null
Binary files differ
diff --git a/features/org.eclipse.sdk.examples-feature/.project b/features/org.eclipse.sdk.examples-feature/.project
deleted file mode 100644
index f716f11..0000000
--- a/features/org.eclipse.sdk.examples-feature/.project
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.sdk.examples-feature</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-	</buildSpec>
-	<natures>
-	</natures>
-</projectDescription>
diff --git a/features/org.eclipse.sdk.examples-feature/build.properties b/features/org.eclipse.sdk.examples-feature/build.properties
deleted file mode 100644
index 849896c..0000000
--- a/features/org.eclipse.sdk.examples-feature/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-bin.includes =\
-cpl-v10.html,\
-eclipse_update_120.jpg,\
-feature.xml,\
-feature.properties,\
-license.html
diff --git a/features/org.eclipse.sdk.examples-feature/cpl-v10.html b/features/org.eclipse.sdk.examples-feature/cpl-v10.html
deleted file mode 100644
index 36aa208..0000000
--- a/features/org.eclipse.sdk.examples-feature/cpl-v10.html
+++ /dev/null
@@ -1,125 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<HTML>
-<HEAD>
-<TITLE>Common Public License - v 1.0</TITLE>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-</HEAD>
-
-<BODY BGCOLOR="#FFFFFF" VLINK="#800000">
-
-
-<P ALIGN="CENTER"><B>Common Public License - v 1.0</B>
-<P><B></B><FONT SIZE="3"></FONT>
-<P><FONT SIZE="3"></FONT><FONT SIZE="2">THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT").  ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.</FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"><B>1.  DEFINITIONS</B></FONT>
-<P><FONT SIZE="2">"Contribution" means:</FONT>
-
-<UL><FONT SIZE="2">a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and<BR CLEAR="LEFT">
-b) in the case of each subsequent Contributor:</FONT></UL>
-
-
-<UL><FONT SIZE="2">i)	 	changes to the Program, and</FONT></UL>
-
-
-<UL><FONT SIZE="2">ii)		additions to the Program;</FONT></UL>
-
-
-<UL><FONT SIZE="2">where such changes and/or additions to the Program originate from and are distributed by that particular Contributor.  </FONT><FONT SIZE="2">A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf.  </FONT><FONT SIZE="2">Contributions do not include additions to the Program which:  (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.  </FONT></UL>
-
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">"Contributor" means any person or entity that distributes the Program.</FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.  </FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2">"Program" means the Contributions distributed in accordance with this Agreement.</FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.</FONT>
-<P><FONT SIZE="2"><B></B></FONT>
-<P><FONT SIZE="2"><B>2.  GRANT OF RIGHTS</B></FONT>
-
-<UL><FONT SIZE="2"></FONT><FONT SIZE="2">a)	</FONT><FONT SIZE="2">Subject to the terms of this Agreement, each Contributor hereby grants</FONT><FONT SIZE="2"> Recipient a non-exclusive, worldwide, royalty-free copyright license to</FONT><FONT SIZE="2" COLOR="#FF0000"> </FONT><FONT SIZE="2">reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.</FONT></UL>
-
-
-<UL><FONT SIZE="2"></FONT></UL>
-
-
-<UL><FONT SIZE="2"></FONT><FONT SIZE="2">b) 	Subject to the terms of this Agreement, each Contributor hereby grants </FONT><FONT SIZE="2">Recipient a non-exclusive, worldwide,</FONT><FONT SIZE="2" COLOR="#008000"> </FONT><FONT SIZE="2">royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form.  This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents.  The patent license shall not apply to any other combinations which include the Contribution.  No hardware per se is licensed hereunder.   </FONT></UL>
-
-
-<UL><FONT SIZE="2"></FONT></UL>
-
-
-<UL><FONT SIZE="2">c)	Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity.  Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise.  As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any.  For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.</FONT></UL>
-
-
-<UL><FONT SIZE="2"></FONT></UL>
-
-
-<UL><FONT SIZE="2">d)	Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. </FONT></UL>
-
-
-<UL><FONT SIZE="2"></FONT></UL>
-
-<P><FONT SIZE="2"><B>3.  REQUIREMENTS</B></FONT>
-<P><FONT SIZE="2"><B></B>A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:</FONT>
-
-<UL><FONT SIZE="2">a)	it complies with the terms and conditions of this Agreement; and</FONT></UL>
-
-
-<UL><FONT SIZE="2">b)	its license agreement:</FONT></UL>
-
-
-<UL><FONT SIZE="2">i)	effectively disclaims</FONT><FONT SIZE="2"> on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; </FONT></UL>
-
-
-<UL><FONT SIZE="2">ii) 	effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; </FONT></UL>
-
-
-<UL><FONT SIZE="2">iii)</FONT><FONT SIZE="2">	states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and</FONT></UL>
-
-
-<UL><FONT SIZE="2">iv)	states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.</FONT><FONT SIZE="2" COLOR="#0000FF"> </FONT><FONT SIZE="2" COLOR="#FF0000"></FONT></UL>
-
-
-<UL><FONT SIZE="2" COLOR="#FF0000"></FONT><FONT SIZE="2"></FONT></UL>
-
-<P><FONT SIZE="2">When the Program is made available in source code form:</FONT>
-
-<UL><FONT SIZE="2">a)	it must be made available under this Agreement; and </FONT></UL>
-
-
-<UL><FONT SIZE="2">b)	a copy of this Agreement must be included with each copy of the Program.  </FONT></UL>
-
-<P><FONT SIZE="2"></FONT><FONT SIZE="2" COLOR="#0000FF"><STRIKE></STRIKE></FONT>
-<P><FONT SIZE="2" COLOR="#0000FF"><STRIKE></STRIKE></FONT><FONT SIZE="2">Contributors may not remove or alter any copyright notices contained within the Program.  </FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.  </FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"><B>4.  COMMERCIAL DISTRIBUTION</B></FONT>
-<P><FONT SIZE="2">Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like.  While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors.   Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering.  The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement.  In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations.  The Indemnified Contributor may participate in any such claim at its own expense.</FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">For example, a Contributor might include the Program in a commercial product offering, Product X.  That Contributor is then a Commercial Contributor.  If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone.  Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.</FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2" COLOR="#0000FF"></FONT>
-<P><FONT SIZE="2" COLOR="#0000FF"></FONT><FONT SIZE="2"><B>5.  NO WARRANTY</B></FONT>
-<P><FONT SIZE="2">EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is</FONT><FONT SIZE="2"> solely responsible for determining the appropriateness of using and distributing </FONT><FONT SIZE="2">the Program</FONT><FONT SIZE="2"> and assumes all risks associated with its exercise of rights under this Agreement</FONT><FONT SIZE="2">, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, </FONT><FONT SIZE="2">programs or equipment, and unavailability or interruption of operations</FONT><FONT SIZE="2">.  </FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2"><B>6.  DISCLAIMER OF LIABILITY</B></FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2">EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES </FONT><FONT SIZE="2">(INCLUDING WITHOUT LIMITATION LOST PROFITS),</FONT><FONT SIZE="2"> HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"><B>7.  GENERAL</B></FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2">If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.</FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed.  In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. </FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance.  If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable.  However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.  </FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2">Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted  and may only be modified in the following manner. The Agreement Steward reserves the right to </FONT><FONT SIZE="2">publish new versions (including revisions) of this Agreement from time to </FONT><FONT SIZE="2">time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward.   IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity.  </FONT><FONT SIZE="2">Each new version of the Agreement will be given a distinguishing version number.  The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new </FONT><FONT SIZE="2">version.  </FONT><FONT SIZE="2">Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, </FONT><FONT SIZE="2">by implication, estoppel or otherwise</FONT><FONT SIZE="2">.</FONT><FONT SIZE="2">  All rights in the Program not expressly granted under this Agreement are reserved.</FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose.  Each party waives its rights to a jury trial in any resulting litigation.</FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT>
-
-</BODY>
-
-</HTML>
\ No newline at end of file
diff --git a/features/org.eclipse.sdk.examples-feature/eclipse_update_120.jpg b/features/org.eclipse.sdk.examples-feature/eclipse_update_120.jpg
deleted file mode 100644
index 68e3e02..0000000
--- a/features/org.eclipse.sdk.examples-feature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/features/org.eclipse.sdk.examples-feature/feature.properties b/features/org.eclipse.sdk.examples-feature/feature.properties
deleted file mode 100644
index 0bb28d4..0000000
--- a/features/org.eclipse.sdk.examples-feature/feature.properties
+++ /dev/null
@@ -1,99 +0,0 @@
-# feature.properties
-# contains externalized strings for feature.xml
-# "%foo" in feature.xml corresponds to the key "foo" in this file
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file should be translated.
-
-# "featureName" property - name of the feature
-featureName=Eclipse SDK Examples
-
-# "providerName" property - name of the company that provides the feature
-providerName=Eclipse.org
-
-# "updateSiteName" property - label for the update site
-updateSiteName=Eclipse.org update site
-
-# "description" property - description of the feature
-description=Eclipse SDK examples. Used in conjunction with Eclipse Project SDK.
-
-# "licenseURL" property - URL of the "Feature License"
-# do not translate value - just change to point to a locale-specific HTML page
-licenseURL=license.html
-
-# "license" property - text of the "Feature Update License"
-# should be plain text version of license agreement pointed to be "licenseURL"
-license=\
-ECLIPSE.ORG SOFTWARE USER AGREEMENT\n\
-17th June, 2002\n\
-\n\
-ECLIPSE.ORG MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
-OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
-USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
-AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU\n\
-AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
-AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE\n\
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
-OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
-BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
-\n\
-Unless otherwise indicated, all Content made available by Eclipse.org\n\
-is provided to you under the terms and conditions of the Common Public\n\
-License Version 1.0 ("CPL"). A copy of the CPL is provided with this\n\
-Content and is also available at http://www.eclipse.org/legal/cpl-v10.html.\n\
-For purposes of the CPL, "Program" will mean the Content.\n\
-\n\
-Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse.org CVS\n\
-repository ("Repository") in CVS modules ("Modules") and made available\n\
-as downloadable archives ("Downloads").\n\
-\n\
-Content may be apportioned into plug-ins ("Plug-ins"), plug-in fragments\n\
-("Fragments"), and features ("Features"). A Feature is a bundle of one or\n\
-more Plug-ins and/or Fragments and associated material. Files named\n\
-"feature.xml" may contain a list of the names and version numbers of the\n\
-Plug-ins and/or Fragments associated with a Feature. Plug-ins and Fragments\n\
-are located in directories named "plugins" and Features are located in\n\
-directories named "features".\n\
-\n\
-Features may also include other Features ("Included Features"). Files named\n\
-"feature.xml" may contain a list of the names and version numbers of\n\
-Included Features.\n\
-\n\
-The terms and conditions governing Plug-ins and Fragments should be\n\
-contained in files named "about.html" ("Abouts"). The terms and\n\
-conditions governing Features and Included Features should be contained\n\
-in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
-Licenses may be located in any directory of a Download or Module\n\
-including, but not limited to the following locations:\n\
-\n\
-   - The top-level (root) directory\n\
-   - Plug-in and Fragment directories\n\
-   - Subdirectories of the directory named "src" of certain Plug-ins\n\
-   - Feature directories\n\
-\n\
-Note: if a Feature made available by Eclipse.org is installed using the\n\
-Eclipse Update Manager, you must agree to a license ("Feature Update\n\
-License") during the installation process. If the Feature contains\n\
-Included Features, the Feature Update License should either provide you\n\
-with the terms and conditions governing the Included Features or inform\n\
-you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties". Such Abouts,\n\
-Feature Licenses and Feature Update Licenses contain the terms and\n\
-conditions (or references to such terms and conditions) that govern your\n\
-use of the associated Content in that directory. The Abouts, Feature\n\
-Licenses and Feature Update Licenses may refer to the CPL or other\n\
-license agreements, notices or terms and conditions . It is your\n\
-obligation to read and accept all such all terms and conditions prior\n\
-to use of the Content. If no About, Feature License or Feature Update\n\
-License is provided, please contact Eclipse.org to determine what terms\n\
-and conditions govern that particular Content.\n\
-\n\
-Content may contain encryption software. The country in which you are\n\
-currently may have restrictions on the import, possession, and use,\n\
-and/or re-export to another country, of encryption software. BEFORE\n\
-using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use,\n\
-and re-export of encryption software, to see if this is permitted.\n
-########### end of license property ##########################################
diff --git a/features/org.eclipse.sdk.examples-feature/feature.xml b/features/org.eclipse.sdk.examples-feature/feature.xml
deleted file mode 100644
index d396d66..0000000
--- a/features/org.eclipse.sdk.examples-feature/feature.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-	  id="org.eclipse.sdk.examples"
-      label="%featureName"
-      version="2.1.1"
-      image= "eclipse_update_120.jpg"
-      provider-name="%providerName">
-      
-   <description>
-      %description
-   </description>
-
-   <license url="%licenseURL">
-     %license
-   </license>
-
-   <url>
-      <update
-         url="http://update.eclipse.org/updates"
-         label="%updateSiteName">
-      </update>
-   </url>
-
-   <requires>
-      <import plugin="org.eclipse.jdt" version="2.1.1" match="compatible"/>
-      <import plugin="org.eclipse.platform" version="2.1.1" match="compatible"/>
-   </requires>
-
-   <plugin id="org.eclipse.sdk.examples" version="2.1.1"/>
- 
-   <plugin id="org.eclipse.compare.examples" version="2.1.0"/>
-   <plugin id="org.eclipse.help.examples.ex1" version="2.1.0"/>
-   <plugin id="org.eclipse.jdt.ui.examples.projects" version="2.1.0"/>
-   <plugin id="org.eclipse.swt.examples" version="2.1.0"/>
-   <plugin id="org.eclipse.swt.examples.controls" version="2.1.0"/>
-   <plugin id="org.eclipse.swt.examples.launcher" version="2.1.0"/>
-   <plugin id="org.eclipse.swt.examples.layouts" version="2.1.0"/>
-   <plugin id="org.eclipse.swt.examples.paint" version="2.1.0"/>
-   <plugin id="org.eclipse.ui.examples.javaeditor" version="2.1.0"/>
-   <plugin id="org.eclipse.ui.examples.multipageeditor" version="2.1.0"/>
-   <plugin id="org.eclipse.ui.examples.propertysheet" version="2.1.0"/>
-   <plugin id="org.eclipse.ui.examples.readmetool" version="2.1.0"/>
-   <plugin id="org.eclipse.team.examples.filesystem" version="2.1.0"/>
-</feature>
diff --git a/features/org.eclipse.sdk.examples-feature/license.html b/features/org.eclipse.sdk.examples-feature/license.html
deleted file mode 100644
index 00d784b..0000000
--- a/features/org.eclipse.sdk.examples-feature/license.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-<title>Eclipse.org Software User Agreement</title>
-</head>
-
-<body lang="EN-US" link=blue vlink=purple>
-<h2>Eclipse.org Software User Agreement</h2>
-<p>17th June, 2002</p>
-
-<p>ECLIPSE.ORG MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-
-<p>Unless otherwise indicated, all Content made available by Eclipse.org is provided to you under the terms and conditions of the Common Public License Version 1.0
-   (&quot;CPL&quot;).  A copy of the CPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>.
-   For purposes of the CPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
-   modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-
-<p>Content may be apportioned into plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;). A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Files named &quot;feature.xml&quot; may contain a list of the names and version numbers of  the Plug-ins and/or Fragments associated with a Feature.   Plug-ins and Fragments are located in directories
-   named &quot;plugins&quot; and Features are located in directories named &quot;features&quot;.</p>
-  
-<p>Features may also include other Features (&quot;Included Features&quot;). Files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</p>
-  
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;). Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-	<li>The top-level (root) directory</li>
-	<li>Plug-in and Fragment directories</li>
-	<li>Subdirectories of the directory named &quot;src&quot; of certain Plug-ins</li>
-	<li>Feature directories</li>
-</ul>
-		
-<p>Note: if a Feature made available by Eclipse.org is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them. Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot;.
-Such Abouts, Feature Licenses and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.  The Abouts, Feature Licenses and Feature Update Licenses may refer to the CPL or other license agreements, notices or terms and conditions . It is your obligation to read and accept all such all terms and conditions prior to use of the Content.
-If no About, Feature License or Feature Update License is provided, please contact Eclipse.org to determine what terms and conditions govern that particular Content.</p>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-</body>
-</html>
